diff --git a/swad_changelog.h b/swad_changelog.h index 250f11b8..bf4b4287 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -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) diff --git a/swad_global.h b/swad_global.h index 6e958e37..7be17943 100644 --- a/swad_global.h +++ b/swad_global.h @@ -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 { diff --git a/swad_string.c b/swad_string.c index 4450b552..9e280bf3 100644 --- a/swad_string.c +++ b/swad_string.c @@ -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; diff --git a/swad_string.h b/swad_string.h index a2950769..e12a0269 100644 --- a/swad_string.h +++ b/swad_string.h @@ -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 *******************************/ diff --git a/swad_survey.c b/swad_survey.c index 2f207b60..eb12c13b 100644 --- a/swad_survey.c +++ b/swad_survey.c @@ -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) "", 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, diff --git a/swad_survey.h b/swad_survey.h index 05fc36d4..55d848c1 100644 --- a/swad_survey.h +++ b/swad_survey.h @@ -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 diff --git a/swad_syllabus.c b/swad_syllabus.c index 97018583..b9f0ba97 100644 --- a/swad_syllabus.c +++ b/swad_syllabus.c @@ -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,"", - Tst_MAX_LENGTH_TAG,row[1],Gbl.Form.Id); + Tst_MAX_CHARS_TAG,row[1],Gbl.Form.Id); Act_FormEnd (); fprintf (Gbl.F.Out,"" ""); @@ -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')\" />" "", - 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,""); } @@ -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 || diff --git a/swad_test.h b/swad_test.h index b156ed58..22fa61d0 100644 --- a/swad_test.h +++ b/swad_test.h @@ -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 /*****************************************************************************/ diff --git a/swad_test_import.c b/swad_test_import.c index 55a40ca1..6dfd4c49 100644 --- a/swad_test_import.c +++ b/swad_test_import.c @@ -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, diff --git a/swad_timetable.c b/swad_timetable.c index 6f97dab3..4fe1cdaa 100644 --- a/swad_timetable.c +++ b/swad_timetable.c @@ -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,"%d:%02d h", + fprintf (Gbl.F.Out,">%u:%02u h", 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();\" />" "", - 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,"
" "", - Txt_Place,TT_MAX_LENGTH_PLACE,Place,Gbl.Form.Id); + Txt_Place,TT_MAX_CHARS_PLACE,Place,Gbl.Form.Id); } } break; diff --git a/swad_timetable.h b/swad_timetable.h index 1421dc63..c31aeccb 100644 --- a/swad_timetable.h +++ b/swad_timetable.h @@ -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 diff --git a/swad_user.c b/swad_user.c index 7960c31f..9ae49884 100644 --- a/swad_user.c +++ b/swad_user.c @@ -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," diff --git a/swad_web_service.c b/swad_web_service.c index b946b92c..5b22e694 100644 --- a/swad_web_service.c +++ b/swad_web_service.c @@ -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 :