diff --git a/swad_changelog.h b/swad_changelog.h index 47f8703dd..10a8b214a 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -602,13 +602,14 @@ 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.56.3 (2021-11-10)" +#define Log_PLATFORM_VERSION "SWAD 21.56.4 (2021-11-10)" #define CSS_FILE "swad20.45.css" #define JS_FILE "swad20.69.1.js" /* TODO: Rename CENTRE to CENTER in help wiki. TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams + Version 21.56.4: Nov 10, 2021 Code refactoring in switch statements (until swad_network_database.c). (319362 lines) Version 21.56.3: Nov 10, 2021 Code refactoring in switch statements (until swad_logo.c). (319403 lines) Version 21.56.2: Nov 10, 2021 Code refactoring in pointers to text. (319501 lines) Version 21.56.1: Nov 10, 2021 Code refactoring in switch statements (until swad_enrolment.c). (319490 lines) diff --git a/swad_mail.c b/swad_mail.c index 601d918c1..cda3eea27 100644 --- a/swad_mail.c +++ b/swad_mail.c @@ -1063,7 +1063,23 @@ static void Mai_ShowFormChangeUsrEmail (bool ItsMe, unsigned NumEmails; unsigned NumEmail; bool Confirmed; - Act_Action_t NextAction; + static const struct + { + Act_Action_t Remove; + Act_Action_t New; + } NextAction[Rol_NUM_ROLES] = + { + [Rol_UNK ] = {ActRemMaiOth,ActNewMaiOth}, + [Rol_GST ] = {ActRemMaiOth,ActNewMaiOth}, + [Rol_USR ] = {ActRemMaiOth,ActNewMaiOth}, + [Rol_STD ] = {ActRemMaiStd,ActNewMaiStd}, + [Rol_NET ] = {ActRemMaiTch,ActNewMaiTch}, + [Rol_TCH ] = {ActRemMaiTch,ActNewMaiTch}, + [Rol_DEG_ADM] = {ActRemMaiOth,ActNewMaiOth}, + [Rol_CTR_ADM] = {ActRemMaiOth,ActNewMaiOth}, + [Rol_INS_ADM] = {ActRemMaiOth,ActNewMaiOth}, + [Rol_SYS_ADM] = {ActRemMaiOth,ActNewMaiOth}, + }; const struct UsrData *UsrDat = (ItsMe ? &Gbl.Usrs.Me.UsrDat : &Gbl.Usrs.Other.UsrDat); @@ -1118,23 +1134,8 @@ static void Mai_ShowFormChangeUsrEmail (bool ItsMe, Ico_PutContextualIconToRemove (ActRemMyMai,Mai_EMAIL_SECTION_ID, Mai_PutParamsRemoveMyEmail,row[0]); else - { - switch (UsrDat->Roles.InCurrentCrs) - { - case Rol_STD: - NextAction = ActRemMaiStd; - break; - case Rol_NET: - case Rol_TCH: - NextAction = ActRemMaiTch; - break; - default: // Guest, user or admin - NextAction = ActRemMaiOth; - break; - } - Ico_PutContextualIconToRemove (NextAction,Mai_EMAIL_SECTION_ID, + Ico_PutContextualIconToRemove (NextAction[UsrDat->Roles.InCurrentCrs].Remove,Mai_EMAIL_SECTION_ID, Mai_PutParamsRemoveOtherEmail,row[0]); - } /* Email */ HTM_Txt (row[0]); @@ -1156,20 +1157,7 @@ static void Mai_ShowFormChangeUsrEmail (bool ItsMe, Frm_BeginFormAnchor (ActChgMyMai,Mai_EMAIL_SECTION_ID); else { - switch (UsrDat->Roles.InCurrentCrs) - { - case Rol_STD: - NextAction = ActNewMaiStd; - break; - case Rol_NET: - case Rol_TCH: - NextAction = ActNewMaiTch; - break; - default: // Guest, user or admin - NextAction = ActNewMaiOth; - break; - } - Frm_BeginFormAnchor (NextAction,Mai_EMAIL_SECTION_ID); + Frm_BeginFormAnchor (NextAction[UsrDat->Roles.InCurrentCrs].New,Mai_EMAIL_SECTION_ID); Usr_PutParamUsrCodEncrypted (UsrDat->EnUsrCod); } Par_PutHiddenParamString (NULL,"NewEmail",row[0]); @@ -1202,20 +1190,7 @@ static void Mai_ShowFormChangeUsrEmail (bool ItsMe, Frm_BeginFormAnchor (ActChgMyMai,Mai_EMAIL_SECTION_ID); else { - switch (UsrDat->Roles.InCurrentCrs) - { - case Rol_STD: - NextAction = ActNewMaiStd; - break; - case Rol_NET: - case Rol_TCH: - NextAction = ActNewMaiTch; - break; - default: // Guest, user or admin - NextAction = ActNewMaiOth; - break; - } - Frm_BeginFormAnchor (NextAction,Mai_EMAIL_SECTION_ID); + Frm_BeginFormAnchor (NextAction[UsrDat->Roles.InCurrentCrs].New,Mai_EMAIL_SECTION_ID); Usr_PutParamUsrCodEncrypted (UsrDat->EnUsrCod); } HTM_INPUT_EMAIL ("NewEmail",Cns_MAX_CHARS_EMAIL_ADDRESS,Gbl.Usrs.Me.UsrDat.Email, diff --git a/swad_match.c b/swad_match.c index 4dd5d94c7..c08303d9c 100644 --- a/swad_match.c +++ b/swad_match.c @@ -512,15 +512,14 @@ static void Mch_ListOneOrMoreMatchesHeading (bool ICanEditMatches) static bool Mch_CheckIfICanEditMatches (void) { - switch (Gbl.Usrs.Me.Role.Logged) + static const bool ICanEditMatches[Rol_NUM_ROLES] = { - case Rol_NET: - case Rol_TCH: - case Rol_SYS_ADM: - return true; - default: - return false; - } + [Rol_NET ] = true, + [Rol_TCH ] = true, + [Rol_SYS_ADM] = true, + }; + + return ICanEditMatches[Gbl.Usrs.Me.Role.Logged]; } /*****************************************************************************/ @@ -766,22 +765,21 @@ static void Mch_ListOneOrMoreMatchesStatus (struct Mch_Match *Match,unsigned Num static void Mch_ListOneOrMoreMatchesResult (struct Gam_Games *Games, const struct Mch_Match *Match) { + static void (*Function[Rol_NUM_ROLES]) (struct Gam_Games *Games, + const struct Mch_Match *Match) = + { + [Rol_STD ] = Mch_ListOneOrMoreMatchesResultStd, + [Rol_NET ] = Mch_ListOneOrMoreMatchesResultTch, + [Rol_TCH ] = Mch_ListOneOrMoreMatchesResultTch, + [Rol_SYS_ADM] = Mch_ListOneOrMoreMatchesResultTch, + }; + HTM_TD_Begin ("class=\"DAT CT COLOR%u\"",Gbl.RowEvenOdd); - switch (Gbl.Usrs.Me.Role.Logged) - { - case Rol_STD: - Mch_ListOneOrMoreMatchesResultStd (Games,Match); - break; - case Rol_NET: - case Rol_TCH: - case Rol_SYS_ADM: - Mch_ListOneOrMoreMatchesResultTch (Games,Match); - break; - default: + if (Function[Gbl.Usrs.Me.Role.Logged]) + Function[Gbl.Usrs.Me.Role.Logged] (Games,Match); + else Err_WrongRoleExit (); - break; - } HTM_TD_End (); } diff --git a/swad_media.c b/swad_media.c index a3fddbd66..112978c50 100644 --- a/swad_media.c +++ b/swad_media.c @@ -703,6 +703,15 @@ static void Usr_GetTitleFromForm (const char *ParamName,struct Med_Media *Media) static void Med_GetAndProcessFileFromForm (const char *ParamFile, struct Med_Media *Media) { + static void (*Process[Med_NUM_TYPES]) (struct Med_Media *Media, + const char PathFileOrg[PATH_MAX + 1]) = + { + [Med_JPG ] = Med_ProcessJPG, + [Med_GIF ] = Med_ProcessGIF, + [Med_MP4 ] = Med_ProcessVideo, + [Med_WEBM] = Med_ProcessVideo, + [Med_OGG ] = Med_ProcessVideo, + }; struct Param *Param; char FileNameImgSrc[PATH_MAX + 1]; char *PtrExtension; @@ -760,22 +769,8 @@ static void Med_GetAndProcessFileFromForm (const char *ParamFile, Media->Type = Med_JPG; /***** Process media depending on the media file extension *****/ - switch (Media->Type) - { - case Med_JPG: - Med_ProcessJPG (Media,PathFileOrg); - break; - case Med_GIF: - Med_ProcessGIF (Media,PathFileOrg); - break; - case Med_MP4: - case Med_WEBM: - case Med_OGG: - Med_ProcessVideo (Media,PathFileOrg); - break; - default: - break; - } + if (Process[Media->Type]) + Process[Media->Type] (Media,PathFileOrg); } /***** Remove temporary original file *****/ @@ -1393,6 +1388,16 @@ void Med_StoreMediaInDB (struct Med_Media *Media) void Med_ShowMedia (const struct Med_Media *Media, const char *ClassContainer,const char *ClassMedia) { + static void (*Show[Med_NUM_TYPES]) (const struct Med_Media *Media, + const char PathMedPriv[PATH_MAX + 1], + const char *ClassMedia) = + { + [Med_JPG ] = Med_ShowJPG, + [Med_GIF ] = Med_ShowGIF, + [Med_MP4 ] = Med_ShowVideo, + [Med_WEBM] = Med_ShowVideo, + [Med_OGG ] = Med_ShowVideo, + }; bool PutLink; char PathMedPriv[PATH_MAX + 1]; @@ -1435,22 +1440,8 @@ void Med_ShowMedia (const struct Med_Media *Media, Media->Name[1]); /* Show media */ - switch (Media->Type) - { - case Med_JPG: - Med_ShowJPG (Media,PathMedPriv,ClassMedia); - break; - case Med_GIF: - Med_ShowGIF (Media,PathMedPriv,ClassMedia); - break; - case Med_MP4: - case Med_WEBM: - case Med_OGG: - Med_ShowVideo (Media,PathMedPriv,ClassMedia); - break; - default: - break; - } + if (Show[Media->Type]) + Show[Media->Type] (Media,PathMedPriv,ClassMedia); /* End optional link to external URL */ if (PutLink) diff --git a/swad_message.c b/swad_message.c index 828cdf43c..0ec6d919d 100644 --- a/swad_message.c +++ b/swad_message.c @@ -1788,11 +1788,17 @@ static void Msg_ShowFormSelectCourseSentOrRecMsgs (const struct Msg_Messages *Me extern const char *Txt_Messages_received_from_A_COURSE; extern const char *Txt_Messages_sent_from_A_COURSE; extern const char *Txt_any_course; + static unsigned (*GetDistinctCrssInMyRcvMsgs[Msg_NUM_TYPES_OF_MSGS]) (MYSQL_RES **mysql_res) = + { + [Msg_WRITING ] = NULL, + [Msg_RECEIVED] = Msg_DB_GetDistinctCrssInMyRcvMsgs, + [Msg_SENT ] = Msg_DB_GetDistinctCrssInMySntMsgs, + }; static const char **TxtSelector[Msg_NUM_TYPES_OF_MSGS] = { [Msg_WRITING ] = NULL, [Msg_RECEIVED] = &Txt_Messages_received_from_A_COURSE, - [Msg_SENT ] = &Txt_Messages_sent_from_A_COURSE + [Msg_SENT ] = &Txt_Messages_sent_from_A_COURSE, }; MYSQL_RES *mysql_res; MYSQL_ROW row; @@ -1801,17 +1807,8 @@ static void Msg_ShowFormSelectCourseSentOrRecMsgs (const struct Msg_Messages *Me long CrsCod; /***** Get distinct courses in my messages *****/ - switch (Messages->TypeOfMessages) - { - case Msg_RECEIVED: - NumCrss = Msg_DB_GetDistinctCrssInMyRcvMsgs (&mysql_res); - break; - case Msg_SENT: - NumCrss = Msg_DB_GetDistinctCrssInMySntMsgs (&mysql_res); - break; - default: // Not aplicable here - break; - } + if (GetDistinctCrssInMyRcvMsgs[Messages->TypeOfMessages]) + NumCrss = GetDistinctCrssInMyRcvMsgs[Messages->TypeOfMessages] (&mysql_res); /***** Course selection *****/ HTM_LABEL_Begin ("class=\"%s\"",The_ClassFormInBox[Gbl.Prefs.Theme]); diff --git a/swad_message.h b/swad_message.h index 8d4e58bb2..09a1d2d33 100644 --- a/swad_message.h +++ b/swad_message.h @@ -52,6 +52,7 @@ typedef enum Msg_SENT, } Msg_TypeOfMessages_t; +#define Msg_NUM_STATUS 3 typedef enum { Msg_STATUS_ALL, diff --git a/swad_message_database.c b/swad_message_database.c index 1c513da81..82ecf5fee 100644 --- a/swad_message_database.c +++ b/swad_message_database.c @@ -980,24 +980,19 @@ unsigned Msg_DB_GetKnownRecipients (MYSQL_RES **mysql_res,long MsgCod) unsigned Msg_DB_GetNumSntMsgs (HieLvl_Level_t Scope,Msg_Status_t MsgStatus) { - const char *Table = "msg_snt"; + static const char *Table[Msg_NUM_STATUS] = + { + [Msg_STATUS_ALL ] = "msg_snt", + [Msg_STATUS_DELETED ] = "msg_snt_deleted", + [Msg_STATUS_NOTIFIED] = "msg_snt", + }; /***** Get the number of messages sent from this location (all the platform, current degree or current course) from database *****/ - switch (MsgStatus) - { - case Msg_STATUS_ALL: - case Msg_STATUS_NOTIFIED: - Table = "msg_snt"; - break; - case Msg_STATUS_DELETED: - Table = "msg_snt_deleted"; - break; - } switch (Scope) { case HieLvl_SYS: - return (unsigned) DB_GetNumRowsTable (Table); + return (unsigned) DB_GetNumRowsTable (Table[MsgStatus]); case HieLvl_CTY: return (unsigned) DB_QueryCOUNT ("can not get number of sent messages", @@ -1012,9 +1007,9 @@ unsigned Msg_DB_GetNumSntMsgs (HieLvl_Level_t Scope,Msg_Status_t MsgStatus) " AND ctr_centers.CtrCod=deg_degrees.CtrCod" " AND deg_degrees.DegCod=crs_courses.DegCod" " AND crs_courses.CrsCod=%s.CrsCod", - Table, + Table[MsgStatus], Gbl.Hierarchy.Cty.CtyCod, - Table); + Table[MsgStatus]); case HieLvl_INS: return (unsigned) DB_QueryCOUNT ("can not get number of sent messages", @@ -1027,9 +1022,9 @@ unsigned Msg_DB_GetNumSntMsgs (HieLvl_Level_t Scope,Msg_Status_t MsgStatus) " AND ctr_centers.CtrCod=deg_degrees.CtrCod" " AND deg_degrees.DegCod=crs_courses.DegCod" " AND crs_courses.CrsCod=%s.CrsCod", - Table, + Table[MsgStatus], Gbl.Hierarchy.Ins.InsCod, - Table); + Table[MsgStatus]); case HieLvl_CTR: return (unsigned) DB_QueryCOUNT ("can not get number of sent messages", @@ -1040,9 +1035,9 @@ unsigned Msg_DB_GetNumSntMsgs (HieLvl_Level_t Scope,Msg_Status_t MsgStatus) " WHERE deg_degrees.CtrCod=%ld" " AND deg_degrees.DegCod=crs_courses.DegCod" " AND crs_courses.CrsCod=%s.CrsCod", - Table, + Table[MsgStatus], Gbl.Hierarchy.Ctr.CtrCod, - Table); + Table[MsgStatus]); case HieLvl_DEG: return (unsigned) DB_QueryCOUNT ("can not get number of sent messages", @@ -1051,16 +1046,16 @@ unsigned Msg_DB_GetNumSntMsgs (HieLvl_Level_t Scope,Msg_Status_t MsgStatus) "%s" " WHERE crs_courses.DegCod=%ld" " AND crs_courses.CrsCod=%s.CrsCod", - Table, + Table[MsgStatus], Gbl.Hierarchy.Deg.DegCod, - Table); + Table[MsgStatus]); case HieLvl_CRS: return (unsigned) DB_QueryCOUNT ("can not get number of sent messages", "SELECT COUNT(*)" " FROM %s" " WHERE CrsCod=%ld", - Table, + Table[MsgStatus], Gbl.Hierarchy.Crs.CrsCod); default: return 0; @@ -1074,7 +1069,12 @@ unsigned Msg_DB_GetNumSntMsgs (HieLvl_Level_t Scope,Msg_Status_t MsgStatus) unsigned Msg_DB_GetNumRcvMsgs (HieLvl_Level_t Scope,Msg_Status_t MsgStatus) { - char *Table; + static const char *Table[Msg_NUM_STATUS] = + { + [Msg_STATUS_ALL ] = "msg_rcv", + [Msg_STATUS_DELETED ] = "msg_rcv_deleted", + [Msg_STATUS_NOTIFIED] = "msg_rcv", // Not used + }; /***** Get the number of unique messages sent from this location (all the platform, current degree or current course) from database *****/ @@ -1082,12 +1082,10 @@ unsigned Msg_DB_GetNumRcvMsgs (HieLvl_Level_t Scope,Msg_Status_t MsgStatus) { case Msg_STATUS_ALL: case Msg_STATUS_DELETED: - Table = (MsgStatus == Msg_STATUS_ALL) ? "msg_rcv" : - "msg_rcv_deleted"; switch (Scope) { case HieLvl_SYS: - return (unsigned) DB_GetNumRowsTable (Table); + return (unsigned) DB_GetNumRowsTable (Table[MsgStatus]); case HieLvl_CTY: return (unsigned) DB_QueryCOUNT ("can not get number of received messages", @@ -1104,9 +1102,9 @@ unsigned Msg_DB_GetNumRcvMsgs (HieLvl_Level_t Scope,Msg_Status_t MsgStatus) " AND deg_degrees.DegCod=crs_courses.DegCod" " AND crs_courses.CrsCod=msg_snt.CrsCod" " AND msg_snt.MsgCod=%s.MsgCod", - Table, + Table[MsgStatus], Gbl.Hierarchy.Cty.CtyCod, - Table); + Table[MsgStatus]); case HieLvl_INS: return (unsigned) DB_QueryCOUNT ("can not get number of received messages", @@ -1121,9 +1119,9 @@ unsigned Msg_DB_GetNumRcvMsgs (HieLvl_Level_t Scope,Msg_Status_t MsgStatus) " AND deg_degrees.DegCod=crs_courses.DegCod" " AND crs_courses.CrsCod=msg_snt.CrsCod" " AND msg_snt.MsgCod=%s.MsgCod", - Table, + Table[MsgStatus], Gbl.Hierarchy.Ins.InsCod, - Table); + Table[MsgStatus]); case HieLvl_CTR: return (unsigned) DB_QueryCOUNT ("can not get number of received messages", @@ -1136,9 +1134,9 @@ unsigned Msg_DB_GetNumRcvMsgs (HieLvl_Level_t Scope,Msg_Status_t MsgStatus) " AND deg_degrees.DegCod=crs_courses.DegCod" " AND crs_courses.CrsCod=msg_snt.CrsCod" " AND msg_snt.MsgCod=%s.MsgCod", - Table, + Table[MsgStatus], Gbl.Hierarchy.Ctr.CtrCod, - Table); + Table[MsgStatus]); case HieLvl_DEG: return (unsigned) DB_QueryCOUNT ("can not get number of received messages", @@ -1149,9 +1147,9 @@ unsigned Msg_DB_GetNumRcvMsgs (HieLvl_Level_t Scope,Msg_Status_t MsgStatus) " WHERE crs_courses.DegCod=%ld" " AND crs_courses.CrsCod=msg_snt.CrsCod" " AND msg_snt.MsgCod=%s.MsgCod", - Table, + Table[MsgStatus], Gbl.Hierarchy.Deg.DegCod, - Table); + Table[MsgStatus]); case HieLvl_CRS: return (unsigned) DB_QueryCOUNT ("can not get number of received messages", @@ -1160,9 +1158,9 @@ unsigned Msg_DB_GetNumRcvMsgs (HieLvl_Level_t Scope,Msg_Status_t MsgStatus) "%s" " WHERE msg_snt.CrsCod=%ld" " AND msg_snt.MsgCod=%s.MsgCod", - Table, + Table[MsgStatus], Gbl.Hierarchy.Crs.CrsCod, - Table); + Table[MsgStatus]); case HieLvl_UNK: default: return 0;