Version19.93

This commit is contained in:
Antonio Cañas Vargas 2019-12-15 20:02:34 +01:00
parent 9ad0384944
commit 22dea9e2af
39 changed files with 5088 additions and 4810 deletions

View File

@ -1052,7 +1052,7 @@ void Ctr_GetListCentres (long InsCod)
static const char *OrderBySubQuery[Ctr_NUM_ORDERS] =
{
[Ctr_ORDER_BY_CENTRE ] = "FullName",
[Ctr_ORDER_BY_NUM_TCHS] = "NumUsrs DESC,FullName",
[Ctr_ORDER_BY_NUM_USRS] = "NumUsrs DESC,FullName",
};
MYSQL_RES *mysql_res;
MYSQL_ROW row;
@ -2576,8 +2576,8 @@ static void Ctr_PutHeadCentresForSeeing (bool OrderSelectable)
HTM_TH_Empty (1);
for (Order = Ctr_ORDER_BY_CENTRE;
Order <= Ctr_ORDER_BY_NUM_TCHS;
for (Order = (Ctr_Order_t) 0;
Order <= (Ctr_Order_t) (Ctr_NUM_ORDERS - 1);
Order++)
{
HTM_TH_Begin (1,1,Order == Ctr_ORDER_BY_CENTRE ? "LM" :

View File

@ -79,7 +79,7 @@ struct Centre
typedef enum
{
Ctr_ORDER_BY_CENTRE = 0,
Ctr_ORDER_BY_NUM_TCHS = 1,
Ctr_ORDER_BY_NUM_USRS = 1,
} Ctr_Order_t;
#define Ctr_ORDER_DEFAULT Ctr_ORDER_BY_CENTRE

View File

@ -490,13 +490,14 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - *
En OpenSWAD:
ps2pdf source.ps destination.pdf
*/
#define Log_PLATFORM_VERSION "SWAD 19.92.1 (2019-12-15)"
#define Log_PLATFORM_VERSION "SWAD 19.93 (2019-12-15)"
#define CSS_FILE "swad19.90.1.css"
#define JS_FILE "swad19.91.1.js"
/*
// TODO: Hacer un nuevo rol en los TFG: tutor externo (profesor de áreas no vinculadas con el centro, profesionales de empresas, etc.)
// TODO: Impedir la creación y edición de proyectos si no son editables.
Version 19.93: Dec 15, 2019 Code refactoring. (248907 lines)
Version 19.92.1: Dec 15, 2019 Code refactoring. (248629 lines)
Version 19.92: Dec 14, 2019 New module for log database tables. (248625 lines)
Version 19.91.2: Dec 14, 2019 Code refactoring related to doubles. (248538 lines)

View File

@ -2771,8 +2771,8 @@ static void Fig_GetAndShowOERsStats (void)
HTM_TR_End ();
for (License = 0;
License < Brw_NUM_LICENSES;
for (License = (Brw_License_t) 0;
License <= (Brw_License_t) (Brw_NUM_LICENSES - 1);
License++)
{
Fig_GetNumberOfOERsFromDB (Gbl.Scope.Current,License,NumFiles);
@ -3089,7 +3089,7 @@ static void Fig_GetAndShowTestsStats (void)
HTM_TR_End ();
for (AnsType = (Tst_AnswerType_t) 0;
AnsType < Tst_NUM_ANS_TYPES;
AnsType <= (Tst_AnswerType_t) (Tst_NUM_ANS_TYPES - 1);
AnsType++)
{
/***** Get the stats about test questions from this location *****/
@ -3294,7 +3294,7 @@ static void Fig_GetAndShowTimelineActivityStats (void)
/***** Get total number of following/followers from database *****/
for (NoteType = (TL_NoteType_t) 0;
NoteType < TL_NUM_NOTE_TYPES;
NoteType <= (TL_NoteType_t) (TL_NUM_NOTE_TYPES - 1);
NoteType++)
{
switch (Gbl.Scope.Current)
@ -4233,7 +4233,7 @@ static void Fig_GetAndShowNumUsrsPerNotifyEvent (void)
/***** For each notify event... *****/
for (NotifyEvent = (Ntf_NotifyEvent_t) 1;
NotifyEvent < Ntf_NUM_NOTIFY_EVENTS;
NotifyEvent <= (Ntf_NotifyEvent_t) (Ntf_NUM_NOTIFY_EVENTS - 1);
NotifyEvent++) // 0 is reserved for Ntf_EVENT_UNKNOWN
{
/* Get the number of users who want to be notified by email on this event, from database */
@ -4340,7 +4340,7 @@ static void Fig_GetAndShowNumUsrsPerNotifyEvent (void)
/***** Write number of users who want to be notified by email on each event *****/
for (NotifyEvent = (Ntf_NotifyEvent_t) 1;
NotifyEvent < Ntf_NUM_NOTIFY_EVENTS;
NotifyEvent <= (Ntf_NotifyEvent_t) (Ntf_NUM_NOTIFY_EVENTS - 1);
NotifyEvent++) // 0 is reserved for Ntf_EVENT_UNKNOWN
{
HTM_TR_Begin (NULL);
@ -4423,7 +4423,7 @@ static void Fig_GetAndShowNoticesStats (void)
/***** Get the number of notices active and obsolete *****/
for (NoticeStatus = (Not_Status_t) 0;
NoticeStatus < Not_NUM_STATUS;
NoticeStatus <= (Not_Status_t) (Not_NUM_STATUS - 1);
NoticeStatus++)
{
NumNotices[NoticeStatus] = Not_GetNumNotices (Gbl.Scope.Current,NoticeStatus,&NumNotif);
@ -4706,7 +4706,7 @@ static void Fig_GetAndShowNumUsrsPerPrivacyForAnObject (const char *TxtObject,
/***** For each privacy option... *****/
for (Visibility = (Pri_Visibility_t) 0;
Visibility < Pri_NUM_OPTIONS_PRIVACY;
Visibility <= (Pri_Visibility_t) (Pri_NUM_OPTIONS_PRIVACY - 1);
Visibility++)
if (MaskAllowedVisibility & (1 << Visibility))
{
@ -4723,7 +4723,7 @@ static void Fig_GetAndShowNumUsrsPerPrivacyForAnObject (const char *TxtObject,
/***** Write number of users who have chosen each privacy option *****/
for (Visibility = (Pri_Visibility_t) 0;
Visibility < Pri_NUM_OPTIONS_PRIVACY;
Visibility <= (Pri_Visibility_t) (Pri_NUM_OPTIONS_PRIVACY - 1);
Visibility++)
if (MaskAllowedVisibility & (1 << Visibility))
{
@ -4761,18 +4761,18 @@ static void Fig_GetAndShowNumUsrsPerCookies (void)
unsigned i;
static const char AcceptedInDB[2] =
{
'N', // false
'Y' // true
[false] = 'N',
[true ] = 'Y'
};
static const char *AcceptedClass[2] =
{
"DAT_RED", // false
"DAT_GREEN" // true
[false] = "DAT_RED",
[true ] = "DAT_GREEN"
};
static const char *AcceptedSymbol[2] =
{
"&cross;", // false
"&check;" // true
[false] = "&cross;",
[true ] = "&check;"
};
char *SubQuery;
@ -4869,7 +4869,7 @@ static void Fig_GetAndShowNumUsrsPerLanguage (void)
/***** For each language... *****/
for (Lan = (Lan_Language_t) 1;
Lan <= Lan_NUM_LANGUAGES;
Lan <= (Lan_Language_t) Lan_NUM_LANGUAGES;
Lan++)
{
/* Get the number of users who have chosen this language from database */
@ -4885,7 +4885,7 @@ static void Fig_GetAndShowNumUsrsPerLanguage (void)
/***** Write number of users who have chosen each language *****/
for (Lan = (Lan_Language_t) 1;
Lan <= Lan_NUM_LANGUAGES;
Lan <= (Lan_Language_t) Lan_NUM_LANGUAGES;
Lan++)
{
HTM_TR_Begin (NULL);
@ -5107,7 +5107,7 @@ static void Fig_GetAndShowNumUsrsPerIconSet (void)
/***** For each icon set... *****/
for (IconSet = (Ico_IconSet_t) 0;
IconSet < Ico_NUM_ICON_SETS;
IconSet <= (Ico_IconSet_t) (Ico_NUM_ICON_SETS - 1);
IconSet++)
{
/* Get the number of users who have chosen this icon set from database */
@ -5123,7 +5123,7 @@ static void Fig_GetAndShowNumUsrsPerIconSet (void)
/***** Write number of users who have chosen each icon set *****/
for (IconSet = (Ico_IconSet_t) 0;
IconSet < Ico_NUM_ICON_SETS;
IconSet <= (Ico_IconSet_t) (Ico_NUM_ICON_SETS - 1);
IconSet++)
{
HTM_TR_Begin (NULL);
@ -5187,7 +5187,7 @@ static void Fig_GetAndShowNumUsrsPerMenu (void)
/***** For each menu... *****/
for (Menu = (Mnu_Menu_t) 0;
Menu < Mnu_NUM_MENUS;
Menu <= (Mnu_Menu_t) (Mnu_NUM_MENUS - 1);
Menu++)
{
/* Get number of users who have chosen this menu from database */
@ -5203,7 +5203,7 @@ static void Fig_GetAndShowNumUsrsPerMenu (void)
/***** Write number of users who have chosen each menu *****/
for (Menu = (Mnu_Menu_t) 0;
Menu < Mnu_NUM_MENUS;
Menu <= (Mnu_Menu_t) (Mnu_NUM_MENUS - 1);
Menu++)
{
HTM_TR_Begin (NULL);
@ -5263,7 +5263,7 @@ static void Fig_GetAndShowNumUsrsPerTheme (void)
/***** For each theme... *****/
for (Theme = (The_Theme_t) 0;
Theme < The_NUM_THEMES;
Theme <= (The_Theme_t) (The_NUM_THEMES - 1);
Theme++)
{
/* Get number of users who have chosen this theme from database */
@ -5279,7 +5279,7 @@ static void Fig_GetAndShowNumUsrsPerTheme (void)
/***** Write number of users who have chosen each theme *****/
for (Theme = (The_Theme_t) 0;
Theme < The_NUM_THEMES;
Theme <= (The_Theme_t) (The_NUM_THEMES - 1);
Theme++)
{
HTM_TR_Begin (NULL);

View File

@ -2374,7 +2374,7 @@ static void Brw_GetParamsPathInTreeAndFileName (void)
/***** Get the name of the file, folder or link *****/
Gbl.FileBrowser.FilFolLnk.Type = Brw_IS_UNKNOWN;
for (FileType = (Brw_FileType_t) 0;
FileType < Brw_NUM_FILE_TYPES;
FileType <= (Brw_FileType_t) (Brw_NUM_FILE_TYPES - 1);
FileType++)
// File names with heading and trailing spaces are allowed
if (Par_GetParAndChangeFormat (Brw_FileTypeParamName[FileType],
@ -3540,7 +3540,6 @@ static void Brw_ShowFileBrowser (void)
extern const char *Txt_Temporary_private_storage_area;
extern const char *Txt_Project_documents;
extern const char *Txt_Project_assessment;
const char *Brw_TitleOfFileBrowser[Brw_NUM_TYPES_FILE_BROWSER];
const char *Brw_HelpOfFileBrowser[Brw_NUM_TYPES_FILE_BROWSER];
struct Brw_NumObjects Removed;
@ -9649,8 +9648,8 @@ void Brw_ShowFileMetadata (void)
{
HTM_SELECT_Begin (false,
"id=\"License\" name=\"License\" class=\"LICENSE\"");
for (License = 0;
License < Brw_NUM_LICENSES;
for (License = (Brw_License_t) 0;
License <= (Brw_License_t) (Brw_NUM_LICENSES - 1);
License++)
{
LicenseUnsigned = (unsigned) License;

View File

@ -1750,7 +1750,7 @@ static void For_PutFormWhichForums (void)
HTM_UL_Begin (NULL);
for (ForumSet = (For_ForumSet_t) 0;
ForumSet < For_NUM_FORUM_SETS;
ForumSet <= (For_ForumSet_t) (For_NUM_FORUM_SETS - 1);
ForumSet++)
{
HTM_LI_Begin (NULL);

View File

@ -195,7 +195,7 @@ void Gbl_InitializeGlobals (void)
Gbl.Usrs.Selected.ParamSuffix = NULL;// Don't add suffix to param names
Gbl.Usrs.Selected.Option = Usr_OPTION_UNKNOWN;
for (Role = (Rol_Role_t) 0;
Role < Rol_NUM_ROLES;
Role <= (Rol_Role_t) (Rol_NUM_ROLES - 1);
Role++)
{
Gbl.Usrs.LstUsrs[Role].Lst = NULL;
@ -462,7 +462,7 @@ void Gbl_Cleanup (void)
Plg_FreeListPlugins ();
for (Role = (Rol_Role_t) 0;
Role < Rol_NUM_ROLES;
Role <= (Rol_Role_t) (Rol_NUM_ROLES - 1);
Role++)
Usr_FreeUsrsList (Role);

View File

@ -606,7 +606,7 @@ static void Hld_ListHolidaysForEdition (void)
HTM_SELECT_Begin (true,
"name=\"HldTyp\" style=\"width:62px;\"");
for (HolidayType = (Hld_HolidayType_t) 0;
HolidayType < Hld_NUM_TYPES_HOLIDAY;
HolidayType <= (Hld_HolidayType_t) (Hld_NUM_TYPES_HOLIDAY - 1);
HolidayType++)
{
HolidayTypeUnsigned = (unsigned) HolidayType;
@ -785,7 +785,7 @@ void Hld_ChangeHolidayType (void)
void Hld_ChangeStartDate (void)
{
Hld_ChangeDate (HLD_START_DATE);
Hld_ChangeDate (Hld_START_DATE);
}
/*****************************************************************************/
@ -794,7 +794,7 @@ void Hld_ChangeStartDate (void)
void Hld_ChangeEndDate (void)
{
Hld_ChangeDate (HLD_END_DATE);
Hld_ChangeDate (Hld_END_DATE);
}
/*****************************************************************************/
@ -822,7 +822,7 @@ static void Hld_ChangeDate (Hld_StartOrEndDate_t StartOrEndDate)
/***** Get the new date for the holiday *****/
switch (StartOrEndDate)
{
case HLD_START_DATE:
case Hld_START_DATE:
StrStartOrEndDate = "StartDate";
PtrDate = &Hld_EditingHld->StartDate;
Dat_GetDateFromForm ("StartDay","StartMonth","StartYear",
@ -832,7 +832,7 @@ static void Hld_ChangeDate (Hld_StartOrEndDate_t StartOrEndDate)
NewDate.Year == 0)
Dat_AssignDate (&NewDate,&Gbl.Now.Date);
break;
case HLD_END_DATE:
case Hld_END_DATE:
StrStartOrEndDate = "EndDate";
PtrDate = &Hld_EditingHld->EndDate;
switch (Hld_EditingHld->HldTyp)
@ -1000,7 +1000,7 @@ static void Hld_PutFormToCreateHoliday (void)
HTM_SELECT_Begin (false,
"name=\"HldTyp\" style=\"width:62px;\"");
for (HolidayType = (Hld_HolidayType_t) 0;
HolidayType < Hld_NUM_TYPES_HOLIDAY;
HolidayType <= (Hld_HolidayType_t) (Hld_NUM_TYPES_HOLIDAY - 1);
HolidayType++)
{
HolidayTypeUnsigned = (unsigned) HolidayType;

View File

@ -47,8 +47,8 @@ typedef enum
typedef enum
{
HLD_START_DATE,
HLD_END_DATE
Hld_START_DATE,
Hld_END_DATE
} Hld_StartOrEndDate_t;
struct Holiday

View File

@ -121,7 +121,7 @@ void Ico_PutIconsToSelectIconSet (void)
Set_StartSettingsHead ();
Set_StartOneSettingSelector ();
for (IconSet = (Ico_IconSet_t) 0;
IconSet < Ico_NUM_ICON_SETS;
IconSet <= (Ico_IconSet_t) (Ico_NUM_ICON_SETS - 1);
IconSet++)
{
HTM_DIV_Begin ("class=\"%s\"",
@ -188,7 +188,7 @@ Ico_IconSet_t Ico_GetParamIconSet (void)
Par_GetParToText ("IconSet",IconSetId,Ico_MAX_BYTES_ICON_SET_ID);
for (IconSet = (Ico_IconSet_t) 0;
IconSet < Ico_NUM_ICON_SETS;
IconSet <= (Ico_IconSet_t) (Ico_NUM_ICON_SETS - 1);
IconSet++)
if (!strcmp (IconSetId,Ico_IconSetId[IconSet]))
return IconSet;
@ -205,7 +205,7 @@ Ico_IconSet_t Ico_GetIconSetFromStr (const char *Str)
Ico_IconSet_t IconSet;
for (IconSet = (Ico_IconSet_t) 0;
IconSet < Ico_NUM_ICON_SETS;
IconSet <= (Ico_IconSet_t) (Ico_NUM_ICON_SETS - 1);
IconSet++)
if (!strcasecmp (Str,Ico_IconSetId[IconSet]))
return IconSet;

View File

@ -516,7 +516,7 @@ bool Inf_GetIfIMustReadAnyCrsInfoInThisCrs (void)
/***** Reset must-be-read to false for all info types *****/
for (InfoType = (Inf_InfoType_t) 0;
InfoType < Inf_NUM_INFO_TYPES;
InfoType <= (Inf_InfoType_t) (Inf_NUM_INFO_TYPES - 1);
InfoType++)
Gbl.Crs.Info.MustBeRead[InfoType] = false;
@ -573,7 +573,7 @@ void Inf_WriteMsgYouMustReadInfo (void)
HTM_DIV_Begin ("class=\"CM\"");
HTM_UL_Begin ("class=\"LIST_I_MUST_READ\"");
for (InfoType = (Inf_InfoType_t) 0;
InfoType < Inf_NUM_INFO_TYPES;
InfoType <= (Inf_InfoType_t) (Inf_NUM_INFO_TYPES - 1);
InfoType++)
if (Gbl.Crs.Info.MustBeRead[InfoType])
{
@ -1060,14 +1060,14 @@ void Inf_FormsToSelSendInfo (void)
bool MustBeRead;
const char *HelpEdit[Inf_NUM_INFO_TYPES] =
{
Hlp_COURSE_Information_edit, // Inf_INTRODUCTION
Hlp_COURSE_Guide_edit, // Inf_TEACHING_GUIDE
Hlp_COURSE_Syllabus_edit, // Inf_LECTURES
Hlp_COURSE_Syllabus_edit, // Inf_PRACTICALS
Hlp_COURSE_Bibliography_edit, // Inf_BIBLIOGRAPHY
Hlp_COURSE_FAQ_edit, // Inf_FAQ
Hlp_COURSE_Links_edit, // Inf_LINKS
Hlp_ASSESSMENT_System_edit, // Inf_ASSESSMENT
[Inf_INTRODUCTION ] = Hlp_COURSE_Information_edit,
[Inf_TEACHING_GUIDE] = Hlp_COURSE_Guide_edit,
[Inf_LECTURES ] = Hlp_COURSE_Syllabus_edit,
[Inf_PRACTICALS ] = Hlp_COURSE_Syllabus_edit,
[Inf_BIBLIOGRAPHY ] = Hlp_COURSE_Bibliography_edit,
[Inf_FAQ ] = Hlp_COURSE_FAQ_edit,
[Inf_LINKS ] = Hlp_COURSE_Links_edit,
[Inf_ASSESSMENT ] = Hlp_ASSESSMENT_System_edit,
};
/***** Set info type *****/
@ -1080,7 +1080,7 @@ void Inf_FormsToSelSendInfo (void)
/***** Check if info available *****/
for (InfoSrc = (Inf_InfoSrc_t) 0;
InfoSrc < Inf_NUM_INFO_SOURCES;
InfoSrc <= (Inf_InfoSrc_t) (Inf_NUM_INFO_SOURCES - 1);
InfoSrc++)
InfoAvailable[InfoSrc] = Inf_CheckIfInfoAvailable (InfoSrc);
@ -1100,7 +1100,7 @@ void Inf_FormsToSelSendInfo (void)
/* Options */
for (InfoSrc = (Inf_InfoSrc_t) 0;
InfoSrc < Inf_NUM_INFO_SOURCES;
InfoSrc <= (Inf_InfoSrc_t) (Inf_NUM_INFO_SOURCES - 1);
InfoSrc++)
{
HTM_TR_Begin (NULL);
@ -1617,7 +1617,7 @@ Inf_InfoType_t Inf_ConvertFromStrDBToInfoType (const char *StrInfoTypeDB)
Inf_InfoType_t InfoType;
for (InfoType = (Inf_InfoType_t) 0;
InfoType < Inf_NUM_INFO_TYPES;
InfoType <= (Inf_InfoType_t) (Inf_NUM_INFO_TYPES - 1);
InfoType++)
if (!strcmp (StrInfoTypeDB,Inf_NamesInDBForInfoType[InfoType]))
return InfoType;
@ -1634,7 +1634,7 @@ Inf_InfoSrc_t Inf_ConvertFromStrDBToInfoSrc (const char *StrInfoSrcDB)
Inf_InfoSrc_t InfoSrc;
for (InfoSrc = (Inf_InfoSrc_t) 0;
InfoSrc < Inf_NUM_INFO_SOURCES;
InfoSrc <= (Inf_InfoSrc_t) (Inf_NUM_INFO_SOURCES - 1);
InfoSrc++)
if (!strcmp (StrInfoSrcDB,Inf_NamesInDBForInfoSrc[InfoSrc]))
return InfoSrc;
@ -2016,14 +2016,14 @@ void Inf_EditPlainTxtInfo (void)
char TxtHTML[Cns_MAX_BYTES_LONG_TEXT + 1];
const char *HelpEdit[Inf_NUM_INFO_TYPES] =
{
Hlp_COURSE_Information_edit, // Inf_INTRODUCTION
Hlp_COURSE_Guide_edit, // Inf_TEACHING_GUIDE
Hlp_COURSE_Syllabus_edit, // Inf_LECTURES
Hlp_COURSE_Syllabus_edit, // Inf_PRACTICALS
Hlp_COURSE_Bibliography_edit, // Inf_BIBLIOGRAPHY
Hlp_COURSE_FAQ_edit, // Inf_FAQ
Hlp_COURSE_Links_edit, // Inf_LINKS
Hlp_ASSESSMENT_System_edit, // Inf_ASSESSMENT
[Inf_INTRODUCTION ] = Hlp_COURSE_Information_edit,
[Inf_TEACHING_GUIDE] = Hlp_COURSE_Guide_edit,
[Inf_LECTURES ] = Hlp_COURSE_Syllabus_edit,
[Inf_PRACTICALS ] = Hlp_COURSE_Syllabus_edit,
[Inf_BIBLIOGRAPHY ] = Hlp_COURSE_Bibliography_edit,
[Inf_FAQ ] = Hlp_COURSE_FAQ_edit,
[Inf_LINKS ] = Hlp_COURSE_Links_edit,
[Inf_ASSESSMENT ] = Hlp_ASSESSMENT_System_edit,
};
/***** Set info type *****/
@ -2066,14 +2066,14 @@ void Inf_EditRichTxtInfo (void)
char TxtHTML[Cns_MAX_BYTES_LONG_TEXT + 1];
const char *HelpEdit[Inf_NUM_INFO_TYPES] =
{
Hlp_COURSE_Information_edit, // Inf_INTRODUCTION
Hlp_COURSE_Guide_edit, // Inf_TEACHING_GUIDE
Hlp_COURSE_Syllabus_edit, // Inf_LECTURES
Hlp_COURSE_Syllabus_edit, // Inf_PRACTICALS
Hlp_COURSE_Bibliography_edit, // Inf_BIBLIOGRAPHY
Hlp_COURSE_FAQ_edit, // Inf_FAQ
Hlp_COURSE_Links_edit, // Inf_LINKS
Hlp_ASSESSMENT_System_edit, // Inf_ASSESSMENT
[Inf_INTRODUCTION ] = Hlp_COURSE_Information_edit,
[Inf_TEACHING_GUIDE] = Hlp_COURSE_Guide_edit,
[Inf_LECTURES ] = Hlp_COURSE_Syllabus_edit,
[Inf_PRACTICALS ] = Hlp_COURSE_Syllabus_edit,
[Inf_BIBLIOGRAPHY ] = Hlp_COURSE_Bibliography_edit,
[Inf_FAQ ] = Hlp_COURSE_FAQ_edit,
[Inf_LINKS ] = Hlp_COURSE_Links_edit,
[Inf_ASSESSMENT ] = Hlp_ASSESSMENT_System_edit,
};
/***** Set info type *****/

View File

@ -849,8 +849,8 @@ static void Ins_PutHeadInstitutionsForSeeing (bool OrderSelectable)
HTM_TR_Begin (NULL);
HTM_TH_Empty (1);
for (Order = Ins_ORDER_BY_INSTITUTION;
Order <= Ins_ORDER_BY_NUM_USRS;
for (Order = (Ins_Order_t) 0;
Order <= (Ins_Order_t) (Ins_NUM_ORDERS - 1);
Order++)
{
HTM_TH_Begin (1,1,Order == Ins_ORDER_BY_INSTITUTION ? "LM" :

View File

@ -120,7 +120,7 @@ void Lan_PutSelectorToSelectLanguage (void)
HTM_SELECT_Begin (true,
"name=\"Lan\" style=\"width:112px; margin:0;\"");
for (Lan = (Lan_Language_t) 1;
Lan <= Lan_NUM_LANGUAGES;
Lan <= (Lan_Language_t) Lan_NUM_LANGUAGES;
Lan++)
{
LanUnsigned = (unsigned) Lan;

View File

@ -350,33 +350,32 @@ void Med_PutMediaUploader (int NumMediaInForm,const char *ClassInput)
struct ParamUploadMedia ParamUploadMedia;
char Id[Frm_MAX_BYTES_ID + 1];
size_t NumUploader;
#define Med_NUM_MEDIA_UPLOADERS 3
struct MediaUploader MediaUploader[Med_NUM_MEDIA_UPLOADERS] =
{
{/* Upload */
Med_FORM_FILE,
"ico_upl", // <id>_ico_upl
"par_upl", // <id>_par_upl
"mediaClickOnActivateUpload",
"photo-video.svg",
Txt_Image_video
.FormType = Med_FORM_FILE,
.IconSuffix = "ico_upl", // <id>_ico_upl
.ParamSuffix = "par_upl", // <id>_par_upl
.FunctionName = "mediaClickOnActivateUpload",
.Icon = "photo-video.svg",
.Title = Txt_Image_video
},
{/* YouTube */
Med_FORM_YOUTUBE,
"ico_you", // <id>_ico_you
"par_you", // <id>_par_you
"mediaClickOnActivateYoutube",
"youtube-brands.svg",
"YouTube"
.FormType = Med_FORM_YOUTUBE,
.IconSuffix = "ico_you", // <id>_ico_you
.ParamSuffix = "par_you", // <id>_par_you
.FunctionName = "mediaClickOnActivateYoutube",
.Icon = "youtube-brands.svg",
.Title = "YouTube"
},
{/* Embed */
Med_FORM_EMBED,
"ico_emb", // <id>_ico_emb
"par_emb", // <id>_par_emb
"mediaClickOnActivateEmbed",
"code.svg",
"Embed"
.FormType = Med_FORM_EMBED,
.IconSuffix = "ico_emb", // <id>_ico_emb
.ParamSuffix = "par_emb", // <id>_par_emb
.FunctionName = "mediaClickOnActivateEmbed",
.Icon = "code.svg",
.Title = "Embed"
}
};
@ -1919,7 +1918,7 @@ static Med_Type_t Med_GetTypeFromStrInDB (const char *Str)
Med_Type_t Type;
for (Type = (Med_Type_t) 0;
Type < Med_NUM_TYPES;
Type <= (Med_Type_t) (Med_NUM_TYPES - 1);
Type++)
if (!strcasecmp (Str,Med_StringsTypeDB[Type]))
return Type;

View File

@ -280,7 +280,7 @@ void Mnu_PutIconsToSelectMenu (void)
Set_StartSettingsHead ();
Set_StartOneSettingSelector ();
for (Menu = (Mnu_Menu_t) 0;
Menu < Mnu_NUM_MENUS;
Menu <= (Mnu_Menu_t) (Mnu_NUM_MENUS - 1);
Menu++)
{
HTM_DIV_Begin ("class=\"%s\"",Menu == Gbl.Prefs.Menu ? "PREF_ON" :

View File

@ -2605,8 +2605,8 @@ void Msg_ShowFormSelectCourseSentOrRecMsgs (void)
unsigned NumOriginCrs;
const char *TxtSelector[Msg_NUM_TYPES_OF_MSGS] =
{
Txt_Messages_received_from_A_COURSE,
Txt_Messages_sent_from_A_COURSE
[Msg_MESSAGES_RECEIVED] = Txt_Messages_received_from_A_COURSE,
[Msg_MESSAGES_SENT ] = Txt_Messages_sent_from_A_COURSE
};
/***** Course selection *****/
@ -2641,8 +2641,8 @@ void Msg_ShowFormToFilterMsgs (void)
extern const char *Txt_MSG_Content;
const char *TxtFromTo[Msg_NUM_TYPES_OF_MSGS] =
{
Txt_MSG_From,
Txt_MSG_To
[Msg_MESSAGES_RECEIVED] = Txt_MSG_From,
[Msg_MESSAGES_SENT ] = Txt_MSG_To
};
/***** Begin table *****/

View File

@ -215,7 +215,7 @@ void Net_ShowWebsAndSocialNets (const struct UsrData *UsrDat)
/***** Show the rest of webs / social networks *****/
for (NumURL = (Net_WebsAndSocialNetworks_t) 0;
NumURL < Net_NUM_WEBS_AND_SOCIAL_NETWORKS;
NumURL <= (Net_WebsAndSocialNetworks_t) (Net_NUM_WEBS_AND_SOCIAL_NETWORKS - 1);
NumURL++)
{
/***** Check if exists the web / social network for this user *****/
@ -294,7 +294,7 @@ void Net_ShowFormMyWebsAndSocialNets (void)
/***** List webs and social networks *****/
for (NumURL = (Net_WebsAndSocialNetworks_t) 0;
NumURL < Net_NUM_WEBS_AND_SOCIAL_NETWORKS;
NumURL <= (Net_WebsAndSocialNetworks_t) (Net_NUM_WEBS_AND_SOCIAL_NETWORKS - 1);
NumURL++)
{
/***** Get user's web / social network from database *****/
@ -392,7 +392,7 @@ static void Net_GetMyWebsAndSocialNetsFromForm (void)
/***** Get URLs *****/
for (NumURL = (Net_WebsAndSocialNetworks_t) 0;
NumURL < Net_NUM_WEBS_AND_SOCIAL_NETWORKS;
NumURL <= (Net_WebsAndSocialNetworks_t) (Net_NUM_WEBS_AND_SOCIAL_NETWORKS - 1);
NumURL++)
{
/***** Get URL from the form *****/
@ -564,7 +564,7 @@ void Net_ShowWebAndSocialNetworksStats (void)
Str_Copy (NetName,row[0],
Net_MAX_BYTES_NETWORK_NAME);
for (Web = (Net_WebsAndSocialNetworks_t) 0;
Web < Net_NUM_WEBS_AND_SOCIAL_NETWORKS;
Web <= (Net_WebsAndSocialNetworks_t) (Net_NUM_WEBS_AND_SOCIAL_NETWORKS - 1);
Web++)
if (!strcmp (Net_WebsAndSocialNetworksDB[Web],NetName))
break;

View File

@ -1927,7 +1927,7 @@ void Ntf_PutFormChangeNotifSentByEMail (void)
/***** Checkbox to activate internal notifications and email notifications
about events *****/
for (NotifyEvent = (Ntf_NotifyEvent_t) 1;
NotifyEvent < Ntf_NUM_NOTIFY_EVENTS;
NotifyEvent <= (Ntf_NotifyEvent_t) (Ntf_NUM_NOTIFY_EVENTS - 1);
NotifyEvent++) // O is reserved for Ntf_EVENT_UNKNOWN
{
HTM_TR_Begin (NULL);
@ -1980,7 +1980,7 @@ static void Ntf_GetParamsNotifyEvents (void)
Gbl.Usrs.Me.UsrDat.NtfEvents.CreateNotif = 0;
Gbl.Usrs.Me.UsrDat.NtfEvents.SendEmail = 0;
for (NotifyEvent = (Ntf_NotifyEvent_t) 1;
NotifyEvent < Ntf_NUM_NOTIFY_EVENTS;
NotifyEvent <= (Ntf_NotifyEvent_t) (Ntf_NUM_NOTIFY_EVENTS - 1);
NotifyEvent++) // 0 is reserved for Ntf_EVENT_UNKNOWN
{
if ((CreateNotifForThisEvent = Par_GetParToBool (Ntf_ParamNotifMeAboutNotifyEvents[NotifyEvent])))

View File

@ -1373,12 +1373,12 @@ void Pho_CalcPhotoDegree (void)
Usr_GetUnorderedStdsCodesInDeg (DegCod);
for (Sex = (Usr_Sex_t) 0;
Sex < Usr_NUM_SEXS;
Sex <= (Usr_Sex_t) (Usr_NUM_SEXS - 1);
Sex++)
{
TotalTimeToComputeAvgPhotoInMicroseconds = 0;
for (TypeOfAverage = (Pho_AvgPhotoTypeOfAverage_t) 0;
TypeOfAverage < Pho_NUM_AVERAGE_PHOTO_TYPES;
TypeOfAverage <= (Pho_AvgPhotoTypeOfAverage_t) (Pho_NUM_AVERAGE_PHOTO_TYPES - 1);
TypeOfAverage++)
{
/***** Compute average photos of students belonging this degree *****/
@ -1546,7 +1546,7 @@ static long Pho_GetTimeToComputeAvgPhoto (long DegCod)
{
TotalTimeToComputeAvgPhoto = 0;
for (Sex = (Usr_Sex_t) 0;
Sex < Usr_NUM_SEXS;
Sex <= (Usr_Sex_t) (Usr_NUM_SEXS - 1);
Sex++)
{
/***** Get row *****/
@ -1806,7 +1806,7 @@ static void Pho_PutSelectorForTypeOfAvg (void)
HTM_SELECT_Begin (true,
"id=\"AvgType\" name=\"AvgType\"");
for (TypeOfAvg = (Pho_AvgPhotoTypeOfAverage_t) 0;
TypeOfAvg < Pho_NUM_AVERAGE_PHOTO_TYPES;
TypeOfAvg <= (Pho_AvgPhotoTypeOfAverage_t) (Pho_NUM_AVERAGE_PHOTO_TYPES - 1);
TypeOfAvg++)
{
TypeOfAvgUnsigned = (unsigned) TypeOfAvg;
@ -1871,7 +1871,7 @@ static void Pho_PutSelectorForHowComputePhotoSize (void)
HTM_SELECT_Begin (true,
"id=\"PhotoSize\" name=\"PhotoSize\"");
for (PhoSi = (Pho_HowComputePhotoSize_t) 0;
PhoSi < Pho_NUM_HOW_COMPUTE_PHOTO_SIZES;
PhoSi <= (Pho_HowComputePhotoSize_t) (Pho_NUM_HOW_COMPUTE_PHOTO_SIZES - 1);
PhoSi++)
{
PhoSiUnsigned = (unsigned) PhoSi;
@ -1936,7 +1936,7 @@ static void Pho_PutSelectorForHowOrderDegrees (void)
HTM_SELECT_Begin (true,
"id=\"Order\" name=\"Order\"");
for (Order = (Pho_HowOrderDegrees_t) 0;
Order < Pho_NUM_HOW_ORDER_DEGREES;
Order <= (Pho_HowOrderDegrees_t) (Pho_NUM_HOW_ORDER_DEGREES - 1);
Order++)
{
OrderUnsigned = (unsigned) Order;
@ -2231,7 +2231,7 @@ static void Pho_ShowOrPrintListDegrees (Pho_AvgPhotoSeeOrPrint_t SeeOrPrint)
HTM_TH (1,1,"RT",Txt_No_INDEX);
HTM_TH (1,1,"CT",Txt_Degree);
for (Sex = (Usr_Sex_t) 0;
Sex < Usr_NUM_SEXS;
Sex <= (Usr_Sex_t) (Usr_NUM_SEXS - 1);
Sex++)
HTM_TH (1,1,"CT",Txt_SEX_PLURAL_Abc[Sex]);
@ -2272,7 +2272,7 @@ static void Pho_ShowOrPrintListDegrees (Pho_AvgPhotoSeeOrPrint_t SeeOrPrint)
HTM_TD_End ();
for (Sex = (Usr_Sex_t) 0;
Sex < Usr_NUM_SEXS;
Sex <= (Usr_Sex_t) (Usr_NUM_SEXS - 1);
Sex++)
{
/***** Show average photo of students belonging to this degree *****/

View File

@ -115,8 +115,8 @@ void Plc_SeePlaces (void)
Hlp_INSTITUTION_Places,Box_NOT_CLOSABLE);
HTM_TABLE_BeginWideMarginPadding (2);
HTM_TR_Begin (NULL);
for (Order = Plc_ORDER_BY_PLACE;
Order <= Plc_ORDER_BY_NUM_CTRS;
for (Order = (Plc_Order_t) 0;
Order <= (Plc_Order_t) (Plc_NUM_ORDERS - 1);
Order++)
{
HTM_TH_Begin (1,1,"LM");

View File

@ -203,7 +203,7 @@ Pri_Visibility_t Pri_GetVisibilityFromStr (const char *Str)
Pri_Visibility_t Visibility;
for (Visibility = (Pri_Visibility_t) 0;
Visibility < Pri_NUM_OPTIONS_PRIVACY;
Visibility <= (Pri_Visibility_t) (Pri_NUM_OPTIONS_PRIVACY - 1);
Visibility++)
if (!strcasecmp (Str,Pri_VisibilityDB[Visibility]))
return Visibility;

View File

@ -2271,10 +2271,10 @@ static void Prj_ReqAddUsrs (Prj_RoleInProject_t RoleInProject)
extern const char *Txt_PROJECT_ROLES_PLURAL_abc[Prj_NUM_ROLES_IN_PROJECT];
static Act_Action_t ActionAddUsr[Prj_NUM_ROLES_IN_PROJECT] =
{
ActUnk, // Prj_ROLE_UNK, Unknown
ActAddStdPrj, // Prj_ROLE_STD, Student
ActAddTutPrj, // Prj_ROLE_TUT, Tutor
ActAddEvlPrj, // Prj_ROLE_EVL, Evaluator
[Prj_ROLE_UNK] = ActUnk, // Unknown
[Prj_ROLE_STD] = ActAddStdPrj, // Student
[Prj_ROLE_TUT] = ActAddTutPrj, // Tutor
[Prj_ROLE_EVL] = ActAddEvlPrj, // Evaluator
};
char TxtButton[Lay_MAX_BYTES_TITLE + 1];
@ -2421,10 +2421,10 @@ static void Prj_ReqRemUsrFromPrj (Prj_RoleInProject_t RoleInProject)
extern const char *Txt_Remove_USER_from_this_project;
static Act_Action_t ActionRemUsr[Prj_NUM_ROLES_IN_PROJECT] =
{
ActUnk, // Prj_ROLE_UNK, Unknown
ActRemStdPrj, // Prj_ROLE_STD, Student
ActRemTutPrj, // Prj_ROLE_TUT, Tutor
ActRemEvlPrj, // Prj_ROLE_EVL, Evaluator
[Prj_ROLE_UNK] = ActUnk, // Unknown
[Prj_ROLE_STD] = ActRemStdPrj, // Student
[Prj_ROLE_TUT] = ActRemTutPrj, // Tutor
[Prj_ROLE_EVL] = ActRemEvlPrj, // Evaluator
};
struct Project Prj;
bool ItsMe;

View File

@ -336,7 +336,7 @@ void Rec_ListFieldsRecordsForEdition (void)
HTM_SELECT_Begin (true,
"name=\"Visibility\"");
for (Vis = (Rec_VisibilityRecordFields_t) 0;
Vis < (Rec_VisibilityRecordFields_t) Rec_NUM_TYPES_VISIBILITY;
Vis <= (Rec_VisibilityRecordFields_t) (Rec_NUM_TYPES_VISIBILITY - 1);
Vis++)
{
VisUnsigned = (unsigned) Vis;
@ -401,7 +401,7 @@ void Rec_ShowFormCreateRecordField (void)
HTM_SELECT_Begin (false,
"name=\"Visibility\"");
for (Vis = (Rec_VisibilityRecordFields_t) 0;
Vis < (Rec_VisibilityRecordFields_t) Rec_NUM_TYPES_VISIBILITY;
Vis <= (Rec_VisibilityRecordFields_t) (Rec_NUM_TYPES_VISIBILITY - 1);
Vis++)
{
VisUnsigned = (unsigned) Vis;

View File

@ -211,7 +211,7 @@ void Rol_SetMyRoles (void)
if (!(Gbl.Usrs.Me.Role.Available &
(1 << Gbl.Usrs.Me.Role.Logged))) // Current type I am logged is not available for me
/* Set the lowest role available for me */
for (Gbl.Usrs.Me.Role.Logged = Rol_UNK;
for (Gbl.Usrs.Me.Role.Logged = (Rol_Role_t) 0;
Gbl.Usrs.Me.Role.Logged <= (Rol_Role_t) (Rol_NUM_ROLES - 1);
Gbl.Usrs.Me.Role.Logged++)
if (Gbl.Usrs.Me.Role.Available & (1 << Gbl.Usrs.Me.Role.Logged))
@ -227,8 +227,8 @@ unsigned Rol_GetNumAvailableRoles (void)
Rol_Role_t Role;
unsigned NumAvailableRoles = 0;
for (Role = Rol_GST;
Role < Rol_NUM_ROLES;
for (Role = (Rol_Role_t) 1;
Role <= (Rol_Role_t) Rol_NUM_ROLES - 1;
Role++)
if (Gbl.Usrs.Me.Role.Available & (1 << Role))
NumAvailableRoles++;
@ -485,8 +485,8 @@ void Rol_PutFormToChangeMyRole (const char *ClassSelect)
else
HTM_SELECT_Begin (true,
"name=\"MyRole\"");
for (Role = Rol_GST;
Role < Rol_NUM_ROLES;
for (Role = (Rol_Role_t) 1;
Role <= (Rol_Role_t) (Rol_NUM_ROLES - 1);
Role++)
if (Gbl.Usrs.Me.Role.Available & (1 << Role))
{
@ -578,7 +578,7 @@ void Rol_PutHiddenParamRoles (unsigned Roles)
unsigned Rol_GetSelectedRoles (void)
{
char StrRoles[Rol_NUM_ROLES * (10 + 1)];
char StrRoles[Rol_NUM_ROLES * (Cns_MAX_DECIMAL_DIGITS_UINT + 1)];
const char *Ptr;
char UnsignedStr[Cns_MAX_DECIMAL_DIGITS_UINT + 1];
Rol_Role_t Role;
@ -592,7 +592,7 @@ unsigned Rol_GetSelectedRoles (void)
0); // 000...000
/***** Try to get multiple param "Role" *****/
Par_GetParMultiToText ("Role",StrRoles,Rol_NUM_ROLES * (10 + 1));
Par_GetParMultiToText ("Role",StrRoles,Rol_NUM_ROLES * (Cns_MAX_DECIMAL_DIGITS_UINT + 1));
for (Ptr = StrRoles;
*Ptr;)
{

View File

@ -79,7 +79,7 @@ void Sco_PutSelectorScope (const char *ParamName,bool SendOnChange)
"id=\"%s\" name=\"%s\"",ParamName,ParamName);
for (Scope = (Hie_Level_t) 0;
Scope < Hie_NUM_LEVELS;
Scope <= (Hie_Level_t) (Hie_NUM_LEVELS - 1);
Scope++)
if ((Gbl.Scope.Allowed & (1 << Scope)))
{
@ -333,8 +333,8 @@ Hie_Level_t Sco_GetScopeFromDBStr (const char *ScopeDBStr)
{
Hie_Level_t Scope;
for (Scope = Hie_UNK;
Scope < Hie_NUM_LEVELS;
for (Scope = (Hie_Level_t) 0;
Scope <= (Hie_Level_t) (Hie_NUM_LEVELS - 1);
Scope++)
if (!strcmp (Sco_GetDBStrFromScope (Scope),ScopeDBStr))
return Scope;

View File

@ -168,7 +168,7 @@ static void Sch_PutFormToSearchWithWhatToSearchAndScope (Act_Action_t Action,Hie
HTM_SELECT_Begin (false,
"name=\"WhatToSearch\" class=\"WHAT_TO_SEARCH\"");
for (WhatToSearch = (Sch_WhatToSearch_t) 0;
WhatToSearch < Sch_NUM_WHAT_TO_SEARCH;
WhatToSearch <= (Sch_WhatToSearch_t) (Sch_NUM_WHAT_TO_SEARCH - 1);
WhatToSearch++)
if (Sch_CheckIfIHavePermissionToSearch (WhatToSearch))
{

View File

@ -437,7 +437,7 @@ void Sta_AskShowGblHits (void)
HTM_SELECT_Begin (false,
"id=\"Role\" name=\"Role\" class=\"STAT_SEL\"");
for (RoleStat = (Sta_Role_t) 0;
RoleStat < Sta_NUM_ROLES_STAT;
RoleStat <= (Sta_Role_t) (Sta_NUM_ROLES_STAT - 1);
RoleStat++)
{
RoleStatUnsigned = (unsigned) RoleStat;
@ -576,7 +576,7 @@ static void Sta_WriteSelectorCountType (void)
HTM_SELECT_Begin (false,
"id=\"CountType\" name=\"CountType\"");
for (StatCountType = (Sta_CountType_t) 0;
StatCountType < Sta_NUM_COUNT_TYPES;
StatCountType <= (Sta_CountType_t) (Sta_NUM_COUNT_TYPES - 1);
StatCountType++)
{
StatCountTypeUnsigned = (unsigned) StatCountType;
@ -616,7 +616,7 @@ static void Sta_WriteSelectorAction (void)
HTM_OPTION (HTM_Type_STRING,"0",Gbl.Stat.NumAction == 0,false,
"%s",Txt_Any_action);
for (Action = (Act_Action_t) 1;
Action < Act_NUM_ACTIONS;
Action <= (Act_Action_t) (Act_NUM_ACTIONS - 1);
Action++)
{
Tab = Act_GetTab (Act_GetSuperAction (Action));
@ -1975,7 +1975,7 @@ static void Sta_ShowDistrAccessesPerDayAndHour (unsigned long NumRows,MYSQL_RES
HTM_SELECT_Begin (true,
"name=\"ColorType\"");
for (ColorType = (Sta_ColorType_t) 0;
ColorType < Sta_NUM_COLOR_TYPES;
ColorType <= (Sta_ColorType_t) (Sta_NUM_COLOR_TYPES - 1);
ColorType++)
{
ColorTypeUnsigned = (unsigned) ColorType;

View File

@ -62,8 +62,8 @@ extern struct Globals Gbl;
const char *Svy_StrAnswerTypesDB[Svy_NUM_ANS_TYPES] =
{
"unique_choice",
"multiple_choice",
[Svy_ANS_UNIQUE_CHOICE ] = "unique_choice",
[Svy_ANS_MULTIPLE_CHOICE] = "multiple_choice",
};
#define Svy_MAX_ANSWERS_PER_QUESTION 10
@ -2715,7 +2715,7 @@ static void Svy_ShowFormEditOneQst (long SvyCod,struct SurveyQuestion *SvyQst,
HTM_TD_Begin ("class=\"%s LT\"",The_ClassFormInBox[Gbl.Prefs.Theme]);
for (AnsType = (Svy_AnswerType_t) 0;
AnsType < Svy_NUM_ANS_TYPES;
AnsType <= (Svy_AnswerType_t) (Svy_NUM_ANS_TYPES - 1);
AnsType++)
{
HTM_LABEL_Begin (NULL);
@ -2845,7 +2845,7 @@ static Svy_AnswerType_t Svy_ConvertFromStrAnsTypDBToAnsTyp (const char *StrAnsTy
Svy_AnswerType_t AnsType;
for (AnsType = (Svy_AnswerType_t) 0;
AnsType < Svy_NUM_ANS_TYPES;
AnsType <= (Svy_AnswerType_t) (Svy_NUM_ANS_TYPES - 1);
AnsType++)
if (!strcmp (StrAnsTypeBD,Svy_StrAnswerTypesDB[AnsType]))
return AnsType;

View File

@ -65,17 +65,17 @@ extern struct Globals Gbl;
static const char *StyleSyllabus[1 + Syl_MAX_LEVELS_SYLLABUS] =
{
"",
"T1",
"T2",
"T3",
"T3",
"T3",
"T3",
"T3",
"T3",
"T3",
"T3",
[ 0] = "",
[ 1] = "T1",
[ 2] = "T2",
[ 3] = "T3",
[ 4] = "T3",
[ 5] = "T3",
[ 6] = "T3",
[ 7] = "T3",
[ 8] = "T3",
[ 9] = "T3",
[10] = "T3",
};
/*****************************************************************************/
@ -145,7 +145,7 @@ void Syl_PutFormWhichSyllabus (void)
HTM_UL_Begin ("class=\"LIST_LEFT\"");
for (WhichSyllabus = (Syl_WhichSyllabus_t) 0;
WhichSyllabus < For_NUM_FORUM_SETS;
WhichSyllabus <= (Syl_WhichSyllabus_t) (For_NUM_FORUM_SETS - 1);
WhichSyllabus++)
{
HTM_LI_Begin ("class=\"DAT LM\"");

View File

@ -87,7 +87,7 @@ void Tab_DrawTabs (void)
/***** Draw the tabs *****/
for (NumTab = (Tab_Tab_t) 1;
NumTab <= (Tab_Tab_t) Tab_NUM_TABS - 1;
NumTab <= (Tab_Tab_t) (Tab_NUM_TABS - 1);
NumTab++)
{
ICanViewTab = Tab_CheckIfICanViewTab (NumTab);
@ -201,7 +201,8 @@ static const char *Tab_GetIcon (Tab_Tab_t NumTab)
[TabPrf] = "user",
};
if (NumTab < (Tab_Tab_t) 1 || NumTab >= Tab_NUM_TABS)
if (NumTab < (Tab_Tab_t) 1 ||
NumTab > (Tab_Tab_t) (Tab_NUM_TABS - 1))
return NULL;
return Ico_GetIcon (Tab_TabIcons[NumTab]);

View File

@ -86,31 +86,31 @@ const char *Tst_StrAnswerTypesXML[Tst_NUM_ANS_TYPES] =
#define Tst_MAX_BYTES_TAGS_LIST (16 * 1024)
#define Tst_MAX_BYTES_FLOAT_ANSWER 30 // Maximum length of the strings that store an floating point answer
const char *Tst_PluggableDB[Tst_NUM_OPTIONS_PLUGGABLE] =
static const char *Tst_PluggableDB[Tst_NUM_OPTIONS_PLUGGABLE] =
{
"unknown",
"N",
"Y",
[Tst_PLUGGABLE_UNKNOWN] = "unknown",
[Tst_PLUGGABLE_NO ] = "N",
[Tst_PLUGGABLE_YES ] = "Y",
};
// Feedback to students in tests
const char *Tst_FeedbackDB[Tst_NUM_TYPES_FEEDBACK] =
static const char *Tst_FeedbackDB[Tst_NUM_TYPES_FEEDBACK] =
{
"nothing", // No feedback
"total_result", // Little
"each_result", // Medium
"each_good_bad", // High
"full_feedback", // Maximum
[Tst_FEEDBACK_NOTHING ] = "nothing", // No feedback
[Tst_FEEDBACK_TOTAL_RESULT ] = "total_result", // Little
[Tst_FEEDBACK_EACH_RESULT ] = "each_result", // Medium
[Tst_FEEDBACK_EACH_GOOD_BAD] = "each_good_bad", // High
[Tst_FEEDBACK_FULL_FEEDBACK] = "full_feedback", // Maximum
};
const char *Tst_StrAnswerTypesDB[Tst_NUM_ANS_TYPES] =
static const char *Tst_StrAnswerTypesDB[Tst_NUM_ANS_TYPES] =
{
"int",
"float",
"true_false",
"unique_choice",
"multiple_choice",
"text",
[Tst_ANS_INT ] = "int",
[Tst_ANS_FLOAT ] = "float",
[Tst_ANS_TRUE_FALSE ] = "true_false",
[Tst_ANS_UNIQUE_CHOICE ] = "unique_choice",
[Tst_ANS_MULTIPLE_CHOICE] = "multiple_choice",
[Tst_ANS_TEXT ] = "text",
};
// Test images will be saved with:
@ -1980,7 +1980,7 @@ static void Tst_ShowFormConfigTst (void)
HTM_TD_Begin ("class=\"LB\"");
for (Feedback = (Tst_Feedback_t) 0;
Feedback < Tst_NUM_TYPES_FEEDBACK;
Feedback <= (Tst_Feedback_t) (Tst_NUM_TYPES_FEEDBACK - 1);
Feedback++)
{
HTM_LABEL_Begin ("class=\"DAT\"");
@ -2127,7 +2127,7 @@ void Tst_GetConfigFromRow (MYSQL_ROW row)
/***** Get feedback type (row[5]) *****/
for (Feedback = (Tst_Feedback_t) 0;
Feedback < Tst_NUM_TYPES_FEEDBACK;
Feedback <= (Tst_Feedback_t) (Tst_NUM_TYPES_FEEDBACK - 1);
Feedback++)
if (!strcmp (row[5],Tst_FeedbackDB[Feedback]))
{
@ -2344,7 +2344,7 @@ static void Tst_ShowFormAnswerTypes (void)
/***** Type of answer *****/
for (AnsType = (Tst_AnswerType_t) 0;
AnsType < Tst_NUM_ANS_TYPES;
AnsType <= (Tst_AnswerType_t) (Tst_NUM_ANS_TYPES - 1);
AnsType++)
{
HTM_TR_Begin (NULL);
@ -2825,7 +2825,7 @@ static void Tst_ListOneOrMoreQuestionsForEdition (unsigned long NumRows,
/* Number of times that the question has been answered */
/* Average score */
for (Order = (Tst_QuestionsOrder_t) 0;
Order < (Tst_QuestionsOrder_t) Tst_NUM_TYPES_ORDER_QST;
Order <= (Tst_QuestionsOrder_t) (Tst_NUM_TYPES_ORDER_QST - 1);
Order++)
{
HTM_TH_Begin (1,1,"LT");
@ -5243,7 +5243,7 @@ static void Tst_PutFormEditOneQst (char Stem[Cns_MAX_BYTES_TEXT + 1],
HTM_TD_Begin ("class=\"%s LT\"",The_ClassFormInBox[Gbl.Prefs.Theme]);
for (AnsType = (Tst_AnswerType_t) 0;
AnsType < Tst_NUM_ANS_TYPES;
AnsType <= (Tst_AnswerType_t) (Tst_NUM_ANS_TYPES - 1);
AnsType++)
{
HTM_LABEL_Begin (NULL);
@ -5838,7 +5838,7 @@ Tst_AnswerType_t Tst_ConvertFromStrAnsTypDBToAnsTyp (const char *StrAnsTypeBD)
if (StrAnsTypeBD != NULL)
for (AnsType = (Tst_AnswerType_t) 0;
AnsType < Tst_NUM_ANS_TYPES;
AnsType <= (Tst_AnswerType_t) (Tst_NUM_ANS_TYPES - 1);
AnsType++)
if (!strcmp (StrAnsTypeBD,Tst_StrAnswerTypesDB[AnsType]))
return AnsType;
@ -6285,6 +6285,111 @@ bool Tst_CheckIfQstFormatIsCorrectAndCountNumOptions (void)
return true; // Question format without errors
}
/*****************************************************************************/
/*********** Check if a test question already exists in database *************/
/*****************************************************************************/
bool Tst_CheckIfQuestionExistsInDB (void)
{
extern const char *Tst_StrAnswerTypesDB[Tst_NUM_ANS_TYPES];
MYSQL_RES *mysql_res_qst;
MYSQL_RES *mysql_res_ans;
MYSQL_ROW row;
bool IdenticalQuestionFound = false;
bool IdenticalAnswers;
unsigned NumQst;
unsigned NumQstsWithThisStem;
unsigned NumOpt;
unsigned NumOptsExistingQstInDB;
long QstCod;
unsigned i;
/***** Check if stem exists *****/
NumQstsWithThisStem =
(unsigned) DB_QuerySELECT (&mysql_res_qst,"can not check"
" if a question exists",
"SELECT QstCod FROM tst_questions"
" WHERE CrsCod=%ld AND AnsType='%s' AND Stem='%s'",
Gbl.Hierarchy.Crs.CrsCod,
Tst_StrAnswerTypesDB[Gbl.Test.AnswerType],
Gbl.Test.Stem.Text);
if (NumQstsWithThisStem) // There are questions in database with the same stem that the one of this question
{
/***** Check if the answer exists in any of the questions with the same stem *****/
/* For each question with the same stem */
for (NumQst = 0;
!IdenticalQuestionFound && NumQst < NumQstsWithThisStem;
NumQst++)
{
row = mysql_fetch_row (mysql_res_qst);
if ((QstCod = Str_ConvertStrCodToLongCod (row[0])) < 0)
Lay_ShowErrorAndExit ("Wrong code of question.");
/* Get answers from this question */
NumOptsExistingQstInDB =
(unsigned) DB_QuerySELECT (&mysql_res_ans,"can not get the answer"
" of a question",
"SELECT Answer FROM tst_answers"
" WHERE QstCod=%ld ORDER BY AnsInd",
QstCod);
switch (Gbl.Test.AnswerType)
{
case Tst_ANS_INT:
row = mysql_fetch_row (mysql_res_ans);
IdenticalQuestionFound = (Tst_GetIntAnsFromStr (row[0]) == Gbl.Test.Answer.Integer);
break;
case Tst_ANS_FLOAT:
for (IdenticalAnswers = true, i = 0;
IdenticalAnswers && i < 2;
i++)
{
row = mysql_fetch_row (mysql_res_ans);
IdenticalAnswers = (Str_GetDoubleFromStr (row[0]) == Gbl.Test.Answer.FloatingPoint[i]);
}
IdenticalQuestionFound = IdenticalAnswers;
break;
case Tst_ANS_TRUE_FALSE:
row = mysql_fetch_row (mysql_res_ans);
IdenticalQuestionFound = (Str_ConvertToUpperLetter (row[0][0]) == Gbl.Test.Answer.TF);
break;
case Tst_ANS_UNIQUE_CHOICE:
case Tst_ANS_MULTIPLE_CHOICE:
case Tst_ANS_TEXT:
if (NumOptsExistingQstInDB == Gbl.Test.Answer.NumOptions)
{
for (IdenticalAnswers = true, NumOpt = 0;
IdenticalAnswers && NumOpt < NumOptsExistingQstInDB;
NumOpt++)
{
row = mysql_fetch_row (mysql_res_ans);
if (strcasecmp (row[0],Gbl.Test.Answer.Options[NumOpt].Text))
IdenticalAnswers = false;
}
}
else // Different number of answers (options)
IdenticalAnswers = false;
IdenticalQuestionFound = IdenticalAnswers;
break;
default:
break;
}
/* Free structure that stores the query result for answers */
DB_FreeMySQLResult (&mysql_res_ans);
}
}
else // Stem does not exist
IdenticalQuestionFound = false;
/* Free structure that stores the query result for questions */
DB_FreeMySQLResult (&mysql_res_qst);
return IdenticalQuestionFound;
}
/*****************************************************************************/
/* Move images associates to a test question to their definitive directories */
/*****************************************************************************/

View File

@ -197,6 +197,9 @@ int Tst_AllocateTextChoiceAnswer (unsigned NumOpt);
Tst_AnswerType_t Tst_ConvertFromStrAnsTypDBToAnsTyp (const char *StrAnsTypeBD);
void Tst_ReceiveQst (void);
bool Tst_CheckIfQstFormatIsCorrectAndCountNumOptions (void);
bool Tst_CheckIfQuestionExistsInDB (void);
long Tst_GetIntAnsFromStr (char *Str);
void Tst_RequestRemoveQst (void);
void Tst_RemoveQst (void);

View File

@ -72,7 +72,6 @@ static void TsI_WriteAnswersOfAQstXML (long QstCod);
static void TsI_ReadQuestionsFromXMLFileAndStoreInDB (const char *FileNameXML);
static void TsI_ImportQuestionsFromXMLBuffer (const char *XMLBuffer);
static Tst_AnswerType_t TsI_ConvertFromStrAnsTypXMLToAnsTyp (const char *StrAnsTypeXML);
static bool TsI_CheckIfQuestionExistsInDB (void);
static void TsI_GetAnswerFromXML (struct XMLElement *AnswerElem);
static void TsI_WriteHeadingListImportedQst (void);
static void TsI_WriteRowImportedQst (struct XMLElement *StemElem,
@ -641,7 +640,7 @@ static void TsI_ImportQuestionsFromXMLBuffer (const char *XMLBuffer)
if (Tst_CheckIfQstFormatIsCorrectAndCountNumOptions ())
{
/* Check if question already exists in database */
QuestionExists = TsI_CheckIfQuestionExistsInDB ();
QuestionExists = Tst_CheckIfQuestionExistsInDB ();
/* Write row with this imported question */
TsI_WriteRowImportedQst (StemElem,FeedbackElem,QuestionExists);
@ -682,7 +681,7 @@ static Tst_AnswerType_t TsI_ConvertFromStrAnsTypXMLToAnsTyp (const char *StrAnsT
if (StrAnsTypeXML != NULL)
for (AnsType = (Tst_AnswerType_t) 0;
AnsType < Tst_NUM_ANS_TYPES;
AnsType <= (Tst_AnswerType_t) (Tst_NUM_ANS_TYPES - 1);
AnsType++)
// comparison must be case insensitive, because users can edit XML
if (!strcasecmp (StrAnsTypeXML,Tst_StrAnswerTypesXML[AnsType]))
@ -692,111 +691,6 @@ static Tst_AnswerType_t TsI_ConvertFromStrAnsTypXMLToAnsTyp (const char *StrAnsT
return (Tst_AnswerType_t) 0; // Not reached
}
/*****************************************************************************/
/**************** Get answer inside an XML question elements *****************/
/*****************************************************************************/
static bool TsI_CheckIfQuestionExistsInDB (void)
{
extern const char *Tst_StrAnswerTypesDB[Tst_NUM_ANS_TYPES];
MYSQL_RES *mysql_res_qst;
MYSQL_RES *mysql_res_ans;
MYSQL_ROW row;
bool IdenticalQuestionFound = false;
bool IdenticalAnswers;
unsigned NumQst;
unsigned NumQstsWithThisStem;
unsigned NumOpt;
unsigned NumOptsExistingQstInDB;
long QstCod;
unsigned i;
/***** Check if stem exists *****/
NumQstsWithThisStem =
(unsigned) DB_QuerySELECT (&mysql_res_qst,"can not check"
" if a question exists",
"SELECT QstCod FROM tst_questions"
" WHERE CrsCod=%ld AND AnsType='%s' AND Stem='%s'",
Gbl.Hierarchy.Crs.CrsCod,
Tst_StrAnswerTypesDB[Gbl.Test.AnswerType],
Gbl.Test.Stem.Text);
if (NumQstsWithThisStem) // There are questions in database with the same stem that the one of this question
{
/***** Check if the answer exists in any of the questions with the same stem *****/
/* For each question with the same stem */
for (NumQst = 0;
!IdenticalQuestionFound && NumQst < NumQstsWithThisStem;
NumQst++)
{
row = mysql_fetch_row (mysql_res_qst);
if ((QstCod = Str_ConvertStrCodToLongCod (row[0])) < 0)
Lay_ShowErrorAndExit ("Wrong code of question.");
/* Get answers from this question */
NumOptsExistingQstInDB =
(unsigned) DB_QuerySELECT (&mysql_res_ans,"can not get the answer"
" of a question",
"SELECT Answer FROM tst_answers"
" WHERE QstCod=%ld ORDER BY AnsInd",
QstCod);
switch (Gbl.Test.AnswerType)
{
case Tst_ANS_INT:
row = mysql_fetch_row (mysql_res_ans);
IdenticalQuestionFound = (Tst_GetIntAnsFromStr (row[0]) == Gbl.Test.Answer.Integer);
break;
case Tst_ANS_FLOAT:
for (IdenticalAnswers = true, i = 0;
IdenticalAnswers && i < 2;
i++)
{
row = mysql_fetch_row (mysql_res_ans);
IdenticalAnswers = (Str_GetDoubleFromStr (row[0]) == Gbl.Test.Answer.FloatingPoint[i]);
}
IdenticalQuestionFound = IdenticalAnswers;
break;
case Tst_ANS_TRUE_FALSE:
row = mysql_fetch_row (mysql_res_ans);
IdenticalQuestionFound = (Str_ConvertToUpperLetter (row[0][0]) == Gbl.Test.Answer.TF);
break;
case Tst_ANS_UNIQUE_CHOICE:
case Tst_ANS_MULTIPLE_CHOICE:
case Tst_ANS_TEXT:
if (NumOptsExistingQstInDB == Gbl.Test.Answer.NumOptions)
{
for (IdenticalAnswers = true, NumOpt = 0;
IdenticalAnswers && NumOpt < NumOptsExistingQstInDB;
NumOpt++)
{
row = mysql_fetch_row (mysql_res_ans);
if (strcasecmp (row[0],Gbl.Test.Answer.Options[NumOpt].Text))
IdenticalAnswers = false;
}
}
else // Different number of answers (options)
IdenticalAnswers = false;
IdenticalQuestionFound = IdenticalAnswers;
break;
default:
break;
}
/* Free structure that stores the query result for answers */
DB_FreeMySQLResult (&mysql_res_ans);
}
}
else // Stem does not exist
IdenticalQuestionFound = false;
/* Free structure that stores the query result for questions */
DB_FreeMySQLResult (&mysql_res_qst);
return IdenticalQuestionFound;
}
/*****************************************************************************/
/**************** Get answer inside an XML question elements *****************/
/*****************************************************************************/

File diff suppressed because it is too large Load Diff

View File

@ -323,7 +323,7 @@ void The_PutIconsToSelectTheme (void)
Set_StartSettingsHead ();
Set_StartOneSettingSelector ();
for (Theme = (The_Theme_t) 0;
Theme < The_NUM_THEMES;
Theme <= (The_Theme_t) (The_NUM_THEMES - 1);
Theme++)
{
HTM_DIV_Begin ("class=\"%s\"",Theme == Gbl.Prefs.Theme ? "PREF_ON" :
@ -396,7 +396,7 @@ The_Theme_t The_GetParamTheme (void)
Par_GetParToText ("Theme",ThemeId,The_MAX_BYTES_THEME_ID);
for (Theme = (The_Theme_t) 0;
Theme < The_NUM_THEMES;
Theme <= (The_Theme_t) (The_NUM_THEMES - 1);
Theme++)
if (!strcmp (ThemeId,The_ThemeId[Theme]))
return Theme;
@ -413,7 +413,7 @@ The_Theme_t The_GetThemeFromStr (const char *Str)
The_Theme_t Theme;
for (Theme = (The_Theme_t) 0;
Theme < The_NUM_THEMES;
Theme <= (The_Theme_t) (The_NUM_THEMES - 1);
Theme++)
if (!strcasecmp (Str,The_ThemeId[Theme]))
return Theme;

View File

@ -280,11 +280,11 @@ static void TT_GetParamsTimeTable (void)
/***** Get class type *****/
Par_GetParToText ("TTTyp",StrClassType,TT_MAX_BYTES_STR_CLASS_TYPE);
for (Gbl.TimeTable.ClassType = (TT_ClassType_t) 0;
Gbl.TimeTable.ClassType < (TT_ClassType_t) TT_NUM_CLASS_TYPES;
Gbl.TimeTable.ClassType <= (TT_ClassType_t) (TT_NUM_CLASS_TYPES - 1);
Gbl.TimeTable.ClassType++)
if (!strcmp (StrClassType,TT_ClassTypeDB[Gbl.TimeTable.ClassType]))
break;
if (Gbl.TimeTable.ClassType == (TT_ClassType_t) TT_NUM_CLASS_TYPES)
if (Gbl.TimeTable.ClassType > (TT_ClassType_t) (TT_NUM_CLASS_TYPES - 1))
Lay_ShowErrorAndExit ("Type of timetable cell is missing.");
/***** Get class duration *****/
@ -420,9 +420,9 @@ static void TT_PutFormToSelectWhichGroupsToShow (void)
{
static const Act_Action_t ActSeeTT[TT_NUM_TIMETABLE_TYPES] =
{
ActSeeCrsTT, // TT_COURSE_TIMETABLE
ActSeeMyTT, // TT_MY_TIMETABLE
ActUnk, // TT_TUTORING_TIMETABLE
[TT_COURSE_TIMETABLE ] = ActSeeCrsTT,
[TT_MY_TIMETABLE ] = ActSeeMyTT,
[TT_TUTORING_TIMETABLE] = ActUnk,
};
Grp_ShowFormToSelWhichGrps (ActSeeTT[Gbl.TimeTable.Type],NULL);
@ -1607,7 +1607,7 @@ static void TT_TimeTableDrawCell (unsigned Weekday,unsigned Interval,unsigned Co
HTM_SELECT_Begin (true,
"name=\"TTTyp\" class=\"TT_TYP\"");
for (CT = (TT_ClassType_t) 0;
CT < (TT_ClassType_t) TT_NUM_CLASS_TYPES;
CT <= (TT_ClassType_t) (TT_NUM_CLASS_TYPES - 1);
CT++)
if ((CT == TT_FREE) ||
((Gbl.TimeTable.View == TT_CRS_EDIT) && (CT == TT_LECTURE || CT == TT_PRACTICAL)) ||

View File

@ -691,7 +691,7 @@ void Usr_GetUsrDataFromUsrCod (struct UsrData *UsrDat,Usr_GetPrefs_t GetPrefs)
/* Get language (row[26]) */
UsrDat->Prefs.Language = Lan_LANGUAGE_UNKNOWN; // Language unknown
for (Lan = (Lan_Language_t) 1;
Lan <= Lan_NUM_LANGUAGES;
Lan <= (Lan_Language_t) Lan_NUM_LANGUAGES;
Lan++)
if (!strcasecmp (row[26],Lan_STR_LANG_ID[Lan]))
{
@ -708,7 +708,7 @@ void Usr_GetUsrDataFromUsrCod (struct UsrData *UsrDat,Usr_GetPrefs_t GetPrefs)
/* Get theme (row[29]) */
UsrDat->Prefs.Theme = The_THEME_DEFAULT;
for (Theme = (The_Theme_t) 0;
Theme < The_NUM_THEMES;
Theme <= (The_Theme_t) (The_NUM_THEMES - 1);
Theme++)
if (!strcasecmp (row[29],The_ThemeId[Theme]))
{
@ -719,7 +719,7 @@ void Usr_GetUsrDataFromUsrCod (struct UsrData *UsrDat,Usr_GetPrefs_t GetPrefs)
/* Get icon set (row[30]) */
UsrDat->Prefs.IconSet = Ico_ICON_SET_DEFAULT;
for (IconSet = (Ico_IconSet_t) 0;
IconSet < Ico_NUM_ICON_SETS;
IconSet <= (Ico_IconSet_t) (Ico_NUM_ICON_SETS - 1);
IconSet++)
if (!strcasecmp (row[30],Ico_IconSetId[IconSet]))
{
@ -866,7 +866,7 @@ static Usr_Sex_t Usr_GetSexFromStr (const char *Str)
Usr_Sex_t Sex;
for (Sex = (Usr_Sex_t) 0;
Sex < Usr_NUM_SEXS;
Sex <= (Usr_Sex_t) (Usr_NUM_SEXS - 1);
Sex++)
if (!strcasecmp (Str,Usr_StringsSexDB[Sex]))
return Sex;
@ -6110,7 +6110,7 @@ void Usr_FreeListsSelectedEncryptedUsrsCods (struct SelectedUsrs *SelectedUsrs)
{
/***** Free lists *****/
for (Role = (Rol_Role_t) 0;
Role < Rol_NUM_ROLES;
Role <= (Rol_Role_t) (Rol_NUM_ROLES - 1);
Role++)
if (SelectedUsrs->List[Role])
{
@ -7696,7 +7696,7 @@ static void Usr_GetMyUsrListTypeFromDB (void)
row = mysql_fetch_row (mysql_res);
if (row[0])
for (ListType = (Usr_ShowUsrsType_t) 0;
ListType < Usr_NUM_USR_LIST_TYPES;
ListType <= (Usr_ShowUsrsType_t) (Usr_NUM_USR_LIST_TYPES - 1);
ListType++)
if (!strcasecmp (row[0],Usr_StringsUsrListTypeInDB[ListType]))
{