diff --git a/src/d_netcmd.c b/src/d_netcmd.c index f8c9e5251..eda6f8769 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -720,6 +720,8 @@ void D_RegisterClientCommands(void) CV_RegisterVar(&cv_addons_folder); CV_RegisterVar(&cv_addons_md5); CV_RegisterVar(&cv_addons_showall); + CV_RegisterVar(&cv_addons_search_type); + CV_RegisterVar(&cv_addons_search_case); // WARNING: the order is important when initialising mouse2 // we need the mouse2port diff --git a/src/filesrch.c b/src/filesrch.c index 0f53747d2..5fd118403 100644 --- a/src/filesrch.c +++ b/src/filesrch.c @@ -41,7 +41,7 @@ #include #define SUFFIX "*" -#define SLASH PATHSEP +#define SLASH "\\" #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) #ifndef INVALID_FILE_ATTRIBUTES @@ -319,6 +319,11 @@ consvar_t cv_addons_md5 = {"addons_md5", "Name", CV_SAVE, addons_md5_cons_t, NUL consvar_t cv_addons_showall = {"addons_showall", "No", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_addons_search_case = {"addons_search_case", "No", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL}; + +static CV_PossibleValue_t addons_search_type_cons_t[] = {{0, "Start"}, {1, "Anywhere"}, {0, NULL}}; +consvar_t cv_addons_search_type = {"addons_search_type", "Anywhere", CV_SAVE, addons_search_type_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; + char menupath[1024]; size_t menupathindex[menudepth]; size_t menudepthleft = menudepth; @@ -519,23 +524,19 @@ char exttable[NUM_EXT_TABLE][5] = { char filenamebuf[MAX_WADFILES][MAX_WADPATH]; -#if defined(_WIN32) || defined(_WINDOWS) -#define CASEINSENSITIVE_FILESYSTEM -#endif -#ifdef CASEINSENSITIVE_FILESYSTEM -static char *strsystemstr(char *haystack, char *needle) +static boolean filemenusearch(char *haystack, char *needle) { - char uprhaystack[128]; - strlcpy(uprhaystack, haystack, 128); - strupr(uprhaystack); - return strstr(uprhaystack, needle); + static char localhaystack[128]; + strlcpy(localhaystack, haystack, 128); + if (!cv_addons_search_case.value) + strupr(localhaystack); + return ((cv_addons_search_type.value) + ? (strstr(localhaystack, needle) != 0) + : (!strncmp(localhaystack, needle, menusearch[0]))); } -#else -#define strsystemstr(haystack, needle) strstr(haystack, needle) -#endif -#define searchdir if (menusearch[0] && !strsystemstr(dent->d_name, localmenusearch))\ +#define searchdir if (menusearch[0] && !filemenusearch(dent->d_name, localmenusearch))\ {\ rejected++;\ continue;\ @@ -573,9 +574,8 @@ boolean preparefilemenu(boolean samedepth) if (menusearch[0]) { strcpy(localmenusearch, menusearch+1); -#ifdef CASEINSENSITIVE_FILESYSTEM - strupr(localmenusearch); -#endif + if (!cv_addons_search_case.value) + strupr(localmenusearch); } while (true) diff --git a/src/filesrch.h b/src/filesrch.h index e9092b590..c2201b453 100644 --- a/src/filesrch.h +++ b/src/filesrch.h @@ -8,7 +8,7 @@ #include "d_netfil.h" #include "m_menu.h" // MAXSTRINGLENGTH -extern consvar_t cv_addons_option, cv_addons_folder, cv_addons_md5, cv_addons_showall; +extern consvar_t cv_addons_option, cv_addons_folder, cv_addons_md5, cv_addons_showall, cv_addons_search_case, cv_addons_search_type; /** \brief The filesearch function diff --git a/src/m_menu.c b/src/m_menu.c index a31efcf7d..c3d140d91 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -1389,11 +1389,15 @@ static menuitem_t OP_EraseDataMenu[] = static menuitem_t OP_AddonsOptionsMenu[] = { - {IT_HEADER, NULL, "Menu", NULL, 0}, - {IT_STRING|IT_CVAR, NULL, "Location", &cv_addons_option, 6}, - {IT_STRING|IT_CVAR|IT_CV_STRING, NULL, "Custom Folder", &cv_addons_folder, 11}, - {IT_STRING|IT_CVAR, NULL, "Identify loaded files via", &cv_addons_md5, 25}, - {IT_STRING|IT_CVAR, NULL, "Show unsupported file types", &cv_addons_showall, 30}, + {IT_HEADER, NULL, "Menu", NULL, 0}, + {IT_STRING|IT_CVAR, NULL, "Location", &cv_addons_option, 12}, + {IT_STRING|IT_CVAR|IT_CV_STRING, NULL, "Custom Folder", &cv_addons_folder, 22}, + {IT_STRING|IT_CVAR, NULL, "Identify loaded files via", &cv_addons_md5, 50}, + {IT_STRING|IT_CVAR, NULL, "Show unsupported file types", &cv_addons_showall, 60}, + + {IT_HEADER, NULL, "Search", NULL, 78}, + {IT_STRING|IT_CVAR, NULL, "Matching", &cv_addons_search_type, 90}, + {IT_STRING|IT_CVAR, NULL, "Case-sensitive", &cv_addons_search_case, 100}, }; enum @@ -1906,7 +1910,7 @@ menu_t OP_ScreenshotOptionsDef = NULL }; -menu_t OP_AddonsOptionsDef = DEFAULTSCROLLMENUSTYLE("M_ADDONS", OP_AddonsOptionsMenu, &OP_DataOptionsDef, 30, 30); +menu_t OP_AddonsOptionsDef = DEFAULTMENUSTYLE("M_ADDONS", OP_AddonsOptionsMenu, &OP_DataOptionsDef, 30, 30); menu_t OP_EraseDataDef = DEFAULTMENUSTYLE("M_DATA", OP_EraseDataMenu, &OP_DataOptionsDef, 60, 30);