From 38b0fa3852e5041304870dca36ade57c9f59994c Mon Sep 17 00:00:00 2001 From: Fabian Greffrath Date: Mon, 1 Apr 2024 16:38:59 +0200 Subject: [PATCH] only convert lower case ASCII chars to upper case (#1630) * only convert toupper() chars >= HU_FONTSIZE Probably fixes #1627 * only convert lowercase ASCII chars * move ascii_toupper() to m_misc.c:M_ToUpper() * use M_ToUpper()/M_ToLower() throughout the code * rename M_ForceUppercase() -> M_StringToUpper() --- src/d_deh.c | 2 +- src/d_main.c | 4 ++-- src/f_finale.c | 6 +++--- src/g_game.c | 2 +- src/hu_lib.c | 5 +++-- src/i_glob.c | 4 ++-- src/m_cheat.c | 6 +++--- src/m_config.c | 2 +- src/m_misc.c | 32 ++++++++++++++++++++++++-------- src/m_misc.h | 6 ++++-- src/mn_font.c | 5 +++-- src/mn_menu.c | 18 +++++++++--------- src/mn_setup.c | 10 +++++----- src/p_spec.c | 2 +- src/u_mapinfo.c | 4 ++-- src/u_scanner.c | 2 +- src/w_wad.c | 18 +++++++++--------- 17 files changed, 74 insertions(+), 54 deletions(-) diff --git a/src/d_deh.c b/src/d_deh.c index 9a575732..c885670e 100644 --- a/src/d_deh.c +++ b/src/d_deh.c @@ -2601,7 +2601,7 @@ void deh_procPars(DEHFILE *fpin, FILE* fpout, char *line) // extension while (!dehfeof(fpin) && *inbuffer && (*inbuffer != ' ')) { if (!dehfgets(inbuffer, sizeof(inbuffer), fpin)) break; - M_ForceLowercase(inbuffer); // lowercase it + M_StringToLower(inbuffer); // lowercase it lfstrip(inbuffer); if (!*inbuffer) break; // killough 11/98 if (3 != sscanf(inbuffer,"par %i %i %i",&episode, &level, &partime)) diff --git a/src/d_main.c b/src/d_main.c index e498ea95..29811359 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -856,7 +856,7 @@ static char *GetAutoloadDir(const char *base, const char *iwadname, boolean crea char *lower; lower = M_StringDuplicate(iwadname); - M_ForceLowercase(lower); + M_StringToLower(lower); result = M_StringJoin(base, DIR_SEPARATOR_S, lower, NULL); free(lower); @@ -1482,7 +1482,7 @@ static int GuessFileType(const char *name) base = M_BaseName(name); lower = M_StringDuplicate(base); - M_ForceLowercase(lower); + M_StringToLower(lower); // only ever add one argument to the -iwad parameter diff --git a/src/f_finale.c b/src/f_finale.c index 1dd34694..9befc0c6 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -417,7 +417,7 @@ void F_TextWrite (void) continue; } - c = toupper(c) - HU_FONTSTART; + c = M_ToUpper(c) - HU_FONTSTART; if (c < 0 || c> HU_FONTSIZE) { cx += 4; @@ -650,7 +650,7 @@ void F_CastPrint (char* text) c = *ch++; if (!c) break; - c = toupper(c) - HU_FONTSTART; + c = M_ToUpper(c) - HU_FONTSTART; if (c < 0 || c> HU_FONTSIZE) { width += 4; @@ -669,7 +669,7 @@ void F_CastPrint (char* text) c = *ch++; if (!c) break; - c = toupper(c) - HU_FONTSTART; + c = M_ToUpper(c) - HU_FONTSTART; if (c < 0 || c> HU_FONTSIZE) { cx += 4; diff --git a/src/g_game.c b/src/g_game.c index 4bb1aae9..81cfe518 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -3646,7 +3646,7 @@ int G_ValidateMapName(const char *mapname, int *pEpi, int *pMap) return 0; strncpy(mapuname, mapname, 8); mapuname[8] = 0; - M_ForceUppercase(mapuname); + M_StringToUpper(mapuname); if (gamemode != commercial) { diff --git a/src/hu_lib.c b/src/hu_lib.c index afaa8d3c..eaea40f0 100644 --- a/src/hu_lib.c +++ b/src/hu_lib.c @@ -25,6 +25,7 @@ #include "doomstat.h" #include "hu_lib.h" #include "hu_stuff.h" +#include "m_misc.h" #include "m_swap.h" #include "r_defs.h" #include "r_draw.h" @@ -170,7 +171,7 @@ static void add_string_to_line (hu_line_t *const l, const hu_font_t *const f, co while (*s) { - c = toupper(*s++); + c = M_ToUpper(*s++); if (c == '\x1b') { @@ -324,7 +325,7 @@ static void draw_line_aligned (const hu_multiline_t *m, const hu_line_t *l, cons // draw the new stuff for (i = 0; i < l->len; i++) { - c = toupper(l->line[i]); //jff insure were not getting a cheap toupper conv. + c = M_ToUpper(l->line[i]); #if 0 if (c == '\n') diff --git a/src/i_glob.c b/src/i_glob.c index c52d2f28..3e6cd013 100644 --- a/src/i_glob.c +++ b/src/i_glob.c @@ -196,8 +196,8 @@ static boolean MatchesGlob(const char *name, const char *glob, int flags) if ((flags & GLOB_FLAG_NOCASE) != 0) { - n = tolower(n); - g = tolower(g); + n = M_ToLower(n); + g = M_ToLower(g); } if (g == '*') diff --git a/src/m_cheat.c b/src/m_cheat.c index 66d52ab9..aee40415 100644 --- a/src/m_cheat.c +++ b/src/m_cheat.c @@ -1203,13 +1203,13 @@ boolean M_FindCheats(int key) if (argsleft) { - *arg++ = tolower(key); // store key in arg buffer + *arg++ = M_ToLower(key); // store key in arg buffer if (!--argsleft) // if last key in arg list, cheat[cht].func.s(argbuf); // process the arg buffer return 1; // affirmative response } - key = tolower(key) - 'a'; + key = M_ToLower(key) - 'a'; if (key < 0 || key >= 32) // ignore most non-alpha cheat letters { sr = 0; // clear shift register @@ -1225,7 +1225,7 @@ boolean M_FindCheats(int key) const char *p; // [FG] char! for (p=cheat[i].cheat; *p; p++) { - unsigned key = tolower(*p)-'a'; // convert to 0-31 + unsigned key = M_ToLower(*p)-'a'; // convert to 0-31 if (key >= 32) // ignore most non-alpha cheat letters continue; c = (c<<5) + key; // shift key into code diff --git a/src/m_config.c b/src/m_config.c index e513e0f6..bf5aa447 100644 --- a/src/m_config.c +++ b/src/m_config.c @@ -2850,7 +2850,7 @@ static unsigned default_hash(const char *name) unsigned hash = 0; while (*name) { - hash = hash * 2 + toupper(*name++); + hash = hash * 2 + M_ToUpper(*name++); } return hash % NUMDEFAULTS; } diff --git a/src/m_misc.c b/src/m_misc.c index e4fbd952..dadca1e0 100644 --- a/src/m_misc.c +++ b/src/m_misc.c @@ -98,7 +98,7 @@ char *M_FileCaseExists(const char *path) filename = (char *)M_BaseName(path_dup); // 1: lowercase filename, e.g. doom2.wad - M_ForceLowercase(filename); + M_StringToLower(filename); if (M_FileExists(path_dup)) { @@ -106,7 +106,7 @@ char *M_FileCaseExists(const char *path) } // 2: uppercase filename, e.g. DOOM2.WAD - M_ForceUppercase(filename); + M_StringToUpper(filename); if (M_FileExists(path_dup)) { @@ -117,7 +117,7 @@ char *M_FileCaseExists(const char *path) ext = strrchr(path_dup, '.'); if (ext != NULL && ext > filename) { - M_ForceLowercase(ext + 1); + M_StringToLower(ext + 1); if (M_FileExists(path_dup)) { @@ -128,7 +128,7 @@ char *M_FileCaseExists(const char *path) // 4. lowercase filename with uppercase first letter, e.g. Doom2.wad if (strlen(filename) > 1) { - M_ForceLowercase(filename + 1); + M_StringToLower(filename + 1); if (M_FileExists(path_dup)) { @@ -210,25 +210,41 @@ const char *M_BaseName(const char *path) // Change string to uppercase. -void M_ForceUppercase(char *text) +char M_ToUpper(const char c) +{ + if (c >= 'a' && c <= 'z') + return c + 'A' - 'a'; + else + return c; +} + +void M_StringToUpper(char *text) { char *p; for (p = text; *p != '\0'; ++p) { - *p = toupper(*p); + *p = M_ToUpper(*p); } } // Change string to lowercase. -void M_ForceLowercase(char *text) +char M_ToLower(const char c) +{ + if (c >= 'A' && c <= 'Z') + return c - 'A' + 'a'; + else + return c; +} + +void M_StringToLower(char *text) { char *p; for (p = text; *p != '\0'; ++p) { - *p = tolower(*p); + *p = M_ToLower(*p); } } diff --git a/src/m_misc.h b/src/m_misc.h index 8733ec57..01faeda7 100644 --- a/src/m_misc.h +++ b/src/m_misc.h @@ -29,8 +29,10 @@ char *M_FileCaseExists(const char *file); boolean M_StrToInt(const char *str, int *result); char *M_DirName(const char *path); const char *M_BaseName(const char *path); -void M_ForceUppercase(char *text); -void M_ForceLowercase(char *text); +char M_ToUpper(const char c); +void M_StringToUpper(char *text); +char M_ToLower(const char c); +void M_StringToLower(char *text); char *M_StringDuplicate(const char *orig); boolean M_StringCopy(char *dest, const char *src, size_t dest_size); boolean M_StringConcat(char *dest, const char *src, size_t dest_size); diff --git a/src/mn_font.c b/src/mn_font.c index 25d5878c..144d351c 100644 --- a/src/mn_font.c +++ b/src/mn_font.c @@ -22,6 +22,7 @@ #include "doomtype.h" #include "i_video.h" +#include "m_misc.h" #include "m_swap.h" #include "r_defs.h" #include "v_video.h" @@ -179,7 +180,7 @@ boolean MN_DrawFon2String(int x, int y, byte *cr, const char *str) { c = *str++; - c = (upper ? toupper(c) : c) - firstc; + c = (upper ? M_ToUpper(c) : c) - firstc; if (c < 0 || c >= numchars) { cx += FON2_SPACE; @@ -214,7 +215,7 @@ int MN_GetFon2PixelWidth(const char *str) { c = *str++; - c = (upper ? toupper(c) : c) - firstc; + c = (upper ? M_ToUpper(c) : c) - firstc; if (c < 0 || c > numchars) { len += FON2_SPACE; // space diff --git a/src/mn_menu.c b/src/mn_menu.c index d2f169fd..daf7dc5b 100644 --- a/src/mn_menu.c +++ b/src/mn_menu.c @@ -1147,20 +1147,20 @@ static void SetDefaultSaveName(int slot) M_snprintf(savegamestrings[slot], SAVESTRINGSIZE, "%s", maplump); } - M_ForceUppercase(savegamestrings[slot]); + M_StringToUpper(savegamestrings[slot]); } // [FG] override savegame name if it already starts with a map identifier boolean MN_StartsWithMapIdentifier(char *str) { - if (strnlen(str, 8) >= 4 && toupper(str[0]) == 'E' && isdigit(str[1]) - && toupper(str[2]) == 'M' && isdigit(str[3])) + if (strnlen(str, 8) >= 4 && M_ToUpper(str[0]) == 'E' && isdigit(str[1]) + && M_ToUpper(str[2]) == 'M' && isdigit(str[3])) { return true; } - if (strnlen(str, 8) >= 5 && toupper(str[0]) == 'M' && toupper(str[1]) == 'A' - && toupper(str[2]) == 'P' && isdigit(str[3]) && isdigit(str[4])) + if (strnlen(str, 8) >= 5 && M_ToUpper(str[0]) == 'M' && M_ToUpper(str[1]) == 'A' + && M_ToUpper(str[2]) == 'P' && isdigit(str[3]) && isdigit(str[4])) { return true; } @@ -2381,13 +2381,13 @@ static boolean SaveLoadResponder(menu_action_t action, int ch) if (delete_verify) { - if (toupper(ch) == 'Y') + if (M_ToUpper(ch) == 'Y') { M_DeleteGame(itemOn); S_StartSound(NULL, sfx_itemup); delete_verify = false; } - else if (toupper(ch) == 'N') + else if (M_ToUpper(ch) == 'N') { S_StartSound(NULL, sfx_itemup); delete_verify = false; @@ -2678,7 +2678,7 @@ boolean M_Responder(event_t *ev) } else { - ch = toupper(ch); + ch = M_ToUpper(ch); if (ch >= 32 && ch <= 127 && saveCharIndex < SAVESTRINGSIZE - 1 && MN_StringWidth(savegamestrings[saveSlot]) @@ -3261,7 +3261,7 @@ static void WriteText(int x, int y, const char *string) continue; } - c = toupper(c) - HU_FONTSTART; + c = M_ToUpper(c) - HU_FONTSTART; if (c < 0 || c >= HU_FONTSIZE) { cx += 4; diff --git a/src/mn_setup.c b/src/mn_setup.c index baa0839e..ffa52276 100644 --- a/src/mn_setup.c +++ b/src/mn_setup.c @@ -2677,7 +2677,7 @@ void MN_DrawStringCR(int cx, int cy, byte *cr1, byte *cr2, const char *ch) } } - c = toupper(c) - HU_FONTSTART; + c = M_ToUpper(c) - HU_FONTSTART; if (c < 0 || c > HU_FONTSIZE) { cx += SPACEWIDTH; // space @@ -2764,7 +2764,7 @@ int MN_GetPixelWidth(const char *ch) continue; } - c = toupper(c) - HU_FONTSTART; + c = M_ToUpper(c) - HU_FONTSTART; if (c < 0 || c > HU_FONTSIZE) { len += SPACEWIDTH; // space @@ -3288,13 +3288,13 @@ boolean MN_SetupResponder(menu_action_t action, int ch) if (default_verify) { - if (toupper(ch) == 'Y') + if (M_ToUpper(ch) == 'Y') { ResetDefaults(); default_verify = false; SelectDone(current_item); } - else if (toupper(ch) == 'N') + else if (M_ToUpper(ch) == 'N') { default_verify = false; SelectDone(current_item); @@ -3688,7 +3688,7 @@ int MN_StringWidth(const char *string) } continue; } - c = toupper(c) - HU_FONTSTART; + c = M_ToUpper(c) - HU_FONTSTART; if (c < 0 || c > HU_FONTSIZE) { w += SPACEWIDTH; diff --git a/src/p_spec.c b/src/p_spec.c index 45bd2c92..67b53f49 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -181,7 +181,7 @@ void P_InitPicAnims (void) int j; startname = M_StringDuplicate(animdefs[i].startname); - M_ForceUppercase(startname); + M_StringToUpper(startname); // [FG] play sound when hitting animated floor if (strstr(startname, "WATER") || strstr(startname, "BLOOD")) diff --git a/src/u_mapinfo.c b/src/u_mapinfo.c index 15540862..1089caeb 100644 --- a/src/u_mapinfo.c +++ b/src/u_mapinfo.c @@ -374,7 +374,7 @@ static int ParseLumpName(u_scanner_t *s, char *buffer) } strncpy(buffer, s->string, 8); buffer[8] = 0; - M_ForceUppercase(buffer); + M_StringToUpper(buffer); return 1; } @@ -461,7 +461,7 @@ static int ParseStandardProperty(u_scanner_t *s, mapentry_t *mape) if (U_MustGetToken(s, TK_StringConst)) { key = strdup(s->string); - key[0] = tolower(key[0]); + key[0] = M_ToLower(key[0]); } } } diff --git a/src/u_scanner.c b/src/u_scanner.c index a5342030..50276dcf 100644 --- a/src/u_scanner.c +++ b/src/u_scanner.c @@ -541,7 +541,7 @@ boolean U_GetNextToken(u_scanner_t *s, boolean expandState) char *p = nextState->string; while (*p) { - *p = tolower(*p); + *p = M_ToLower(*p); p++; } // Check for a boolean constant. diff --git a/src/w_wad.c b/src/w_wad.c index fdb6ea70..a36bba0a 100644 --- a/src/w_wad.c +++ b/src/w_wad.c @@ -69,7 +69,7 @@ void ExtractFileBase(const char *path, char *dest) break; } else - *dest++ = toupper(*src++); + *dest++ = M_ToUpper(*src++); } // @@ -279,14 +279,14 @@ static void W_CoalesceMarkedResource(const char *start_marker, unsigned W_LumpNameHash(const char *s) { unsigned hash; - (void) ((hash = toupper(s[0]), s[1]) && - (hash = hash*3+toupper(s[1]), s[2]) && - (hash = hash*2+toupper(s[2]), s[3]) && - (hash = hash*2+toupper(s[3]), s[4]) && - (hash = hash*2+toupper(s[4]), s[5]) && - (hash = hash*2+toupper(s[5]), s[6]) && - (hash = hash*2+toupper(s[6]), - hash = hash*2+toupper(s[7])) + (void) ((hash = M_ToUpper(s[0]), s[1]) && + (hash = hash*3+M_ToUpper(s[1]), s[2]) && + (hash = hash*2+M_ToUpper(s[2]), s[3]) && + (hash = hash*2+M_ToUpper(s[3]), s[4]) && + (hash = hash*2+M_ToUpper(s[4]), s[5]) && + (hash = hash*2+M_ToUpper(s[5]), s[6]) && + (hash = hash*2+M_ToUpper(s[6]), + hash = hash*2+M_ToUpper(s[7])) ); return hash; }