diff --git a/swad_HTML.c b/swad_HTML.c index 6265ec99..36dcf72f 100644 --- a/swad_HTML.c +++ b/swad_HTML.c @@ -1205,7 +1205,8 @@ void HTM_INPUT_BUTTON (const char *Name,const char *Value,const char *Attr) Attr); } -void HTM_INPUT_IMAGE (const char *URL,const char *Icon,const char *Title,const char *Class) +void HTM_INPUT_IMAGE (const char *URL,const char *Icon, + const char *Title,const char *Class) { HTM_TxtF (" // For isalnum, isdigit, etc. #include // For boolean type +#include // For asprintf #include // For exit, system, malloc, free, rand, etc. #include // For string functions @@ -510,6 +512,7 @@ static void ID_ShowFormChangeUsrID (bool ItsMe,bool IShouldFillInID) extern const char *Txt_Add_this_ID; extern const char *Txt_The_ID_is_used_in_order_to_facilitate_; unsigned NumID; + char *Title; static const struct { Act_Action_t Remove; @@ -576,13 +579,15 @@ static void ID_ShowFormChangeUsrID (bool ItsMe,bool IShouldFillInID) } /* User's ID */ + if (asprintf (&Title,UsrDat->IDs.List[NumID].Confirmed ? Txt_ID_X_confirmed : + Txt_ID_X_not_confirmed, + UsrDat->IDs.List[NumID].ID) < 0) + Err_NotEnoughMemoryExit (); HTM_SPAN_Begin ("class=\"%s\" title=\"%s\"", UsrDat->IDs.List[NumID].Confirmed ? "USR_ID_C" : "USR_ID_NC", - Str_BuildString (UsrDat->IDs.List[NumID].Confirmed ? Txt_ID_X_confirmed : - Txt_ID_X_not_confirmed, - UsrDat->IDs.List[NumID].ID)); - Str_FreeStrings (); + Title); + free (Title); HTM_Txt (UsrDat->IDs.List[NumID].ID); HTM_Txt (UsrDat->IDs.List[NumID].Confirmed ? "✓" : ""); diff --git a/swad_changelog.h b/swad_changelog.h index f042e908..dc09e3d8 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -602,10 +602,11 @@ TODO: FIX BUG, URGENT! En las fechas como par TODO: En las encuestas, que los estudiantes no puedan ver los resultados hasta que no finalice el plazo. */ -#define Log_PLATFORM_VERSION "SWAD 21.77.2 (2021-12-29)" +#define Log_PLATFORM_VERSION "SWAD 21.77.3 (2021-12-29)" #define CSS_FILE "swad21.77.1.css" #define JS_FILE "swad21.67.4.js" /* + Version 21.77.3: Dec 29, 2021 Changing Str_BuildString for asprintf. (322287 lines) Version 21.77.2: Dec 29, 2021 Changing Str_BuildString for asprintf. (322199 lines) Version 21.77.1: Dec 29, 2021 Working on design of dark theme. (322161 lines) Version 21.77: Dec 29, 2021 Animated recycle icon is changed by static icon. (322250 lines) diff --git a/swad_degree.c b/swad_degree.c index 5f20e5b6..491ea7a1 100644 --- a/swad_degree.c +++ b/swad_degree.c @@ -25,8 +25,10 @@ /********************************* Headers ***********************************/ /*****************************************************************************/ +#define _GNU_SOURCE // For asprintf #include // For boolean type #include // For NULL +#include // For asprintf #include // For free #include // For string functions diff --git a/swad_degree_config.c b/swad_degree_config.c index e87ea0d5..e9440a65 100644 --- a/swad_degree_config.c +++ b/swad_degree_config.c @@ -25,11 +25,14 @@ /********************************* Headers ***********************************/ /*****************************************************************************/ +#define _GNU_SOURCE // For asprintf #include // For boolean type +#include // For asprintf #include "swad_database.h" #include "swad_degree_config.h" #include "swad_degree_database.h" +#include "swad_error.h" #include "swad_form.h" #include "swad_global.h" #include "swad_help.h" diff --git a/swad_department.c b/swad_department.c index c71d3003..218e8607 100644 --- a/swad_department.c +++ b/swad_department.c @@ -25,8 +25,10 @@ /********************************* Headers ***********************************/ /*****************************************************************************/ +#define _GNU_SOURCE // For asprintf #include // For boolean type #include // For NULL +#include // For asprintf #include // For calloc #include // For string functions @@ -104,6 +106,7 @@ void Dpt_SeeDepts (void) extern const char *Txt_Other_departments; extern const char *Txt_Department_unspecified; struct Dpt_Departments Departments; + char *Title; Dpt_Order_t Order; unsigned NumDpt; unsigned NumTchsInsInOtherDpts; @@ -123,17 +126,14 @@ void Dpt_SeeDepts (void) Dpt_GetListDepartments (&Departments,Gbl.Hierarchy.Ins.InsCod); /***** Begin box and table *****/ - if (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) - Box_BoxTableBegin (NULL,Str_BuildString (Txt_Departments_of_INSTITUTION_X, - Gbl.Hierarchy.Ins.FullName), - Dpt_PutIconToEditDpts,NULL, - Hlp_INSTITUTION_Departments,Box_NOT_CLOSABLE,2); - else - Box_BoxTableBegin (NULL,Str_BuildString (Txt_Departments_of_INSTITUTION_X, - Gbl.Hierarchy.Ins.FullName), - NULL,NULL, - Hlp_INSTITUTION_Departments,Box_NOT_CLOSABLE,2); - Str_FreeStrings (); + if (asprintf (&Title,Txt_Departments_of_INSTITUTION_X,Gbl.Hierarchy.Ins.FullName) < 0) + Err_NotEnoughMemoryExit (); + Box_BoxTableBegin (NULL,Title, + Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM ? Dpt_PutIconToEditDpts : + NULL, + NULL, + Hlp_INSTITUTION_Departments,Box_NOT_CLOSABLE,2); + free (Title); /***** Write heading *****/ HTM_TR_Begin (NULL); @@ -271,6 +271,7 @@ static void Dpt_EditDepartmentsInternal (void) extern const char *Hlp_INSTITUTION_Departments_edit; extern const char *Txt_Departments_of_INSTITUTION_X; struct Dpt_Departments Departments; + char *Title; /***** Trivial check *****/ if (Gbl.Hierarchy.Ins.InsCod <= 0) // An institution must be selected @@ -286,11 +287,11 @@ static void Dpt_EditDepartmentsInternal (void) Dpt_GetListDepartments (&Departments,Gbl.Hierarchy.Ins.InsCod); /***** Begin box *****/ - Box_BoxBegin (NULL,Str_BuildString (Txt_Departments_of_INSTITUTION_X, - Gbl.Hierarchy.Ins.FullName), - NULL,NULL, + if (asprintf (&Title,Txt_Departments_of_INSTITUTION_X,Gbl.Hierarchy.Ins.FullName) < 0) + Err_NotEnoughMemoryExit (); + Box_BoxBegin (NULL,Title,NULL,NULL, Hlp_INSTITUTION_Departments_edit,Box_NOT_CLOSABLE); - Str_FreeStrings (); + free (Title); /***** Put a form to create a new department *****/ Dpt_PutFormToCreateDepartment (); diff --git a/swad_exam_result.c b/swad_exam_result.c index 2024433b..fe051907 100644 --- a/swad_exam_result.c +++ b/swad_exam_result.c @@ -184,6 +184,7 @@ void ExaRes_ShowMyResultsInExa (void) struct Exa_Exams Exams; struct Exa_Exam Exam; struct ExaSes_Session Session; + char *Title; /***** Reset exams context *****/ Exa_ResetExams (&Exams); @@ -205,10 +206,10 @@ void ExaRes_ShowMyResultsInExa (void) false); // Do not put form to start new session /***** List my sessions results in exam *****/ - ExaRes_ShowResultsBegin (&Exams, - Str_BuildString (Txt_Results_of_exam_X,Exam.Title), - false); // Do not list exams to select - Str_FreeStrings (); + if (asprintf (&Title,Txt_Results_of_exam_X,Exam.Title) < 0) + Err_NotEnoughMemoryExit (); + ExaRes_ShowResultsBegin (&Exams,Title,false); // Do not list exams to select + free (Title); ExaRes_ListMyResultsInExa (&Exams,Exam.ExaCod); ExaRes_ShowResultsEnd (); @@ -236,6 +237,7 @@ void ExaRes_ShowMyResultsInSes (void) struct Exa_Exams Exams; struct Exa_Exam Exam; struct ExaSes_Session Session; + char *Title; /***** Reset exams context *****/ Exa_ResetExams (&Exams); @@ -258,10 +260,10 @@ void ExaRes_ShowMyResultsInSes (void) false); // Do not put form to start new session /***** List my sessions results in session *****/ - ExaRes_ShowResultsBegin (&Exams,Str_BuildString (Txt_Results_of_session_X, - Session.Title), - false); // Do not list exams to select - Str_FreeStrings (); + if (asprintf (&Title,Txt_Results_of_session_X,Session.Title) < 0) + Err_NotEnoughMemoryExit (); + ExaRes_ShowResultsBegin (&Exams,Title,false); // Do not list exams to select + free (Title); ExaRes_ListMyResultsInSes (&Exams,Session.SesCod); ExaRes_ShowResultsEnd (); @@ -387,6 +389,7 @@ void ExaRes_ShowAllResultsInExa (void) struct Exa_Exams Exams; struct Exa_Exam Exam; struct ExaSes_Session Session; + char *Title; /***** Reset exams context *****/ Exa_ResetExams (&Exams); @@ -406,10 +409,10 @@ void ExaRes_ShowAllResultsInExa (void) false); // Do not put form to start new session /***** List sessions results in exam *****/ - ExaRes_ShowResultsBegin (&Exams, - Str_BuildString (Txt_Results_of_exam_X,Exam.Title), - false); // Do not list exams to select - Str_FreeStrings (); + if (asprintf (&Title,Txt_Results_of_exam_X,Exam.Title) < 0) + Err_NotEnoughMemoryExit (); + ExaRes_ShowResultsBegin (&Exams,Title,false); // Do not list exams to select + free (Title); ExaRes_ListAllResultsInExa (&Exams,Exam.ExaCod); ExaRes_ShowResultsEnd (); @@ -459,6 +462,7 @@ void ExaRes_ShowAllResultsInSes (void) struct Exa_Exams Exams; struct Exa_Exam Exam; struct ExaSes_Session Session; + char *Title; /***** Reset exams context *****/ Exa_ResetExams (&Exams); @@ -483,10 +487,10 @@ void ExaRes_ShowAllResultsInSes (void) false); // Do not put form to start new session /***** List sessions results in session *****/ - ExaRes_ShowResultsBegin (&Exams, - Str_BuildString (Txt_Results_of_session_X,Session.Title), - false); // Do not list exams to select - Str_FreeStrings (); + if (asprintf (&Title,Txt_Results_of_session_X,Session.Title) < 0) + Err_NotEnoughMemoryExit (); + ExaRes_ShowResultsBegin (&Exams,Title,false); // Do not list exams to select + free (Title); ExaRes_ListAllResultsInSes (&Exams,Session.SesCod); ExaRes_ShowResultsEnd (); diff --git a/swad_exam_set.c b/swad_exam_set.c index a9b12ff5..e2988b9e 100644 --- a/swad_exam_set.c +++ b/swad_exam_set.c @@ -722,6 +722,7 @@ static void ExaSet_ListOneOrMoreSetsForEdition (struct Exa_Exams *Exams, MYSQL_ROW row; char *Anchor; char StrSetInd[Cns_MAX_DECIMAL_DIGITS_UINT + 1]; + char *Title; /***** Trivial check *****/ if (!NumSets) @@ -787,12 +788,13 @@ static void ExaSet_ListOneOrMoreSetsForEdition (struct Exa_Exams *Exams, /* Put icon to move up the question */ if (ICanEditSets && Set.SetInd > 1) { + if (asprintf (&Title,Txt_Move_up_X,StrSetInd) < 0) + Err_NotEnoughMemoryExit (); Lay_PutContextualLinkOnlyIcon (ActUp_ExaSet,Anchor, ExaSet_PutParamsOneSet,Exams, "arrow-up.svg",Ico_BLACK, - Str_BuildString (Txt_Move_up_X, - StrSetInd)); - Str_FreeStrings (); + Title); + free (Title); } else Ico_PutIconOff ("arrow-up.svg",Ico_BLACK, @@ -801,12 +803,13 @@ static void ExaSet_ListOneOrMoreSetsForEdition (struct Exa_Exams *Exams, /* Put icon to move down the set */ if (ICanEditSets && Set.SetInd < MaxSetInd) { + if (asprintf (&Title,Txt_Move_down_X,StrSetInd) < 0) + Err_NotEnoughMemoryExit (); Lay_PutContextualLinkOnlyIcon (ActDwnExaSet,Anchor, ExaSet_PutParamsOneSet,Exams, "arrow-down.svg",Ico_BLACK, - Str_BuildString (Txt_Move_down_X, - StrSetInd)); - Str_FreeStrings (); + Title); + free (Title); } else Ico_PutIconOff ("arrow-down.svg",Ico_BLACK, diff --git a/swad_figure.c b/swad_figure.c index 6ea3ef56..de352c8b 100644 --- a/swad_figure.c +++ b/swad_figure.c @@ -448,14 +448,24 @@ static void Fig_GetAndShowNumUsrsInCrss (Rol_Role_t Role) extern const char *Txt_Total; extern const char *Txt_ROLES_PLURAL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS]; long Cod = Sco_GetCurrentCod (); - char *Class = (Role == Rol_UNK) ? Str_BuildString ("RB %s LINE_TOP", - The_ClassDatStrong[Gbl.Prefs.Theme]) : - Str_BuildString ("RB %s", - The_ClassDat[Gbl.Prefs.Theme]); - unsigned Roles = (Role == Rol_UNK) ? ((1 << Rol_STD) | - (1 << Rol_NET) | - (1 << Rol_TCH)) : - (1 << Role); + char *Class; + unsigned Roles; + + /***** Initializations depending on role *****/ + if (Role == Rol_UNK) + { + if (asprintf (&Class,"RB %s LINE_TOP",The_ClassDatStrong[Gbl.Prefs.Theme]) < 0) + Err_NotEnoughMemoryExit (); + Roles = (1 << Rol_STD) | + (1 << Rol_NET) | + (1 << Rol_TCH); + } + else + { + if (asprintf (&Class,"RB %s",The_ClassDat[Gbl.Prefs.Theme]) < 0) + Err_NotEnoughMemoryExit (); + Roles = (1 << Role); + } /***** Write the total number of users *****/ HTM_TR_Begin (NULL); @@ -480,7 +490,7 @@ static void Fig_GetAndShowNumUsrsInCrss (Rol_Role_t Role) HTM_TR_End (); - Str_FreeStrings (); + free (Class); } /*****************************************************************************/ @@ -491,7 +501,10 @@ static void Fig_GetAndShowNumUsrsNotBelongingToAnyCrs (void) { extern const char *The_ClassDat[The_NUM_THEMES]; extern const char *Txt_ROLES_PLURAL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS]; - char *Class = Str_BuildString ("%s RB",The_ClassDat[Gbl.Prefs.Theme]); + char *Class; + + if (asprintf (&Class,"%s RB",The_ClassDat[Gbl.Prefs.Theme]) < 0) + Err_NotEnoughMemoryExit (); /***** Write the total number of users not belonging to any course *****/ HTM_TR_Begin (NULL); @@ -514,7 +527,7 @@ static void Fig_GetAndShowNumUsrsNotBelongingToAnyCrs (void) HTM_TR_End (); - Str_FreeStrings (); + free (Class); } /*****************************************************************************/ @@ -889,6 +902,7 @@ static void Fig_GetAndShowHierarchyTotal (void) { extern const char *The_ClassDatStrong[The_NUM_THEMES]; extern const char *Txt_Total; + char *ClassTxt; unsigned NumCtysTotal = 1; unsigned NumInssTotal = 1; unsigned NumCtrsTotal = 1; @@ -931,15 +945,15 @@ static void Fig_GetAndShowHierarchyTotal (void) } /***** Write total number of elements *****/ - Fig_ShowHierarchyRow ("",Txt_Total, - Str_BuildString ("%s LINE_TOP", - The_ClassDatStrong[Gbl.Prefs.Theme]), + if (asprintf (&ClassTxt,"%s LINE_TOP",The_ClassDatStrong[Gbl.Prefs.Theme]) < 0) + Err_NotEnoughMemoryExit (); + Fig_ShowHierarchyRow ("",Txt_Total,ClassTxt, (int) NumCtysTotal, (int) NumInssTotal, (int) NumCtrsTotal, (int) NumDegsTotal, (int) NumCrssTotal); - Str_FreeStrings (); + free (ClassTxt); } /*****************************************************************************/ @@ -1565,9 +1579,17 @@ static void Fig_WriteRowStatsFileBrowsers1 (const char *NameOfFileZones, char StrNumGrps[Cns_MAX_DECIMAL_DIGITS_UINT + 1]; char StrNumUsrs[Cns_MAX_DECIMAL_DIGITS_UINT + 1]; char FileSizeStr[Fil_MAX_BYTES_FILE_SIZE_STRING + 1]; - const char *Class = (FileZone == Brw_UNKNOWN) ? Str_BuildString ("%s LINE_TOP", - The_ClassDatStrong[Gbl.Prefs.Theme]) : - The_ClassDat[Gbl.Prefs.Theme]; + char *Cl; + const char *Class; + + if (FileZone == Brw_UNKNOWN) + { + if (asprintf (&Cl,"%s LINE_TOP",The_ClassDatStrong[Gbl.Prefs.Theme]) < 0) + Err_NotEnoughMemoryExit (); + Class = Cl; + } + else + Class = The_ClassDat[Gbl.Prefs.Theme]; Fil_WriteFileSizeFull ((double) SizeOfFileZones->Size,FileSizeStr); @@ -1625,7 +1647,8 @@ static void Fig_WriteRowStatsFileBrowsers1 (const char *NameOfFileZones, HTM_TR_End (); - Str_FreeStrings (); + if (FileZone == Brw_UNKNOWN) + free (Cl); } static void Fig_WriteRowStatsFileBrowsers2 (const char *NameOfFileZones, @@ -1637,9 +1660,17 @@ static void Fig_WriteRowStatsFileBrowsers2 (const char *NameOfFileZones, char StrNumFoldersPerCrs[Cns_MAX_DECIMAL_DIGITS_UINT + 1]; char StrNumFilesPerCrs[Cns_MAX_DECIMAL_DIGITS_UINT + 1]; char FileSizePerCrsStr[Fil_MAX_BYTES_FILE_SIZE_STRING + 1]; - const char *Class = (FileZone == Brw_UNKNOWN) ? Str_BuildString ("%s LINE_TOP", - The_ClassDatStrong[Gbl.Prefs.Theme]) : - The_ClassDat[Gbl.Prefs.Theme]; + char *Cl; + const char *Class; + + if (FileZone == Brw_UNKNOWN) + { + if (asprintf (&Cl,"%s LINE_TOP",The_ClassDatStrong[Gbl.Prefs.Theme]) < 0) + Err_NotEnoughMemoryExit (); + Class = Cl; + } + else + Class = The_ClassDat[Gbl.Prefs.Theme]; if (SizeOfFileZones->NumCrss == -1) // Not applicable { @@ -1683,7 +1714,8 @@ static void Fig_WriteRowStatsFileBrowsers2 (const char *NameOfFileZones, HTM_TR_End (); - Str_FreeStrings (); + if (FileZone == Brw_UNKNOWN) + free (Cl); } static void Fig_WriteRowStatsFileBrowsers3 (const char *NameOfFileZones, @@ -1695,9 +1727,17 @@ static void Fig_WriteRowStatsFileBrowsers3 (const char *NameOfFileZones, char StrNumFoldersPerUsr[Cns_MAX_DECIMAL_DIGITS_UINT + 1]; char StrNumFilesPerUsr[Cns_MAX_DECIMAL_DIGITS_UINT + 1]; char FileSizePerUsrStr[Fil_MAX_BYTES_FILE_SIZE_STRING + 1]; - const char *Class = (FileZone == Brw_UNKNOWN) ? Str_BuildString ("%s LINE_TOP", - The_ClassDatStrong[Gbl.Prefs.Theme]) : - The_ClassDat[Gbl.Prefs.Theme]; + char *Cl; + const char *Class; + + if (FileZone == Brw_UNKNOWN) + { + if (asprintf (&Cl,"%s LINE_TOP",The_ClassDatStrong[Gbl.Prefs.Theme]) < 0) + Err_NotEnoughMemoryExit (); + Class = Cl; + } + else + Class = The_ClassDat[Gbl.Prefs.Theme]; if (SizeOfFileZones->NumUsrs == -1) // Not applicable { @@ -1741,7 +1781,8 @@ static void Fig_WriteRowStatsFileBrowsers3 (const char *NameOfFileZones, HTM_TR_End (); - Str_FreeStrings (); + if (FileZone == Brw_UNKNOWN) + free (Cl); } /*****************************************************************************/ @@ -3580,6 +3621,7 @@ static void Fig_GetAndShowNumUsrsPerFirstDayOfWeek (void) unsigned FirstDayOfWeek; char *SubQuery; char *Icon; + char *Title; unsigned NumUsrs[7]; // 7: seven days in a week unsigned NumUsrsTotal = 0; @@ -3624,11 +3666,11 @@ static void Fig_GetAndShowNumUsrsPerFirstDayOfWeek (void) if (asprintf (&Icon,"first-day-of-week-%u.png", FirstDayOfWeek) < 0) Err_NotEnoughMemoryExit (); - Ico_PutIcon (Icon,Ico_BLACK, - Str_BuildString (Txt_First_day_of_the_week_X, - Txt_DAYS_SMALL[FirstDayOfWeek]), - "ICO40x40"); - Str_FreeStrings (); + if (asprintf (&Title,Txt_First_day_of_the_week_X, + Txt_DAYS_SMALL[FirstDayOfWeek]) < 0) + Err_NotEnoughMemoryExit (); + Ico_PutIcon (Icon,Ico_BLACK,Title,"ICO40x40"); + free (Title); free (Icon); HTM_TD_End (); diff --git a/swad_forum.c b/swad_forum.c index e29c27d1..819c047c 100644 --- a/swad_forum.c +++ b/swad_forum.c @@ -862,6 +862,7 @@ static void For_ShowAForumPost (struct For_Forums *Forums, char Content[Cns_MAX_BYTES_LONG_TEXT + 1]; struct Med_Media Media; bool Enabled; + char *Title; /***** Initialize structure with user's data *****/ Usr_UsrDataConstructor (&UsrDat); @@ -927,28 +928,31 @@ static void For_ShowAForumPost (struct For_Forums *Forums, For_ActionsEnbPstFor[Forums->Forum.Type], For_FORUM_POSTS_SECTION_ID); For_PutParamsForum (Forums); - if (Enabled) - Ico_PutIconLink ("eye.svg",Ico_GREEN, - Str_BuildString (Txt_FORUM_Post_X_allowed_Click_to_ban_it, - PstNum)); - else - Ico_PutIconLink ("eye-slash.svg",Ico_RED, - Str_BuildString (Txt_FORUM_Post_X_banned_Click_to_unban_it, - PstNum)); - Str_FreeStrings (); + if (asprintf (&Title,Enabled ? Txt_FORUM_Post_X_allowed_Click_to_ban_it : + Txt_FORUM_Post_X_banned_Click_to_unban_it, + PstNum) < 0) + Err_NotEnoughMemoryExit (); + Ico_PutIconLink (Enabled ? "eye.svg" : + "eye-slash.svg", + Enabled ? Ico_GREEN : + Ico_RED, + Title); + free (Title); Frm_EndForm (); } else { - if (Enabled) - Ico_PutIcon ("eye.svg" ,Ico_GREEN, - Str_BuildString (Txt_FORUM_Post_X_allowed,PstNum), - "ICO_HIDDEN ICO16x16"); - else - Ico_PutIcon ("eye-slash.svg",Ico_RED , - Str_BuildString (Txt_FORUM_Post_X_banned ,PstNum), - "ICO_HIDDEN ICO16x16"); - Str_FreeStrings (); + if (asprintf (&Title,Enabled ? Txt_FORUM_Post_X_allowed : + Txt_FORUM_Post_X_banned, + PstNum) < 0) + Err_NotEnoughMemoryExit (); + Ico_PutIcon (Enabled ? "eye.svg" : + "eye-slash.svg", + Enabled ? Ico_GREEN : + Ico_RED, + Title, + "ICO_HIDDEN ICO16x16"); + free (Title); } /***** Form to remove post *****/ @@ -2673,6 +2677,7 @@ static void For_WriteFormForumPst (struct For_Forums *Forums, extern const char *Txt_MSG_Subject; extern const char *Txt_MSG_Content; extern const char *Txt_Send; + char *ClassInput; /***** Begin box *****/ if (IsReply) @@ -2743,9 +2748,10 @@ static void For_WriteFormForumPst (struct For_Forums *Forums, Lay_HelpPlainEditor (); /***** Attached image (optional) *****/ - Med_PutMediaUploader (-1,Str_BuildString ("FOR_MED_INPUT %s", - The_ClassInput[Gbl.Prefs.Theme])); - Str_FreeStrings (); + if (asprintf (&ClassInput,"FOR_MED_INPUT %s",The_ClassInput[Gbl.Prefs.Theme]) < 0) + Err_NotEnoughMemoryExit (); + Med_PutMediaUploader (-1,ClassInput); + free (ClassInput); /***** Send button *****/ Btn_PutCreateButton (Txt_Send); diff --git a/swad_game.c b/swad_game.c index 04811361..4b3309e2 100644 --- a/swad_game.c +++ b/swad_game.c @@ -1704,6 +1704,7 @@ static void Gam_ListOneOrMoreQuestionsForEdition (struct Gam_Games *Games, char StrQstInd[Cns_MAX_DECIMAL_DIGITS_UINT + 1]; bool QuestionExists; char *Anchor = NULL; + char *Title; /***** Trivial check *****/ if (!NumQsts) @@ -1771,12 +1772,13 @@ static void Gam_ListOneOrMoreQuestionsForEdition (struct Gam_Games *Games, /* Put icon to move up the question */ if (ICanEditQuestions && QstInd > 1) { + if (asprintf (&Title,Txt_Move_up_X,StrQstInd) < 0) + Err_NotEnoughMemoryExit (); Lay_PutContextualLinkOnlyIcon (ActUp_GamQst,Anchor, Gam_PutParamsOneQst,Games, "arrow-up.svg",Ico_BLACK, - Str_BuildString (Txt_Move_up_X, - StrQstInd)); - Str_FreeStrings (); + Title); + free (Title); } else Ico_PutIconOff ("arrow-up.svg",Ico_BLACK, @@ -1785,12 +1787,13 @@ static void Gam_ListOneOrMoreQuestionsForEdition (struct Gam_Games *Games, /* Put icon to move down the question */ if (ICanEditQuestions && QstInd < MaxQstInd) { + if (asprintf (&Title,Txt_Move_down_X,StrQstInd) < 0) + Err_NotEnoughMemoryExit (); Lay_PutContextualLinkOnlyIcon (ActDwnGamQst,Anchor, Gam_PutParamsOneQst,Games, "arrow-down.svg",Ico_BLACK, - Str_BuildString (Txt_Move_down_X, - StrQstInd)); - Str_FreeStrings (); + Title); + free (Title); } else Ico_PutIconOff ("arrow-down.svg",Ico_BLACK, diff --git a/swad_hierarchy_config.c b/swad_hierarchy_config.c index ea4026d5..7ada67b9 100644 --- a/swad_hierarchy_config.c +++ b/swad_hierarchy_config.c @@ -25,6 +25,10 @@ /********************************* Headers ***********************************/ /*****************************************************************************/ +#define _GNU_SOURCE // For asprintf +#include // For asprintf + +#include "swad_error.h" #include "swad_figure_cache.h" #include "swad_form.h" #include "swad_global.h" @@ -251,6 +255,7 @@ void HieCfg_NumCtrs (unsigned NumCtrs,bool PutForm) extern const char *The_ClassDat[The_NUM_THEMES]; extern const char *Txt_Centers; extern const char *Txt_Centers_of_INSTITUTION_X; + char *Title; /***** Number of centers *****/ HTM_TR_Begin (NULL); @@ -264,10 +269,11 @@ void HieCfg_NumCtrs (unsigned NumCtrs,bool PutForm) { Frm_BeginFormGoTo (ActSeeCtr); Ins_PutParamInsCod (Gbl.Hierarchy.Ins.InsCod); - HTM_BUTTON_OnSubmit_Begin (Str_BuildString (Txt_Centers_of_INSTITUTION_X, - Gbl.Hierarchy.Ins.ShrtName), - "BT_LINK",NULL); - Str_FreeStrings (); + if (asprintf (&Title,Txt_Centers_of_INSTITUTION_X, + Gbl.Hierarchy.Ins.ShrtName) < 0) + Err_NotEnoughMemoryExit (); + HTM_BUTTON_OnSubmit_Begin (Title,"BT_LINK",NULL); + free (Title); } HTM_Unsigned (NumCtrs); if (PutForm) diff --git a/swad_mail.c b/swad_mail.c index a3aac9a4..f8e6ec88 100644 --- a/swad_mail.c +++ b/swad_mail.c @@ -25,7 +25,9 @@ /********************************* Headers ***********************************/ /*****************************************************************************/ +#define _GNU_SOURCE // For asprintf #include // For NULL +#include // For asprintf #include // For calloc #include // For string functions #include // For the macro WEXITSTATUS @@ -1069,6 +1071,7 @@ static void Mai_ShowFormChangeUsrEmail (bool ItsMe, unsigned NumEmails; unsigned NumEmail; bool Confirmed; + char *Icon; static const struct { Act_Action_t Remove; @@ -1150,10 +1153,10 @@ static void Mai_ShowFormChangeUsrEmail (bool ItsMe, /* Email confirmed? */ if (Confirmed) { - Ico_PutIcon ("check-circle.svg",Ico_GREEN, - Str_BuildString (Txt_Email_X_confirmed,row[0]), - "ICO16x16"); - Str_FreeStrings (); + if (asprintf (&Icon,Txt_Email_X_confirmed,row[0]) < 0) + Err_NotEnoughMemoryExit (); + Ico_PutIcon ("check-circle.svg",Ico_GREEN,Icon,"ICO16x16"); + free (Icon); } /* Form to change user's email */ diff --git a/swad_message.c b/swad_message.c index 6b1f4179..3a05f520 100644 --- a/swad_message.c +++ b/swad_message.c @@ -227,6 +227,7 @@ static void Msg_PutFormMsgUsrs (struct Msg_Messages *Messages, unsigned NumUsrsInCrs = 0; // Initialized to avoid warning bool ShowUsrsInCrs = false; bool GetUsrsInCrs; + char *ClassInput; Gbl.Usrs.LstUsrs[Rol_STD].NumUsrs = Gbl.Usrs.LstUsrs[Rol_NET].NumUsrs = @@ -371,9 +372,11 @@ static void Msg_PutFormMsgUsrs (struct Msg_Messages *Messages, Lay_HelpPlainEditor (); /***** Attached image (optional) *****/ - Med_PutMediaUploader (-1,Str_BuildString ("MSG_MED_INPUT %s", - The_ClassInput[Gbl.Prefs.Theme])); - Str_FreeStrings (); + if (asprintf (&ClassInput,"MSG_MED_INPUT %s", + The_ClassInput[Gbl.Prefs.Theme]) < 0) + Err_NotEnoughMemoryExit (); + Med_PutMediaUploader (-1,ClassInput); + free (ClassInput); /***** Send button *****/ Btn_PutCreateButton (Txt_Send_message); diff --git a/swad_photo.c b/swad_photo.c index 5aa8a492..1732b9ff 100644 --- a/swad_photo.c +++ b/swad_photo.c @@ -626,6 +626,7 @@ static bool Pho_ReceivePhotoAndDetectFaces (bool ItsMe,const struct UsrData *Usr [Rol_SYS_ADM] = ActUpdOthPho, }; char ErrorTxt[256]; + char *Icon; /***** Creates directories if not exist *****/ Fil_CreateDirIfNotExists (Cfg_PATH_PHOTO_PRIVATE); @@ -789,11 +790,10 @@ static bool Pho_ReceivePhotoAndDetectFaces (bool ItsMe,const struct UsrData *Usr snprintf (FileNamePhotoMap,sizeof (FileNamePhotoMap),"%s/%s_map.jpg", Cfg_PATH_PHOTO_TMP_PUBLIC,Gbl.UniqueNameEncrypted); HTM_DIV_Begin ("class=\"TIT CM\""); - HTM_IMG (Cfg_URL_PHOTO_TMP_PUBLIC, - Str_BuildString ("%s_map.jpg",Gbl.UniqueNameEncrypted), - Txt_Faces_detected, - "usemap=\"#faces_map\""); - Str_FreeStrings (); + if (asprintf (&Icon,"%s_map.jpg",Gbl.UniqueNameEncrypted) < 0) + Err_NotEnoughMemoryExit (); + HTM_IMG (Cfg_URL_PHOTO_TMP_PUBLIC,Icon,Txt_Faces_detected,"usemap=\"#faces_map\""); + free (Icon); HTM_DIV_End (); /***** End alert *****/ diff --git a/swad_photo_shape.c b/swad_photo_shape.c index 8221aad9..a5b23615 100644 --- a/swad_photo_shape.c +++ b/swad_photo_shape.c @@ -70,6 +70,7 @@ void Pho_PutIconsToSelectPhotoShape (void) [Pho_SHAPE_RECTANGLE] = "ICO_HIGHLIGHT PHOTOR15x20B", }; Pho_Shape_t Shape; + char *Class; Box_BoxBegin (NULL,Txt_User_photos, Pho_PutIconsPhotoShape,NULL, @@ -87,12 +88,13 @@ void Pho_PutIconsToSelectPhotoShape (void) HTM_DIV_Begin ("class=\"PREF_OFF\""); Frm_BeginForm (ActChgUsrPho); Par_PutHiddenParamUnsigned (NULL,"PhotoShape",Shape); + if (asprintf (&Class,"%s %s", + ClassPhoto[Shape], + Ico_ClassColor[Ico_BLACK][Gbl.Prefs.Theme]) < 0) + Err_NotEnoughMemoryExit (); HTM_INPUT_IMAGE (Cfg_URL_ICON_PUBLIC,"user.svg", - Txt_PHOTO_SHAPES[Shape], - Str_BuildString ("%s %s", - ClassPhoto[Shape], - Ico_ClassColor[Ico_BLACK][Gbl.Prefs.Theme])); - Str_FreeStrings (); + Txt_PHOTO_SHAPES[Shape],Class); + free (Class); Frm_EndForm (); HTM_DIV_End (); } diff --git a/swad_timeline.c b/swad_timeline.c index d9f0f167..097ff9d0 100644 --- a/swad_timeline.c +++ b/swad_timeline.c @@ -127,6 +127,7 @@ mysql> SHOW TABLES LIKE 'tml_%'; #include // For PATH_MAX #include // For asprintf +#include "swad_error.h" #include "swad_figure.h" #include "swad_global.h" #include "swad_message.h" @@ -270,6 +271,7 @@ void Tml_ShowTimelineUsr (struct Tml_Timeline *Timeline) void Tml_ShowTimelineUsrHighlighting (struct Tml_Timeline *Timeline,long NotCod) { extern const char *Txt_Timeline_OF_A_USER; + char *Title; /***** Get list of pubications to show in timeline *****/ Timeline->UsrOrGbl = Tml_Usr_TIMELINE_USR; @@ -277,10 +279,10 @@ void Tml_ShowTimelineUsrHighlighting (struct Tml_Timeline *Timeline,long NotCod) Tml_Pub_GetListPubsToShowInTimeline (Timeline); /***** Show timeline *****/ - Tml_ShowTimeline (Timeline,NotCod, - Str_BuildString (Txt_Timeline_OF_A_USER, - Gbl.Usrs.Other.UsrDat.FrstName)); - Str_FreeStrings (); + if (asprintf (&Title,Txt_Timeline_OF_A_USER,Gbl.Usrs.Other.UsrDat.FrstName) < 0) + Err_NotEnoughMemoryExit (); + Tml_ShowTimeline (Timeline,NotCod,Title); + free (Title); /***** Free chained list of publications *****/ Tml_Pub_FreeListPubs (Timeline); diff --git a/swad_timeline_form.c b/swad_timeline_form.c index ab437300..9092afe1 100644 --- a/swad_timeline_form.c +++ b/swad_timeline_form.c @@ -299,6 +299,7 @@ void Tml_Frm_FormToShowHiddenComms (long NotCod, extern const char *Txt_See_the_previous_X_COMMENTS; char *OnSubmit; const char *Anchor; + char *Text; /***** Begin container which content will be updated via AJAX *****/ HTM_DIV_Begin ("id=\"%s\" class=\"Tml_RIGHT_WIDTH\"",IdComms); @@ -347,10 +348,10 @@ void Tml_Frm_FormToShowHiddenComms (long NotCod, HTM_BUTTON_OnSubmit_Begin (NULL, The_ClassFormLinkInBox[Gbl.Prefs.Theme], NULL); - Ico_PutIconTextLink ("angle-up.svg",Ico_BLACK, - Str_BuildString (Txt_See_the_previous_X_COMMENTS, - NumInitialComms)); - Str_FreeStrings (); + if (asprintf (&Text,Txt_See_the_previous_X_COMMENTS,NumInitialComms) < 0) + Err_NotEnoughMemoryExit (); + Ico_PutIconTextLink ("angle-up.svg",Ico_BLACK,Text); + free (Text); HTM_BUTTON_End (); /* End form */ diff --git a/swad_timeline_user.c b/swad_timeline_user.c index fae9b112..346c09b0 100644 --- a/swad_timeline_user.c +++ b/swad_timeline_user.c @@ -346,13 +346,15 @@ static void Tml_Usr_PutDisabledIconFavSha (Tml_Usr_FavSha_t FavSha, }, }, }; + char *Title; /***** Disabled icon to fav/share *****/ if (NumUsrs) { - Ico_PutDivIcon ("Tml_ICO_DISABLED",Ico[FavSha].Icon,Ico_BLACK, - Str_BuildString (*Ico[FavSha].Title.WithUsrs,NumUsrs)); - Str_FreeStrings (); + if (asprintf (&Title,*Ico[FavSha].Title.WithUsrs,NumUsrs) < 0) + Err_NotEnoughMemoryExit (); + Ico_PutDivIcon ("Tml_ICO_DISABLED",Ico[FavSha].Icon,Ico_BLACK,Title); + free (Title); } else Ico_PutDivIcon ("Tml_ICO_DISABLED",Ico[FavSha].Icon,Ico_BLACK, diff --git a/swad_user.c b/swad_user.c index f515b579..43ccea6f 100644 --- a/swad_user.c +++ b/swad_user.c @@ -1355,6 +1355,7 @@ void Usr_WriteLoggedUsrHead (void) [Pho_SHAPE_RECTANGLE] = "PHOTOR18x24", }; unsigned NumAvailableRoles = Rol_GetNumAvailableRoles (); + char *ClassSelect; HTM_DIV_Begin ("class=\"HEAD_USR USR_%s\"",The_Colors[Gbl.Prefs.Theme]); @@ -1371,9 +1372,10 @@ void Usr_WriteLoggedUsrHead (void) } else { - Rol_PutFormToChangeMyRole (Str_BuildString ("SEL_ROLE %s", - The_ClassInput[Gbl.Prefs.Theme])); - Str_FreeStrings (); + if (asprintf (&ClassSelect,"SEL_ROLE %s",The_ClassInput[Gbl.Prefs.Theme]) < 0) + Err_NotEnoughMemoryExit (); + Rol_PutFormToChangeMyRole (ClassSelect); + free (ClassSelect); } HTM_NBSP (); @@ -4728,6 +4730,7 @@ unsigned Usr_ListUsrsFound (Rol_Role_t Role, extern const char *Txt_ROLES_PLURAL_abc[Rol_NUM_ROLES][Usr_NUM_SEXS]; unsigned NumUsrs; unsigned NumUsr; + char *Title; struct UsrData UsrDat; Usr_Sex_t Sex; struct UsrInList *UsrInList; @@ -4746,14 +4749,14 @@ unsigned Usr_ListUsrsFound (Rol_Role_t Role, /***** Begin box and table *****/ /* Number of users found */ Sex = Usr_GetSexOfUsrsLst (Role); - Box_BoxTableBegin (NULL,Str_BuildString ("%u %s",NumUsrs, - (Role == Rol_UNK) ? ((NumUsrs == 1) ? Txt_user[Sex] : - Txt_users[Sex]) : - ((NumUsrs == 1) ? Txt_ROLES_SINGUL_abc[Role][Sex] : - Txt_ROLES_PLURAL_abc[Role][Sex])), - NULL,NULL, - NULL,Box_NOT_CLOSABLE,2); - Str_FreeStrings (); + if (asprintf (&Title,"%u %s",NumUsrs, + (Role == Rol_UNK) ? (NumUsrs == 1 ? Txt_user[Sex] : + Txt_users[Sex]) : + (NumUsrs == 1 ? Txt_ROLES_SINGUL_abc[Role][Sex] : + Txt_ROLES_PLURAL_abc[Role][Sex])) < 0) + Err_NotEnoughMemoryExit (); + Box_BoxTableBegin (NULL,Title,NULL,NULL,NULL,Box_NOT_CLOSABLE,2); + free (Title); /***** Heading row with column names *****/ Gbl.Usrs.Listing.WithPhotos = true;