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 *****************************/ /****************************** 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 CSS_FILE "swad16.147.css"
#define JS_FILE "swad16.144.js" #define JS_FILE "swad16.144.js"
// Number of lines (includes comments but not blank lines) has been got with the following command: // 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 // 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.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.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) 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; TT_ClassType_t ClassType;
unsigned Duration; unsigned Duration;
char Place[TT_MAX_BYTES_PLACE + 1]; 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) long GrpCod; // Group code (-1 if no group selected)
struct struct
{ {

View File

@ -1100,8 +1100,18 @@ void Str_ChangeFormat (Str_ChangeFrom_t ChangeFrom,Str_ChangeTo_t ChangeTo,
LengthSpecStrSrc = 1; LengthSpecStrSrc = 1;
SpecialChar = 0x20; SpecialChar = 0x20;
break; break;
case '%': /* Change "%XX" --> "&#decimal_number;" */ case '%': /* Change "%XX" --> "&#decimal_number;" (from 0 to 255) */
IsSpecialChar = true; 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); sscanf (PtrSrc + 1,"%2X",&SpecialChar);
LengthSpecStrSrc = 3; LengthSpecStrSrc = 3;
break; break;
@ -1226,7 +1236,7 @@ void Str_ChangeFormat (Str_ChangeFrom_t ChangeFrom,Str_ChangeTo_t ChangeTo,
ThereIsSpaceChar = false; ThereIsSpaceChar = false;
break; break;
case 0x23: /* "%23" --> "#" */ case 0x23: /* "%23" --> "#" */
StrSpecialChar[0] = '#'; StrSpecialChar[0] = '#'; // '#' must be converted to '#' to allow HTML entities like 分
StrSpecialChar[1] = '\0'; StrSpecialChar[1] = '\0';
NumPrintableCharsFromReturn++; NumPrintableCharsFromReturn++;
ThereIsSpaceChar = false; ThereIsSpaceChar = false;
@ -1268,7 +1278,7 @@ void Str_ChangeFormat (Str_ChangeFrom_t ChangeFrom,Str_ChangeTo_t ChangeTo,
ThereIsSpaceChar = false; ThereIsSpaceChar = false;
break; break;
case 0x3B: /* "%3B" --> ";" */ case 0x3B: /* "%3B" --> ";" */
StrSpecialChar[0] = ';'; StrSpecialChar[0] = ';'; // ';' must be converted to ';' to allow HTML entities like 分
StrSpecialChar[1] = '\0'; StrSpecialChar[1] = '\0';
NumPrintableCharsFromReturn++; NumPrintableCharsFromReturn++;
ThereIsSpaceChar = false; ThereIsSpaceChar = false;

View File

@ -34,11 +34,24 @@
/*****************************************************************************/ /*****************************************************************************/
/***************************** Public constants *****************************/ /***************************** 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 The maximum UTF-8 code is 1114111 or 0x10FFFF.
#define Str_MAX_BYTES_SPEC_CHAR_HTML 10 // Number of bytes of the string from � to max UTF8  (= ) 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)
#define Str_MAX_BYTES_PER_CHAR 10 // max (Str_BYTES_STR_HEX,Str_MAX_BYTES_SPEC_CHAR_HTML) 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 *******************************/ /******************************* Public types *******************************/

View File

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

View File

@ -33,7 +33,8 @@
/************************** Public types and constants ***********************/ /************************** 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 #define Svy_NUM_DATES 2
typedef enum typedef enum
@ -49,7 +50,7 @@ struct Survey
long Cod; // Country, institution, centre, degree or course code 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) unsigned Roles; // Example: if survey can be made by students and teachers, Roles == (1 << Rol_ROLE_STUDENT) | (1 << Rol_ROLE_TEACHER)
long UsrCod; long UsrCod;
char Title[Svy_MAX_LENGTH_SURVEY_TITLE + 1]; char Title[Svy_MAX_BYTES_SURVEY_TITLE + 1];
time_t TimeUTC[Svy_NUM_DATES]; time_t TimeUTC[Svy_NUM_DATES];
unsigned NumQsts; // Number of questions in the survey unsigned NumQsts; // Number of questions in the survey
unsigned NumUsrs; // Number of distinct users who have already answered 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_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_CHARS_TEXT_ITEM 1000
#define Syl_MAX_BYTES_TEXT_ITEM (Syl_MAX_LENGTH_TEXT_ITEM*Str_MAX_BYTES_PER_CHAR) #define Syl_MAX_BYTES_TEXT_ITEM (Syl_MAX_CHARS_TEXT_ITEM * Str_MAX_BYTES_PER_CHAR)
#define Syl_WIDTH_NUM_SYLLABUS 20 #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\"" fprintf (Gbl.F.Out,"<input type=\"text\" name=\"Txt\""
" size=\"80\" maxlength=\"%u\" value=\"%s\"" " size=\"80\" maxlength=\"%u\" value=\"%s\""
" placeholder=\"%s\"", " placeholder=\"%s\"",
Syl_MAX_LENGTH_TEXT_ITEM,Text, Syl_MAX_CHARS_TEXT_ITEM,Text,
Txt_Enter_a_new_item_here); Txt_Enter_a_new_item_here);
if (NewItem) if (NewItem)
fprintf (Gbl.F.Out," autofocus=\"autofocus\""); fprintf (Gbl.F.Out," autofocus=\"autofocus\"");
@ -987,14 +987,14 @@ static void Syl_WriteNumItem (char *StrDst,FILE *FileTgt,int Level,int *CodItem)
{ {
if (StrDst) if (StrDst)
Str_Concat (StrDst,".", Str_Concat (StrDst,".",
Syl_MAX_LENGTH_ITEM_COD); Syl_MAX_BYTES_ITEM_COD);
if (FileTgt) if (FileTgt)
fprintf (FileTgt,"."); fprintf (FileTgt,".");
} }
sprintf (InStr,"%d",CodItem[N]); sprintf (InStr,"%d",CodItem[N]);
if (StrDst) if (StrDst)
Str_Concat (StrDst,InStr, Str_Concat (StrDst,InStr,
Syl_MAX_LENGTH_ITEM_COD); Syl_MAX_BYTES_ITEM_COD);
if (FileTgt) if (FileTgt)
fprintf (FileTgt,"%s",InStr); fprintf (FileTgt,"%s",InStr);
} }

View File

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

View File

@ -31,25 +31,28 @@
/***************************** Public constants ******************************/ /***************************** 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_QUESTIONS_PER_TEST 100 // Absolute maximum number of questions in a test
#define Tst_MAX_TAGS_PER_QUESTION 5 #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_CHARS_TAG (128 - 1)
#define Tst_MAX_OPTIONS_PER_QUESTION 10 #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_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_SIZE_ANSWERS_ONE_QST (Tst_MAX_OPTIONS_PER_QUESTION * (10 + 1))
#define Tst_MAX_LENGTH_ANSWER 1000 #define Tst_MAX_CHARS_ANSWER_OR_FEEDBACK 1000
#define Tst_MAX_BYTES_ANSWER_OR_FEEDBACK (Tst_MAX_LENGTH_ANSWER*Str_MAX_BYTES_PER_CHAR) #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_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_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_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_BYTES_FEEDBACK_TYPE 32
#define Tst_MAX_LENGTH_ANSWER_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 */ /* Convert the answer, that is in HTML, to rigorous HTML */
AnswerTextLength = strlen (Gbl.Test.Answer.Options[NumOpt].Text) * 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) if ((AnswerText = malloc (AnswerTextLength + 1)) == NULL)
Lay_ShowErrorAndExit ("Not enough memory to store answer."); Lay_ShowErrorAndExit ("Not enough memory to store answer.");
Str_Copy (AnswerText,Gbl.Test.Answer.Options[NumOpt].Text, 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]) if (Gbl.Test.Answer.Options[NumOpt].Feedback[0])
{ {
AnswerFeedbackLength = strlen (Gbl.Test.Answer.Options[NumOpt].Feedback) * 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) if ((AnswerFeedback = malloc (AnswerFeedbackLength + 1)) == NULL)
Lay_ShowErrorAndExit ("Not enough memory to store feedback."); Lay_ShowErrorAndExit ("Not enough memory to store feedback.");
Str_Copy (AnswerFeedback, 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_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_CLASS_TYPE 256
#define TT_MAX_BYTES_STR_DURATION (2 + 1 + 2 + 1 + 1) // "hh:mm h" #define TT_MAX_BYTES_STR_DURATION 32 // "hh:mm h"
#define TT_MAX_LENGTH_PLACE 32
/*****************************************************************************/ /*****************************************************************************/
/******************************* Internal types ******************************/ /******************************* Internal types ******************************/
@ -100,7 +99,7 @@ struct TimeTableColumn
TT_ClassType_t ClassType; TT_ClassType_t ClassType;
unsigned Duration; unsigned Duration;
char Place[TT_MAX_BYTES_PLACE + 1]; char Place[TT_MAX_BYTES_PLACE + 1];
char Group[TT_MAX_BYTES_GROUP + 1]; char Group[Grp_MAX_BYTES_GROUP_NAME + 1];
}; };
struct struct
{ {
@ -204,9 +203,6 @@ static void TT_GetParamsTimeTable (void)
Lay_ShowErrorAndExit ("Duration is missing."); Lay_ShowErrorAndExit ("Duration is missing.");
Gbl.TimeTable.Duration = Hours * 2 + Minutes / 30; Gbl.TimeTable.Duration = Hours * 2 + Minutes / 30;
/***** Get group *****/
Par_GetParToText ("ModTTGrp",Gbl.TimeTable.Group,TT_MAX_BYTES_GROUP);
/***** Get group code *****/ /***** Get group code *****/
Gbl.TimeTable.GrpCod = Par_GetParToLong ("ModTTGrpCod"); Gbl.TimeTable.GrpCod = Par_GetParToLong ("ModTTGrpCod");
@ -742,7 +738,7 @@ static void TT_CreatTimeTableFromDB (long UsrCod)
Gbl.CurrentCrs.Crs.CrsCod); Gbl.CurrentCrs.Crs.CrsCod);
Str_Copy (TimeTable[Day][Hour].Columns[FirstFreeColumn].Group, Str_Copy (TimeTable[Day][Hour].Columns[FirstFreeColumn].Group,
row[5], row[5],
TT_MAX_BYTES_GROUP); Grp_MAX_BYTES_GROUP_NAME);
TimeTable[Day][Hour].Columns[FirstFreeColumn].GrpCod = GrpCod; TimeTable[Day][Hour].Columns[FirstFreeColumn].GrpCod = GrpCod;
// no break; // no break;
case TT_TUTOR_TIMETABLE: 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; 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, Str_Copy (TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.Hour].Columns[Gbl.TimeTable.Column].Group,
Gbl.TimeTable.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, Str_Copy (TimeTable[Gbl.TimeTable.Day][Gbl.TimeTable.Hour].Columns[Gbl.TimeTable.Column].Place,
Gbl.TimeTable.Place, Gbl.TimeTable.Place,
TT_MAX_BYTES_PLACE); TT_MAX_BYTES_PLACE);
@ -1278,8 +1274,6 @@ static void TT_TimeTableDrawCell (unsigned Day,unsigned Hour,unsigned Column,uns
else else
fprintf (Gbl.F.Out,"0:30"); fprintf (Gbl.F.Out,"0:30");
fprintf (Gbl.F.Out," h\" />"); fprintf (Gbl.F.Out," h\" />");
Par_PutHiddenParamString ("ModTTGrp","");
Par_PutHiddenParamString ("ModTTPlace","");
} }
else else
{ {
@ -1302,7 +1296,7 @@ static void TT_TimeTableDrawCell (unsigned Day,unsigned Hour,unsigned Column,uns
fprintf (Gbl.F.Out,"<option"); fprintf (Gbl.F.Out,"<option");
if (Dur == Duration) if (Dur == Duration)
fprintf (Gbl.F.Out," selected=\"selected\""); 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,
Dur % 2 ? 30 : Dur % 2 ? 30 :
0); 0);
@ -1349,11 +1343,10 @@ static void TT_TimeTableDrawCell (unsigned Day,unsigned Hour,unsigned Column,uns
" size=\"1\" maxlength=\"%u\" value=\"%s\"" " size=\"1\" maxlength=\"%u\" value=\"%s\""
" onchange=\"document.getElementById('%s').submit();\" />" " onchange=\"document.getElementById('%s').submit();\" />"
"</label>", "</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 else // TimeTableView == TT_TUT_EDIT
{ {
Par_PutHiddenParamString ("ModTTGrp","");
/***** Place *****/ /***** Place *****/
fprintf (Gbl.F.Out,"<br />" fprintf (Gbl.F.Out,"<br />"
"<label class=\"DAT_SMALL\">" "<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\"" " size=\"12\" maxlength=\"%u\" value=\"%s\""
" onchange=\"document.getElementById('%s').submit();\" />" " onchange=\"document.getElementById('%s').submit();\" />"
"</label>", "</label>",
Txt_Place,TT_MAX_LENGTH_PLACE,Place,Gbl.Form.Id); Txt_Place,TT_MAX_CHARS_PLACE,Place,Gbl.Form.Id);
} }
} }
break; break;

View File

@ -33,8 +33,8 @@
/************************* Public constants and types ************************/ /************************* Public constants and types ************************/
/*****************************************************************************/ /*****************************************************************************/
#define TT_MAX_BYTES_PLACE (128 - 1) #define TT_MAX_CHARS_PLACE 32
#define TT_MAX_BYTES_GROUP (256 - 1) #define TT_MAX_BYTES_PLACE (TT_MAX_CHARS_PLACE * Str_MAX_BYTES_PER_CHAR)
#define TT_NUM_TIMETABLE_TYPES 3 #define TT_NUM_TIMETABLE_TYPES 3
typedef enum 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 #define Usr_NUM_ALL_FIELDS_DATA_TCH 11
const char *Usr_UsrDatMainFieldNames[Usr_NUM_MAIN_FIELDS_DATA_USR]; 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 *******************************/ /****************************** Internal types *******************************/
@ -148,7 +148,7 @@ static void Usr_WriteUsrData (const char *BgColor,
bool NonBreak,bool Accepted); bool NonBreak,bool Accepted);
static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role, 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_GetAdmsLst (Sco_Scope_t Scope);
static void Usr_GetGstsLst (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 *************/ /*********** 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, void Usr_WriteRowUsrMainData (unsigned NumUsr,struct UsrData *UsrDat,
bool PutCheckBoxToSelectUsr) bool PutCheckBoxToSelectUsr)
{ {
extern const char *Txt_Enrollment_confirmed; extern const char *Txt_Enrollment_confirmed;
extern const char *Txt_Enrollment_not_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]; char PhotoURL[PATH_MAX + 1];
bool ShowPhoto; bool ShowPhoto;
bool UsrIsTheMsgSender = PutCheckBoxToSelectUsr && 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 // Two colors are used alternatively to better distinguish the rows
if (UsrIsTheMsgSender) if (UsrIsTheMsgSender)
Str_Copy (BgColor,"LIGHT_GREEN", Str_Copy (BgColor,"LIGHT_GREEN",
Usr_MAX_LENGTH_BG_COLOR); Usr_MAX_BYTES_BG_COLOR);
else else
sprintf (BgColor,"COLOR%u",Gbl.RowEvenOdd); sprintf (BgColor,"COLOR%u",Gbl.RowEvenOdd);
@ -3926,7 +3926,7 @@ unsigned Usr_GetNumberOfTeachersInCentre (long CtrCod)
/*****************************************************************************/ /*****************************************************************************/
static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role, 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 NumPositiveCods = 0;
unsigned NumNegativeCods = 0; unsigned NumNegativeCods = 0;
@ -4033,7 +4033,7 @@ static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role,
{ {
Str_Concat (Query," AND (crs_usr.UsrCod IN" Str_Concat (Query," AND (crs_usr.UsrCod IN"
" (SELECT DISTINCT UsrCod FROM crs_grp_usr WHERE", " (SELECT DISTINCT UsrCod FROM crs_grp_usr WHERE",
Usr_MAX_LENGTH_QUERY_GET_LIST_USRS); Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
NumPositiveCods = 0; NumPositiveCods = 0;
for (NumGrpSel = 0; for (NumGrpSel = 0;
NumGrpSel < Gbl.CurrentCrs.Grps.LstGrpsSel.NumGrps; NumGrpSel < Gbl.CurrentCrs.Grps.LstGrpsSel.NumGrps;
@ -4042,16 +4042,16 @@ static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role,
{ {
Str_Concat (Query,NumPositiveCods ? " OR GrpCod='" : Str_Concat (Query,NumPositiveCods ? " OR GrpCod='" :
" GrpCod='", " GrpCod='",
Usr_MAX_LENGTH_QUERY_GET_LIST_USRS); Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
sprintf (LongStr,"%ld",GrpCod); sprintf (LongStr,"%ld",GrpCod);
Str_Concat (Query,LongStr, Str_Concat (Query,LongStr,
Usr_MAX_LENGTH_QUERY_GET_LIST_USRS); Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
Str_Concat (Query,"'", Str_Concat (Query,"'",
Usr_MAX_LENGTH_QUERY_GET_LIST_USRS); Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
NumPositiveCods++; NumPositiveCods++;
} }
Str_Concat (Query,")", 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) if (NumPositiveCods || NumNegativeCods)
Str_Concat (Query," OR ", Str_Concat (Query," OR ",
Usr_MAX_LENGTH_QUERY_GET_LIST_USRS); Usr_MAX_BYTES_QUERY_GET_LIST_USRS);
else else
Str_Concat (Query," AND (", 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 */ /* 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" Str_Concat (Query,"crs_usr.UsrCod NOT IN"
" (SELECT DISTINCT crs_grp_usr.UsrCod" " (SELECT DISTINCT crs_grp_usr.UsrCod"
" FROM crs_grp,crs_grp_usr" " FROM crs_grp,crs_grp_usr"
" WHERE crs_grp.GrpTypCod='", " 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); sprintf (LongStr,"%ld",Gbl.CurrentCrs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp].GrpTypCod);
Str_Concat (Query,LongStr, 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)", 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++; NumNegativeCods++;
} }
if (NumPositiveCods || if (NumPositiveCods ||
NumNegativeCods) NumNegativeCods)
Str_Concat (Query,")", 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 memory used by the list of booleans AddStdsWithoutGroupOf *****/
free ((void *) AddStdsWithoutGroupOf); free ((void *) AddStdsWithoutGroupOf);
@ -4098,7 +4098,7 @@ static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role,
"usr_data.Surname2," "usr_data.Surname2,"
"usr_data.FirstName," "usr_data.FirstName,"
"usr_data.UsrCod", "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) 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 = const char *QueryFields =
"DISTINCT usr_data.UsrCod," "DISTINCT usr_data.UsrCod,"
"usr_data.EncryptedUsrCod," "usr_data.EncryptedUsrCod,"

View File

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