Version 16.153

This commit is contained in:
Antonio Cañas Vargas 2017-03-08 03:48:23 +01:00
parent 45929a7164
commit cc988bb840
14 changed files with 168 additions and 145 deletions

View File

@ -204,13 +204,14 @@
/****************************** Public constants *****************************/
/*****************************************************************************/
#define Log_PLATFORM_VERSION "SWAD 16.152 (2017-03-07)"
#define Log_PLATFORM_VERSION "SWAD 16.153 (2017-03-08)"
#define CSS_FILE "swad16.147.css"
#define JS_FILE "swad16.144.js"
// Number of lines (includes comments but not blank lines) has been got with the following command:
// nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*?.h sql/swad*.sql | tail -1
/*
Version 16.153: Mar 08, 2017 Code refactoring related to number of chars and bytes. (216450 lines)
Version 16.152: Mar 07, 2017 Code refactoring related to number of chars and bytes. (216428 lines)
Version 16.151: Mar 07, 2017 Code refactoring related to number of chars and bytes. (216422 lines)
Version 16.150: Mar 07, 2017 Code refactoring related to number of chars and bytes. (216409 lines)

View File

@ -630,7 +630,7 @@ struct Globals
TT_ClassType_t ClassType;
unsigned Duration;
char Place[TT_MAX_BYTES_PLACE + 1];
char Group[TT_MAX_BYTES_GROUP + 1];
char Group[Grp_MAX_BYTES_GROUP_NAME + 1];
long GrpCod; // Group code (-1 if no group selected)
struct
{

View File

@ -1100,8 +1100,18 @@ void Str_ChangeFormat (Str_ChangeFrom_t ChangeFrom,Str_ChangeTo_t ChangeTo,
LengthSpecStrSrc = 1;
SpecialChar = 0x20;
break;
case '%': /* Change "%XX" --> "&#decimal_number;" */
case '%': /* Change "%XX" --> "&#decimal_number;" (from 0 to 255) */
IsSpecialChar = true;
/* Some special characters, like a chinese character,
are received from a form in a format like this:
%26%2335753%3B --> %26 %23 3 5 7 5 3 %3B --> 让
^ ^ ^
| | |
SpecialChar SpecialChar SpecialChar
Here one chinese character is converted
to 2 special chars + 5 normal chars + 1 special char,
and finally is stored as the following 8 bytes: 让
*/
sscanf (PtrSrc + 1,"%2X",&SpecialChar);
LengthSpecStrSrc = 3;
break;
@ -1226,7 +1236,7 @@ void Str_ChangeFormat (Str_ChangeFrom_t ChangeFrom,Str_ChangeTo_t ChangeTo,
ThereIsSpaceChar = false;
break;
case 0x23: /* "%23" --> "#" */
StrSpecialChar[0] = '#';
StrSpecialChar[0] = '#'; // '#' must be converted to '#' to allow HTML entities like 分
StrSpecialChar[1] = '\0';
NumPrintableCharsFromReturn++;
ThereIsSpaceChar = false;
@ -1268,7 +1278,7 @@ void Str_ChangeFormat (Str_ChangeFrom_t ChangeFrom,Str_ChangeTo_t ChangeTo,
ThereIsSpaceChar = false;
break;
case 0x3B: /* "%3B" --> ";" */
StrSpecialChar[0] = ';';
StrSpecialChar[0] = ';'; // ';' must be converted to ';' to allow HTML entities like 分
StrSpecialChar[1] = '\0';
NumPrintableCharsFromReturn++;
ThereIsSpaceChar = false;

View File

@ -34,11 +34,24 @@
/*****************************************************************************/
/***************************** Public constants *****************************/
/*****************************************************************************/
/*
Some special characters, like a chinese character,
are received from a form in a format like this:
%26%2335753%3B --> %26 %23 3 5 7 5 3 %3B --> 让
^ ^ ^
| | |
SpecialChar SpecialChar SpecialChar
Here one chinese character is converted
to 2 special chars + 5 normal chars + 1 special char,
and finally is stored as the following 8 bytes: 让
#define Str_BYTES_STR_HEX 3 // Number of bytes of the string %XX
#define Str_MAX_BYTES_SPEC_CHAR_HTML 10 // Number of bytes of the string from � to max UTF8  (= )
#define Str_MAX_BYTES_PER_CHAR 10 // max (Str_BYTES_STR_HEX,Str_MAX_BYTES_SPEC_CHAR_HTML)
The maximum UTF-8 code is 1114111 or 0x10FFFF.
So, when read from form, a character may be read temporarily as %26%231114111%3B (16 bytes)
Then it may be transformed to  (10 bytes)
So, each char from a form may be transformed finally into a sequence of 1 to 10 bytes,
but temporarily it may need 16 bytes
*/
#define Str_MAX_BYTES_PER_CHAR 16 // Maximum number of bytes of a char
/*****************************************************************************/
/******************************* Public types *******************************/

View File

@ -49,9 +49,10 @@ extern struct Globals Gbl;
/***************************** Private constants *****************************/
/*****************************************************************************/
#define Svy_MAX_LENGTH_ANSWER 1000
#define Svy_MAX_BYTES_ANSWER (Svy_MAX_LENGTH_ANSWER * Str_MAX_BYTES_PER_CHAR)
#define Svy_MAX_BYTES_LIST_ANSWER_TYPES (10 + (Svy_NUM_ANS_TYPES - 1) * (1 + 10))
#define Svy_MAX_CHARS_ANSWER 1000
#define Svy_MAX_BYTES_ANSWER (Svy_MAX_CHARS_ANSWER * Str_MAX_BYTES_PER_CHAR)
#define Svy_MAX_BYTES_LIST_ANSWER_TYPES (10 + (Svy_NUM_ANS_TYPES - 1) * (1 + 10))
const char *Svy_StrAnswerTypesDB[Svy_NUM_ANS_TYPES] =
{
@ -1202,7 +1203,7 @@ void Svy_GetDataOfSurveyByCod (struct Survey *Svy)
/* Get the title of the survey (row[9]) */
Str_Copy (Svy->Title,row[9],
Svy_MAX_LENGTH_SURVEY_TITLE);
Svy_MAX_BYTES_SURVEY_TITLE);
/* Get number of questions and number of users who have already answer this survey */
Svy->NumQsts = Svy_GetNumQstsSvy (Svy->SvyCod);
@ -1842,7 +1843,7 @@ void Svy_RequestCreatOrEditSvy (void)
"</tr>",
The_ClassForm[Gbl.Prefs.Theme],
Txt_Title,
Svy_MAX_LENGTH_SURVEY_TITLE,Svy.Title);
Svy_MAX_CHARS_SURVEY_TITLE,Svy.Title);
/***** Survey start and end dates *****/
Dat_PutFormStartEndClientLocalDateTimes (Svy.TimeUTC,Dat_FORM_SECONDS_ON);
@ -2128,7 +2129,7 @@ void Svy_RecFormSurvey (void)
NewSvy.TimeUTC[Dat_END_TIME ] = Dat_GetTimeUTCFromForm ("EndTimeUTC" );
/***** Get survey title *****/
Par_GetParToText ("Title",NewSvy.Title,Svy_MAX_LENGTH_SURVEY_TITLE);
Par_GetParToText ("Title",NewSvy.Title,Svy_MAX_BYTES_SURVEY_TITLE);
/***** Get survey text and insert links *****/
Par_GetParToHTML ("Txt",Txt,Cns_MAX_BYTES_TEXT); // Store in HTML format (not rigorous)
@ -3319,7 +3320,7 @@ static void Svy_WriteQstStem (const char *Stem)
size_t Length;
/* Convert the stem, that is in HTML, to rigorous HTML */
Length = strlen (Stem) * Str_MAX_BYTES_SPEC_CHAR_HTML;
Length = strlen (Stem) * Str_MAX_BYTES_PER_CHAR;
if ((HeadingRigorousHTML = malloc (Length + 1)) == NULL)
Lay_ShowErrorAndExit ("Not enough memory to store stem of question.");
Str_Copy (HeadingRigorousHTML,Stem,

View File

@ -33,7 +33,8 @@
/************************** Public types and constants ***********************/
/*****************************************************************************/
#define Svy_MAX_LENGTH_SURVEY_TITLE (256 - 1)
#define Svy_MAX_CHARS_SURVEY_TITLE (256 - 1)
#define Svy_MAX_BYTES_SURVEY_TITLE (Svy_MAX_CHARS_SURVEY_TITLE * Str_MAX_BYTES_PER_CHAR)
#define Svy_NUM_DATES 2
typedef enum
@ -49,7 +50,7 @@ struct Survey
long Cod; // Country, institution, centre, degree or course code
unsigned Roles; // Example: if survey can be made by students and teachers, Roles == (1 << Rol_ROLE_STUDENT) | (1 << Rol_ROLE_TEACHER)
long UsrCod;
char Title[Svy_MAX_LENGTH_SURVEY_TITLE + 1];
char Title[Svy_MAX_BYTES_SURVEY_TITLE + 1];
time_t TimeUTC[Svy_NUM_DATES];
unsigned NumQsts; // Number of questions in the survey
unsigned NumUsrs; // Number of distinct users who have already answered the survey

View File

@ -53,10 +53,10 @@ extern struct Globals Gbl;
#define Syl_MAX_LEVELS_SYLLABUS 10
#define Syl_MAX_LENGTH_ITEM_COD (Syl_MAX_LEVELS_SYLLABUS * (10 + 1) - 1)
#define Syl_MAX_BYTES_ITEM_COD (Syl_MAX_LEVELS_SYLLABUS * (10 + 1) - 1)
#define Syl_MAX_LENGTH_TEXT_ITEM 1024
#define Syl_MAX_BYTES_TEXT_ITEM (Syl_MAX_LENGTH_TEXT_ITEM*Str_MAX_BYTES_PER_CHAR)
#define Syl_MAX_CHARS_TEXT_ITEM 1000
#define Syl_MAX_BYTES_TEXT_ITEM (Syl_MAX_CHARS_TEXT_ITEM * Str_MAX_BYTES_PER_CHAR)
#define Syl_WIDTH_NUM_SYLLABUS 20
@ -948,7 +948,7 @@ static void Syl_PutFormItemSyllabus (bool NewItem,unsigned NumItem,int Level,int
fprintf (Gbl.F.Out,"<input type=\"text\" name=\"Txt\""
" size=\"80\" maxlength=\"%u\" value=\"%s\""
" placeholder=\"%s\"",
Syl_MAX_LENGTH_TEXT_ITEM,Text,
Syl_MAX_CHARS_TEXT_ITEM,Text,
Txt_Enter_a_new_item_here);
if (NewItem)
fprintf (Gbl.F.Out," autofocus=\"autofocus\"");
@ -987,14 +987,14 @@ static void Syl_WriteNumItem (char *StrDst,FILE *FileTgt,int Level,int *CodItem)
{
if (StrDst)
Str_Concat (StrDst,".",
Syl_MAX_LENGTH_ITEM_COD);
Syl_MAX_BYTES_ITEM_COD);
if (FileTgt)
fprintf (FileTgt,".");
}
sprintf (InStr,"%d",CodItem[N]);
if (StrDst)
Str_Concat (StrDst,InStr,
Syl_MAX_LENGTH_ITEM_COD);
Syl_MAX_BYTES_ITEM_COD);
if (FileTgt)
fprintf (FileTgt,"%s",InStr);
}

View File

@ -53,7 +53,7 @@
/***************************** Public constants ******************************/
/*****************************************************************************/
// strings are limited to Tst_MAX_LENGTH_FEEDBACK_TYPE characters
// strings are limited to Tst_MAX_BYTES_FEEDBACK_TYPE bytes
const char *Tst_FeedbackXML[Tst_NUM_TYPES_FEEDBACK] =
{
"nothing",
@ -63,7 +63,7 @@ const char *Tst_FeedbackXML[Tst_NUM_TYPES_FEEDBACK] =
"fullFeedback",
};
// strings are limited to Tst_MAX_LENGTH_ANSWER_TYPE characters
// strings are limited to Tst_MAX_BYTES_ANSWER_TYPE characters
const char *Tst_StrAnswerTypesXML[Tst_NUM_ANS_TYPES] =
{
"int",
@ -1020,7 +1020,7 @@ void Tst_WriteQstStem (const char *Stem,const char *ClassStem)
char *StemRigorousHTML;
/***** Convert the stem, that is in HTML, to rigorous HTML *****/
StemLength = strlen (Stem) * Str_MAX_BYTES_SPEC_CHAR_HTML;
StemLength = strlen (Stem) * Str_MAX_BYTES_PER_CHAR;
if ((StemRigorousHTML = malloc (StemLength + 1)) == NULL)
Lay_ShowErrorAndExit ("Not enough memory to store stem of question.");
Str_Copy (StemRigorousHTML,Stem,
@ -1150,7 +1150,7 @@ void Tst_WriteQstFeedback (const char *Feedback,const char *ClassFeedback)
if (Feedback[0])
{
/***** Convert the feedback, that is in HTML, to rigorous HTML *****/
FeedbackLength = strlen (Feedback) * Str_MAX_BYTES_SPEC_CHAR_HTML;
FeedbackLength = strlen (Feedback) * Str_MAX_BYTES_PER_CHAR;
if ((FeedbackRigorousHTML = malloc (FeedbackLength + 1)) == NULL)
Lay_ShowErrorAndExit ("Not enough memory to store stem of question.");
Str_Copy (FeedbackRigorousHTML,Feedback,
@ -1737,7 +1737,7 @@ static void Tst_ShowFormEditTags (void)
fprintf (Gbl.F.Out,"<input type=\"text\" name=\"NewTagTxt\""
" size=\"36\" maxlength=\"%u\" value=\"%s\""
" onchange=\"document.getElementById('%s').submit();\" />",
Tst_MAX_LENGTH_TAG,row[1],Gbl.Form.Id);
Tst_MAX_CHARS_TAG,row[1],Gbl.Form.Id);
Act_FormEnd ();
fprintf (Gbl.F.Out,"</td>"
"</tr>");
@ -2323,13 +2323,13 @@ void Tst_ListQuestionsToEdit (void)
/********** Get from the database several test questions for listing *********/
/*****************************************************************************/
#define Tst_MAX_LENGTH_QUERY_TEST (16 * 1024 - 1)
#define Tst_MAX_BYTES_QUERY_TEST (16 * 1024 - 1)
static unsigned long Tst_GetQuestionsForEdit (MYSQL_RES **mysql_res)
{
extern const char *Txt_No_questions_found_matching_your_search_criteria;
unsigned long NumRows;
char Query[Tst_MAX_LENGTH_QUERY_TEST + 1];
char Query[Tst_MAX_BYTES_QUERY_TEST + 1];
long LengthQuery;
unsigned NumItemInList;
const char *Ptr;
@ -2367,25 +2367,25 @@ static unsigned long Tst_GetQuestionsForEdit (MYSQL_RES **mysql_res)
" FROM tst_questions");
if (!Gbl.Test.Tags.All)
Str_Concat (Query,",tst_question_tags,tst_tags",
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
Str_Concat (Query," WHERE tst_questions.CrsCod='",
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
sprintf (CrsCodStr,"%ld",Gbl.CurrentCrs.Crs.CrsCod);
Str_Concat (Query,CrsCodStr,
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
Str_Concat (Query,"' AND tst_questions.EditTime>=FROM_UNIXTIME('",
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
sprintf (LongStr,"%ld",(long) Gbl.DateRange.TimeUTC[0]);
Str_Concat (Query,LongStr,
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
Str_Concat (Query,"') AND tst_questions.EditTime<=FROM_UNIXTIME('",
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
sprintf (LongStr,"%ld",(long) Gbl.DateRange.TimeUTC[1]);
Str_Concat (Query,LongStr,
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
Str_Concat (Query,"')",
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
/* Add the tags selected */
if (!Gbl.Test.Tags.All)
@ -2393,11 +2393,11 @@ static unsigned long Tst_GetQuestionsForEdit (MYSQL_RES **mysql_res)
Str_Concat (Query," AND tst_questions.QstCod=tst_question_tags.QstCod"
" AND tst_question_tags.TagCod=tst_tags.TagCod"
" AND tst_tags.CrsCod='",
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
Str_Concat (Query,CrsCodStr,
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
Str_Concat (Query,"'",
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
LengthQuery = strlen (Query);
NumItemInList = 0;
Ptr = Gbl.Test.Tags.List;
@ -2405,20 +2405,20 @@ static unsigned long Tst_GetQuestionsForEdit (MYSQL_RES **mysql_res)
{
Par_GetNextStrUntilSeparParamMult (&Ptr,TagText,Tst_MAX_BYTES_TAG);
LengthQuery = LengthQuery + 35 + strlen (TagText) + 1;
if (LengthQuery > Tst_MAX_LENGTH_QUERY_TEST - 256)
if (LengthQuery > Tst_MAX_BYTES_QUERY_TEST - 256)
Lay_ShowErrorAndExit ("Query size exceed.");
Str_Concat (Query,
NumItemInList ? " OR tst_tags.TagTxt='" :
" AND (tst_tags.TagTxt='",
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
Str_Concat (Query,TagText,
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
Str_Concat (Query,"'",
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
NumItemInList++;
}
Str_Concat (Query,")",
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
}
/* Add the types of answer selected */
@ -2432,53 +2432,53 @@ static unsigned long Tst_GetQuestionsForEdit (MYSQL_RES **mysql_res)
Par_GetNextStrUntilSeparParamMult (&Ptr,UnsignedStr,Tst_MAX_BYTES_TAG);
AnsType = Tst_ConvertFromUnsignedStrToAnsTyp (UnsignedStr);
LengthQuery = LengthQuery + 35 + strlen (Tst_StrAnswerTypesDB[AnsType]) + 1;
if (LengthQuery > Tst_MAX_LENGTH_QUERY_TEST - 256)
if (LengthQuery > Tst_MAX_BYTES_QUERY_TEST - 256)
Lay_ShowErrorAndExit ("Query size exceed.");
Str_Concat (Query,
NumItemInList ? " OR tst_questions.AnsType='" :
" AND (tst_questions.AnsType='",
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
Str_Concat (Query,Tst_StrAnswerTypesDB[AnsType],
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
Str_Concat (Query,"'",
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
NumItemInList++;
}
Str_Concat (Query,")",
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
}
/* End the query */
Str_Concat (Query," GROUP BY tst_questions.QstCod",
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
switch (Gbl.Test.SelectedOrder)
{
case Tst_ORDER_STEM:
Str_Concat (Query," ORDER BY tst_questions.Stem",
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
break;
case Tst_ORDER_NUM_HITS:
Str_Concat (Query," ORDER BY tst_questions.NumHits DESC,"
"tst_questions.Stem",
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
break;
case Tst_ORDER_AVERAGE_SCORE:
Str_Concat (Query," ORDER BY tst_questions.Score/tst_questions.NumHits DESC,"
"tst_questions.NumHits DESC,"
"tst_questions.Stem",
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
break;
case Tst_ORDER_NUM_HITS_NOT_BLANK:
Str_Concat (Query," ORDER BY tst_questions.NumHitsNotBlank DESC,"
"tst_questions.Stem",
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
break;
case Tst_ORDER_AVERAGE_SCORE_NOT_BLANK:
Str_Concat (Query," ORDER BY tst_questions.Score/tst_questions.NumHitsNotBlank DESC,"
"tst_questions.NumHitsNotBlank DESC,"
"tst_questions.Stem",
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
break;
}
@ -2497,7 +2497,7 @@ static unsigned long Tst_GetQuestionsForEdit (MYSQL_RES **mysql_res)
static unsigned long Tst_GetQuestionsForTest (MYSQL_RES **mysql_res)
{
char Query[Tst_MAX_LENGTH_QUERY_TEST + 1];
char Query[Tst_MAX_BYTES_QUERY_TEST + 1];
long LengthQuery;
unsigned NumItemInList;
const char *Ptr;
@ -2558,20 +2558,20 @@ static unsigned long Tst_GetQuestionsForTest (MYSQL_RES **mysql_res)
{
Par_GetNextStrUntilSeparParamMult (&Ptr,TagText,Tst_MAX_BYTES_TAG);
LengthQuery = LengthQuery + 35 + strlen (TagText) + 1;
if (LengthQuery > Tst_MAX_LENGTH_QUERY_TEST - 128)
if (LengthQuery > Tst_MAX_BYTES_QUERY_TEST - 128)
Lay_ShowErrorAndExit ("Query size exceed.");
Str_Concat (Query,
NumItemInList ? " OR tst_tags.TagTxt='" :
" AND (tst_tags.TagTxt='",
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
Str_Concat (Query,TagText,
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
Str_Concat (Query,"'",
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
NumItemInList++;
}
Str_Concat (Query,")",
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
}
/* Add answer types selected */
@ -2585,28 +2585,28 @@ static unsigned long Tst_GetQuestionsForTest (MYSQL_RES **mysql_res)
Par_GetNextStrUntilSeparParamMult (&Ptr,UnsignedStr,Tst_MAX_BYTES_TAG);
AnsType = Tst_ConvertFromUnsignedStrToAnsTyp (UnsignedStr);
LengthQuery = LengthQuery + 35 + strlen (Tst_StrAnswerTypesDB[AnsType]) + 1;
if (LengthQuery > Tst_MAX_LENGTH_QUERY_TEST - 128)
if (LengthQuery > Tst_MAX_BYTES_QUERY_TEST - 128)
Lay_ShowErrorAndExit ("Query size exceed.");
Str_Concat (Query,
NumItemInList ? " OR tst_questions.AnsType='" :
" AND (tst_questions.AnsType='",
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
Str_Concat (Query,Tst_StrAnswerTypesDB[AnsType],
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
Str_Concat (Query,"'",
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
NumItemInList++;
}
Str_Concat (Query,")",
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
}
/* End query */
Str_Concat (Query," ORDER BY RAND(NOW()) LIMIT ",
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
sprintf (StrNumQsts,"%u",Gbl.Test.NumQsts);
Str_Concat (Query,StrNumQsts,
Tst_MAX_LENGTH_QUERY_TEST);
Tst_MAX_BYTES_QUERY_TEST);
/*
if (Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM)
Lay_ShowAlert (Lay_INFO,Query);
@ -3062,7 +3062,7 @@ static void Tst_WriteAnswersOfAQstEdit (long QstCod)
row = mysql_fetch_row (mysql_res);
/* Convert the answer (row[1]), that is in HTML, to rigorous HTML */
LengthAnswer = strlen (row[1]) * Str_MAX_BYTES_SPEC_CHAR_HTML;
LengthAnswer = strlen (row[1]) * Str_MAX_BYTES_PER_CHAR;
if ((Answer = malloc (LengthAnswer + 1)) == NULL)
Lay_ShowErrorAndExit ("Not enough memory to store answer.");
Str_Copy (Answer,row[1],
@ -3076,7 +3076,7 @@ static void Tst_WriteAnswersOfAQstEdit (long QstCod)
if (row[2])
if (row[2][0])
{
LengthFeedback = strlen (row[2]) * Str_MAX_BYTES_SPEC_CHAR_HTML;
LengthFeedback = strlen (row[2]) * Str_MAX_BYTES_PER_CHAR;
if ((Feedback = malloc (LengthFeedback + 1)) == NULL)
Lay_ShowErrorAndExit ("Not enough memory to store feedback.");
Str_Copy (Feedback,row[2],
@ -4556,7 +4556,7 @@ static void Tst_PutFormEditOneQst (char Stem[Cns_MAX_BYTES_TEXT + 1],
" class=\"TAG_TXT\" maxlength=\"%u\" value=\"%s\""
" onchange=\"changeSelTag('%u')\" />"
"</td>",
NumTag,NumTag,Tst_MAX_LENGTH_TAG,Gbl.Test.Tags.Txt[NumTag],NumTag);
NumTag,NumTag,Tst_MAX_CHARS_TAG,Gbl.Test.Tags.Txt[NumTag],NumTag);
fprintf (Gbl.F.Out,"</tr>");
}
@ -5373,7 +5373,8 @@ static void Tst_GetQstFromForm (char *Stem,char *Feedback)
/* Get answer */
sprintf (AnsStr,"AnsStr%u",NumOpt);
Par_GetParToHTML (AnsStr,Gbl.Test.Answer.Options[NumOpt].Text,Tst_MAX_BYTES_ANSWER_OR_FEEDBACK);
Par_GetParToHTML (AnsStr,Gbl.Test.Answer.Options[NumOpt].Text,
Tst_MAX_BYTES_ANSWER_OR_FEEDBACK);
if (Gbl.Test.AnswerType == Tst_ANS_TEXT)
/* In order to compare student answer to stored answer,
the text answers are stored avoiding two or more consecurive spaces */
@ -5381,7 +5382,8 @@ static void Tst_GetQstFromForm (char *Stem,char *Feedback)
/* Get feedback */
sprintf (FbStr,"FbStr%u",NumOpt);
Par_GetParToHTML (FbStr,Gbl.Test.Answer.Options[NumOpt].Feedback,Tst_MAX_BYTES_ANSWER_OR_FEEDBACK);
Par_GetParToHTML (FbStr,Gbl.Test.Answer.Options[NumOpt].Feedback,
Tst_MAX_BYTES_ANSWER_OR_FEEDBACK);
/* Get image associated to the answer (action, file and title) */
if (Gbl.Test.AnswerType == Tst_ANS_UNIQUE_CHOICE ||

View File

@ -31,25 +31,28 @@
/***************************** Public constants ******************************/
/*****************************************************************************/
#define Tst_SCORE_MAX 10 // Maximum score of a test (10 in Spain). Must be unsigned! // TODO: Make this configurable by teachers
#define Tst_SCORE_MAX 10 // Maximum score of a test (10 in Spain). Must be unsigned! // TODO: Make this configurable by teachers
#define Tst_MAX_QUESTIONS_PER_TEST 100 // Absolute maximum number of questions in a test
#define Tst_MAX_TAGS_PER_QUESTION 5
#define Tst_MAX_LENGTH_TAG (256 -1)
#define Tst_MAX_BYTES_TAG (Tst_MAX_LENGTH_TAG*Str_MAX_BYTES_PER_CHAR)
#define Tst_MAX_OPTIONS_PER_QUESTION 10
#define Tst_MAX_QUESTIONS_PER_TEST 100 // Absolute maximum number of questions in a test
#define Tst_MAX_TAGS_PER_QUESTION 5
#define Tst_MAX_CHARS_TAG (128 - 1)
#define Tst_MAX_BYTES_TAG (Tst_MAX_CHARS_TAG * Str_MAX_BYTES_PER_CHAR)
#define Tst_MAX_OPTIONS_PER_QUESTION 10
#define Tst_MAX_SIZE_INDEXES_ONE_QST (Tst_MAX_OPTIONS_PER_QUESTION * (10 + 1))
#define Tst_MAX_SIZE_ANSWERS_ONE_QST (Tst_MAX_OPTIONS_PER_QUESTION * (10 + 1))
#define Tst_MAX_LENGTH_ANSWER 1000
#define Tst_MAX_BYTES_ANSWER_OR_FEEDBACK (Tst_MAX_LENGTH_ANSWER*Str_MAX_BYTES_PER_CHAR)
#define Tst_MAX_CHARS_ANSWER_OR_FEEDBACK 1000
#define Tst_MAX_BYTES_ANSWER_OR_FEEDBACK (Tst_MAX_CHARS_ANSWER_OR_FEEDBACK * Str_MAX_BYTES_PER_CHAR)
#define Tst_CONFIG_DEFAULT_MIN_QUESTIONS 1
#define Tst_CONFIG_DEFAULT_DEF_QUESTIONS 20 // Number of questions to be generated by default in a self-assessment test
#define Tst_CONFIG_DEFAULT_MAX_QUESTIONS 30 // Maximum number of questions to be generated in a self-assessment test
#define Tst_CONFIG_DEFAULT_MIN_QUESTIONS 1
#define Tst_CONFIG_DEFAULT_DEF_QUESTIONS 20 // Number of questions to be generated by default in a self-assessment test
#define Tst_CONFIG_DEFAULT_MAX_QUESTIONS 30 // Maximum number of questions to be generated in a self-assessment test
#define Tst_MAX_LENGTH_FEEDBACK_TYPE 32
#define Tst_MAX_LENGTH_ANSWER_TYPE 32
#define Tst_MAX_BYTES_FEEDBACK_TYPE 32
#define Tst_MAX_BYTES_ANSWER_TYPE 32
/*****************************************************************************/

View File

@ -1123,7 +1123,7 @@ static void TsI_WriteRowImportedQst (struct XMLElement *StemElem,
{
/* Convert the answer, that is in HTML, to rigorous HTML */
AnswerTextLength = strlen (Gbl.Test.Answer.Options[NumOpt].Text) *
Str_MAX_BYTES_SPEC_CHAR_HTML;
Str_MAX_BYTES_PER_CHAR;
if ((AnswerText = malloc (AnswerTextLength + 1)) == NULL)
Lay_ShowErrorAndExit ("Not enough memory to store answer.");
Str_Copy (AnswerText,Gbl.Test.Answer.Options[NumOpt].Text,
@ -1138,7 +1138,7 @@ static void TsI_WriteRowImportedQst (struct XMLElement *StemElem,
if (Gbl.Test.Answer.Options[NumOpt].Feedback[0])
{
AnswerFeedbackLength = strlen (Gbl.Test.Answer.Options[NumOpt].Feedback) *
Str_MAX_BYTES_SPEC_CHAR_HTML;
Str_MAX_BYTES_PER_CHAR;
if ((AnswerFeedback = malloc (AnswerFeedbackLength + 1)) == NULL)
Lay_ShowErrorAndExit ("Not enough memory to store feedback.");
Str_Copy (AnswerFeedback,

View File

@ -62,8 +62,7 @@ extern struct Globals Gbl;
#define TT_PERCENT_WIDTH_OF_AN_HOUR_COLUMN ((100 - TT_PERCENT_WIDTH_OF_ALL_DAYS - TT_PERCENT_WIDTH_OF_A_SEPARATION_COLUMN * 2) / 2) // Width (%) of the separation columns
#define TT_MAX_BYTES_STR_CLASS_TYPE 256
#define TT_MAX_BYTES_STR_DURATION (2 + 1 + 2 + 1 + 1) // "hh:mm h"
#define TT_MAX_LENGTH_PLACE 32
#define TT_MAX_BYTES_STR_DURATION 32 // "hh:mm h"
/*****************************************************************************/
/******************************* Internal types ******************************/
@ -100,7 +99,7 @@ struct TimeTableColumn
TT_ClassType_t ClassType;
unsigned Duration;
char Place[TT_MAX_BYTES_PLACE + 1];
char Group[TT_MAX_BYTES_GROUP + 1];
char Group[Grp_MAX_BYTES_GROUP_NAME + 1];
};
struct
{
@ -204,9 +203,6 @@ static void TT_GetParamsTimeTable (void)
Lay_ShowErrorAndExit ("Duration is missing.");
Gbl.TimeTable.Duration = Hours * 2 + Minutes / 30;
/***** Get group *****/
Par_GetParToText ("ModTTGrp",Gbl.TimeTable.Group,TT_MAX_BYTES_GROUP);
/***** Get group code *****/
Gbl.TimeTable.GrpCod = Par_GetParToLong ("ModTTGrpCod");
@ -742,7 +738,7 @@ static void TT_CreatTimeTableFromDB (long UsrCod)
Gbl.CurrentCrs.Crs.CrsCod);
Str_Copy (TimeTable[Day][Hour].Columns[FirstFreeColumn].Group,
row[5],
TT_MAX_BYTES_GROUP);
Grp_MAX_BYTES_GROUP_NAME);
TimeTable[Day][Hour].Columns[FirstFreeColumn].GrpCod = GrpCod;
// no break;
case TT_TUTOR_TIMETABLE:
@ -799,7 +795,7 @@ static void TT_ModifTimeTable (void)
TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.Hour].Columns[Gbl.TimeTable.Column].Duration = Gbl.TimeTable.Duration;
Str_Copy (TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.Hour].Columns[Gbl.TimeTable.Column].Group,
Gbl.TimeTable.Group,
TT_MAX_BYTES_GROUP);
Grp_MAX_BYTES_GROUP_NAME);
Str_Copy (TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.Hour].Columns[Gbl.TimeTable.Column].Place,
Gbl.TimeTable.Place,
TT_MAX_BYTES_PLACE);
@ -1278,8 +1274,6 @@ static void TT_TimeTableDrawCell (unsigned Day,unsigned Hour,unsigned Column,uns
else
fprintf (Gbl.F.Out,"0:30");
fprintf (Gbl.F.Out," h\" />");
Par_PutHiddenParamString ("ModTTGrp","");
Par_PutHiddenParamString ("ModTTPlace","");
}
else
{
@ -1302,7 +1296,7 @@ static void TT_TimeTableDrawCell (unsigned Day,unsigned Hour,unsigned Column,uns
fprintf (Gbl.F.Out,"<option");
if (Dur == Duration)
fprintf (Gbl.F.Out," selected=\"selected\"");
fprintf (Gbl.F.Out,">%d:%02d h</option>",
fprintf (Gbl.F.Out,">%u:%02u h</option>",
Dur / 2,
Dur % 2 ? 30 :
0);
@ -1349,11 +1343,10 @@ static void TT_TimeTableDrawCell (unsigned Day,unsigned Hour,unsigned Column,uns
" size=\"1\" maxlength=\"%u\" value=\"%s\""
" onchange=\"document.getElementById('%s').submit();\" />"
"</label>",
Txt_Classroom,TT_MAX_LENGTH_PLACE,Place,Gbl.Form.Id);
Txt_Classroom,TT_MAX_CHARS_PLACE,Place,Gbl.Form.Id);
}
else // TimeTableView == TT_TUT_EDIT
{
Par_PutHiddenParamString ("ModTTGrp","");
/***** Place *****/
fprintf (Gbl.F.Out,"<br />"
"<label class=\"DAT_SMALL\">"
@ -1362,7 +1355,7 @@ static void TT_TimeTableDrawCell (unsigned Day,unsigned Hour,unsigned Column,uns
" size=\"12\" maxlength=\"%u\" value=\"%s\""
" onchange=\"document.getElementById('%s').submit();\" />"
"</label>",
Txt_Place,TT_MAX_LENGTH_PLACE,Place,Gbl.Form.Id);
Txt_Place,TT_MAX_CHARS_PLACE,Place,Gbl.Form.Id);
}
}
break;

View File

@ -33,8 +33,8 @@
/************************* Public constants and types ************************/
/*****************************************************************************/
#define TT_MAX_BYTES_PLACE (128 - 1)
#define TT_MAX_BYTES_GROUP (256 - 1)
#define TT_MAX_CHARS_PLACE 32
#define TT_MAX_BYTES_PLACE (TT_MAX_CHARS_PLACE * Str_MAX_BYTES_PER_CHAR)
#define TT_NUM_TIMETABLE_TYPES 3
typedef enum

View File

@ -96,7 +96,7 @@ const char *Usr_IconsClassPhotoOrList[Usr_NUM_USR_LIST_TYPES] =
#define Usr_NUM_ALL_FIELDS_DATA_TCH 11
const char *Usr_UsrDatMainFieldNames[Usr_NUM_MAIN_FIELDS_DATA_USR];
#define Usr_MAX_LENGTH_QUERY_GET_LIST_USRS (16 * 1024 - 1)
#define Usr_MAX_BYTES_QUERY_GET_LIST_USRS (16 * 1024 - 1)
/*****************************************************************************/
/****************************** Internal types *******************************/
@ -148,7 +148,7 @@ static void Usr_WriteUsrData (const char *BgColor,
bool NonBreak,bool Accepted);
static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role,
char Query[Usr_MAX_LENGTH_QUERY_GET_LIST_USRS + 1]);
char Query[Usr_MAX_BYTES_QUERY_GET_LIST_USRS + 1]);
static void Usr_GetAdmsLst (Sco_Scope_t Scope);
static void Usr_GetGstsLst (Sco_Scope_t Scope);
@ -3120,14 +3120,14 @@ static void Usr_InsertMyLastData (void)
/*********** Write a row of a table with the main data of a user *************/
/*****************************************************************************/
#define Usr_MAX_LENGTH_BG_COLOR (16 - 1)
#define Usr_MAX_BYTES_BG_COLOR (16 - 1)
void Usr_WriteRowUsrMainData (unsigned NumUsr,struct UsrData *UsrDat,
bool PutCheckBoxToSelectUsr)
{
extern const char *Txt_Enrollment_confirmed;
extern const char *Txt_Enrollment_not_confirmed;
char BgColor[Usr_MAX_LENGTH_BG_COLOR + 1];
char BgColor[Usr_MAX_BYTES_BG_COLOR + 1];
char PhotoURL[PATH_MAX + 1];
bool ShowPhoto;
bool UsrIsTheMsgSender = PutCheckBoxToSelectUsr &&
@ -3141,7 +3141,7 @@ void Usr_WriteRowUsrMainData (unsigned NumUsr,struct UsrData *UsrDat,
// Two colors are used alternatively to better distinguish the rows
if (UsrIsTheMsgSender)
Str_Copy (BgColor,"LIGHT_GREEN",
Usr_MAX_LENGTH_BG_COLOR);
Usr_MAX_BYTES_BG_COLOR);
else
sprintf (BgColor,"COLOR%u",Gbl.RowEvenOdd);
@ -3926,7 +3926,7 @@ unsigned Usr_GetNumberOfTeachersInCentre (long CtrCod)
/*****************************************************************************/
static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role,
char Query[Usr_MAX_LENGTH_QUERY_GET_LIST_USRS + 1])
char Query[Usr_MAX_BYTES_QUERY_GET_LIST_USRS + 1])
{
unsigned NumPositiveCods = 0;
unsigned NumNegativeCods = 0;
@ -4033,7 +4033,7 @@ static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role,
{
Str_Concat (Query," AND (crs_usr.UsrCod IN"
" (SELECT DISTINCT UsrCod FROM crs_grp_usr WHERE",
Usr_MAX_LENGTH_QUERY_GET_LIST_USRS);
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
NumPositiveCods = 0;
for (NumGrpSel = 0;
NumGrpSel < Gbl.CurrentCrs.Grps.LstGrpsSel.NumGrps;
@ -4042,16 +4042,16 @@ static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role,
{
Str_Concat (Query,NumPositiveCods ? " OR GrpCod='" :
" GrpCod='",
Usr_MAX_LENGTH_QUERY_GET_LIST_USRS);
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
sprintf (LongStr,"%ld",GrpCod);
Str_Concat (Query,LongStr,
Usr_MAX_LENGTH_QUERY_GET_LIST_USRS);
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
Str_Concat (Query,"'",
Usr_MAX_LENGTH_QUERY_GET_LIST_USRS);
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
NumPositiveCods++;
}
Str_Concat (Query,")",
Usr_MAX_LENGTH_QUERY_GET_LIST_USRS);
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
}
}
@ -4063,27 +4063,27 @@ static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role,
{
if (NumPositiveCods || NumNegativeCods)
Str_Concat (Query," OR ",
Usr_MAX_LENGTH_QUERY_GET_LIST_USRS);
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
else
Str_Concat (Query," AND (",
Usr_MAX_LENGTH_QUERY_GET_LIST_USRS);
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
/* Select all the students of the course who don't belong to any group of type GrpTypCod */
Str_Concat (Query,"crs_usr.UsrCod NOT IN"
" (SELECT DISTINCT crs_grp_usr.UsrCod"
" FROM crs_grp,crs_grp_usr"
" WHERE crs_grp.GrpTypCod='",
Usr_MAX_LENGTH_QUERY_GET_LIST_USRS);
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
sprintf (LongStr,"%ld",Gbl.CurrentCrs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp].GrpTypCod);
Str_Concat (Query,LongStr,
Usr_MAX_LENGTH_QUERY_GET_LIST_USRS);
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
Str_Concat (Query,"' AND crs_grp.GrpCod=crs_grp_usr.GrpCod)",
Usr_MAX_LENGTH_QUERY_GET_LIST_USRS);
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
NumNegativeCods++;
}
if (NumPositiveCods ||
NumNegativeCods)
Str_Concat (Query,")",
Usr_MAX_LENGTH_QUERY_GET_LIST_USRS);
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
/***** Free memory used by the list of booleans AddStdsWithoutGroupOf *****/
free ((void *) AddStdsWithoutGroupOf);
@ -4098,7 +4098,7 @@ static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role,
"usr_data.Surname2,"
"usr_data.FirstName,"
"usr_data.UsrCod",
Usr_MAX_LENGTH_QUERY_GET_LIST_USRS);
Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
}
/*****************************************************************************/
@ -4110,7 +4110,7 @@ static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role,
void Usr_GetListUsrs (Rol_Role_t Role,Sco_Scope_t Scope)
{
char Query[Usr_MAX_LENGTH_QUERY_GET_LIST_USRS + 1]; // Big query when the course has lot of groups
char Query[Usr_MAX_BYTES_QUERY_GET_LIST_USRS + 1]; // Big query when the course has lot of groups
const char *QueryFields =
"DISTINCT usr_data.UsrCod,"
"usr_data.EncryptedUsrCod,"

View File

@ -3134,7 +3134,7 @@ int swad__markNotificationsAsRead (struct soap *soap,
/****************** Send a message to one or more users **********************/
/*****************************************************************************/
#define Svc_MAX_LENGTH_QUERY_RECIPIENTS (10 * 1024 - 1)
#define Svc_MAX_BYTES_QUERY_RECIPIENTS (10 * 1024 - 1)
int swad__sendMessage (struct soap *soap,
char *wsKey,int messageCode,char *to,char *subject,char *body, // input
@ -3143,7 +3143,7 @@ int swad__sendMessage (struct soap *soap,
int ReturnCode;
long ReplyUsrCod = -1L;
char Nickname[Nck_MAX_BYTES_NICKNAME_FROM_FORM + 1];
char Query[Svc_MAX_LENGTH_QUERY_RECIPIENTS + 1];
char Query[Svc_MAX_BYTES_QUERY_RECIPIENTS + 1];
MYSQL_RES *mysql_res;
MYSQL_ROW row;
unsigned NumRow,NumRows;
@ -3249,7 +3249,7 @@ int swad__sendMessage (struct soap *soap,
/* Check for overflow in query */
if (strlen (Query) + Nck_MAX_BYTES_NICKNAME_WITHOUT_ARROBA + 32 >
Svc_MAX_LENGTH_QUERY_RECIPIENTS)
Svc_MAX_BYTES_QUERY_RECIPIENTS)
return soap_sender_fault (Gbl.soap,
"Can not send message",
"Too many recipients");
@ -3259,25 +3259,25 @@ int swad__sendMessage (struct soap *soap,
{
if (ReplyUsrCod > 0)
Str_Concat (Query," UNION ",
Svc_MAX_LENGTH_QUERY_RECIPIENTS);
Svc_MAX_BYTES_QUERY_RECIPIENTS);
Str_Concat (Query,"SELECT UsrCod FROM usr_nicknames"
" WHERE Nickname IN ('",
Svc_MAX_LENGTH_QUERY_RECIPIENTS);
Svc_MAX_BYTES_QUERY_RECIPIENTS);
FirstNickname = false;
ThereAreNicknames = true;
}
else
Str_Concat (Query,",'",
Svc_MAX_LENGTH_QUERY_RECIPIENTS);
Svc_MAX_BYTES_QUERY_RECIPIENTS);
Str_Concat (Query,Nickname,
Svc_MAX_LENGTH_QUERY_RECIPIENTS);
Svc_MAX_BYTES_QUERY_RECIPIENTS);
Str_Concat (Query,"'",
Svc_MAX_LENGTH_QUERY_RECIPIENTS);
Svc_MAX_BYTES_QUERY_RECIPIENTS);
}
}
if (ThereAreNicknames)
Str_Concat (Query,")",
Svc_MAX_LENGTH_QUERY_RECIPIENTS);
Svc_MAX_BYTES_QUERY_RECIPIENTS);
/***** Initialize output structure *****/
sendMessageOut->numUsers = 0;
@ -3521,7 +3521,7 @@ int swad__getTestConfig (struct soap *soap,
/***** Set default result to empty *****/
getTestConfigOut->numQuestions = getTestConfigOut->minQuestions = getTestConfigOut->defQuestions = getTestConfigOut->maxQuestions = 0;
getTestConfigOut->feedback = (char *) soap_malloc (Gbl.soap,Tst_MAX_LENGTH_FEEDBACK_TYPE + 1);
getTestConfigOut->feedback = (char *) soap_malloc (Gbl.soap,Tst_MAX_BYTES_FEEDBACK_TYPE + 1);
getTestConfigOut->feedback[0] = '\0';
/***** Get test configuration *****/
@ -3534,7 +3534,7 @@ int swad__getTestConfig (struct soap *soap,
getTestConfigOut->maxQuestions = (int) Gbl.Test.Config.Max;
Str_Copy (getTestConfigOut->feedback,
Tst_FeedbackXML[Gbl.Test.Config.FeedbackType],
Tst_MAX_LENGTH_FEEDBACK_TYPE);
Tst_MAX_BYTES_FEEDBACK_TYPE);
/***** Get number of tests *****/
if (Gbl.Test.Config.Pluggable == Tst_PLUGGABLE_YES &&
@ -3798,10 +3798,10 @@ static int Svc_GetTstQuestions (long CrsCod,long BeginTime,struct swad__getTests
/* Get answer type (row[1]) */
AnswerType = Tst_ConvertFromStrAnsTypDBToAnsTyp (row[1]);
getTestsOut->questionsArray.__ptr[NumRow].answerType = (char *) soap_malloc (Gbl.soap,Tst_MAX_LENGTH_ANSWER_TYPE + 1);
getTestsOut->questionsArray.__ptr[NumRow].answerType = (char *) soap_malloc (Gbl.soap,Tst_MAX_BYTES_ANSWER_TYPE + 1);
Str_Copy (getTestsOut->questionsArray.__ptr[NumRow].answerType,
Tst_StrAnswerTypesXML[AnswerType],
Tst_MAX_LENGTH_ANSWER_TYPE);
Tst_MAX_BYTES_ANSWER_TYPE);
/* Get shuffle (row[2]) */
getTestsOut->questionsArray.__ptr[NumRow].shuffle = (row[2][0] == 'Y') ? 1 :
@ -3984,12 +3984,11 @@ static int Svc_GetTstQuestionTags (long CrsCod,long BeginTime,struct swad__getTe
return SOAP_OK;
}
/*****************************************************************************/
/***************** Return one test question for Trivial game *****************/
/*****************************************************************************/
#define Svc_MAX_LENGTH_DEGREES_STR (1024 - 1)
#define Svc_MAX_BYTES_DEGREES_STR (1024 - 1)
int swad__getTrivialQuestion (struct soap *soap,
char *wsKey,char *degrees,float lowerScore,float upperScore, // input
@ -3999,7 +3998,7 @@ int swad__getTrivialQuestion (struct soap *soap,
int ReturnCode;
const char *Ptr;
char LongStr[1 + 10 + 1];
char DegreesStr[Svc_MAX_LENGTH_DEGREES_STR + 1];
char DegreesStr[Svc_MAX_BYTES_DEGREES_STR + 1];
char DegStr[ 1 + 1 + 1 + 10 + 1 + 1];
// DegStr=", ' - number ' \0"
long DegCod;
@ -4064,7 +4063,7 @@ int swad__getTrivialQuestion (struct soap *soap,
{
sprintf (DegStr,",'%ld'",DegCod);
Str_Concat (DegreesStr,DegStr,
Svc_MAX_LENGTH_DEGREES_STR);
Svc_MAX_BYTES_DEGREES_STR);
}
}
}
@ -4128,10 +4127,10 @@ int swad__getTrivialQuestion (struct soap *soap,
/* Get answer type (row[1]) */
AnswerType = Tst_ConvertFromStrAnsTypDBToAnsTyp (row[1]);
getTrivialQuestionOut->question.answerType = (char *) soap_malloc (Gbl.soap,Tst_MAX_LENGTH_ANSWER_TYPE + 1);
getTrivialQuestionOut->question.answerType = (char *) soap_malloc (Gbl.soap,Tst_MAX_BYTES_ANSWER_TYPE + 1);
Str_Copy (getTrivialQuestionOut->question.answerType,
Tst_StrAnswerTypesXML[AnswerType],
Tst_MAX_LENGTH_ANSWER_TYPE);
Tst_MAX_BYTES_ANSWER_TYPE);
/* Get shuffle (row[2]) */
getTrivialQuestionOut->question.shuffle = (row[2][0] == 'Y') ? 1 :