int matchpattern(const char *in, const char *pattern, int caseinsensitive);
void stringlistinit(stringlist_t *list);
void stringlistfreecontents(stringlist_t *list);
-void stringlistappend(stringlist_t *list, char *text);
+void stringlistappend(stringlist_t *list, const char *text);
void stringlistsort(stringlist_t *list);
void listdirectory(stringlist_t *list, const char *path);
Z_Free(list->strings);
}
-void stringlistappend(stringlist_t *list, char *text)
+void stringlistappend(stringlist_t *list, const char *text)
{
size_t textlen;
char **oldstrings;
}
// operating system specific code
+static void adddirentry( stringlist_t *list, const char *path, const char *name )
+{
+ if (strcmp(name, ".") && strcmp(name, ".."))
+ {
+ char fullpath[MAX_OSPATH];
+ dpsnprintf (fullpath, sizeof (fullpath), "%s%s", path, name);
+ stringlistappend(list, fullpath);
+ }
+}
#ifdef WIN32
#include <io.h>
void listdirectory(stringlist_t *list, const char *path)
char pattern[4096], *c;
struct _finddata_t n_file;
long hFile;
- strlcpy (pattern, path, sizeof (pattern));
+ strlcpy (pattern, *path ? path : "./", sizeof (pattern));
strlcat (pattern, "*", sizeof (pattern));
// ask for the directory listing handle
hFile = _findfirst(pattern, &n_file);
if(hFile == -1)
return;
- // start a new chain with the the first name
- stringlistappend(list, n_file.name);
- // iterate through the directory
- while (_findnext(hFile, &n_file) == 0)
- stringlistappend(list, n_file.name);
+ do {
+ adddirentry(list, path, n_file.name );
+ } while (_findnext(hFile, &n_file) == 0);
_findclose(hFile);
// convert names to lowercase because windows does not care, but pattern matching code often does
{
DIR *dir;
struct dirent *ent;
- dir = opendir(path);
+ dir = opendir( *path ? path : "./" );
if (!dir)
return;
while ((ent = readdir(dir)))
- if (strcmp(ent->d_name, ".") && strcmp(ent->d_name, ".."))
- stringlistappend(list, ent->d_name);
+ adddirentry(list, path, ent->d_name);
closedir(dir);
}
#endif
int i;
stringlist_t list;
searchpath_t *search;
- char pakfile[MAX_OSPATH];
strlcpy (fs_gamedir, dir, sizeof (fs_gamedir));
{
if (!strcasecmp(FS_FileExtension(list.strings[i]), "pak"))
{
- dpsnprintf (pakfile, sizeof (pakfile), "%s%s", dir, list.strings[i]);
- FS_AddPack_Fullpath(pakfile, NULL, false);
+ FS_AddPack_Fullpath(list.strings[i], NULL, false);
}
}
{
if (!strcasecmp(FS_FileExtension(list.strings[i]), "pk3"))
{
- dpsnprintf (pakfile, sizeof (pakfile), "%s%s", dir, list.strings[i]);
- FS_AddPack_Fullpath(pakfile, NULL, false);
+ FS_AddPack_Fullpath(list.strings[i], NULL, false);
}
}
listdirectory(&dirlist, netpath);
for (dirlistindex = 0;dirlistindex < dirlist.numstrings;dirlistindex++)
{
- dpsnprintf(temp, sizeof(temp), "%s%s", basepath, dirlist.strings[dirlistindex]);
- if (matchpattern(temp, (char *)pattern, true))
+ const char *direntry = dirlist.strings[dirlistindex];
+ if (matchpattern(direntry, (char *)pattern, true))
{
for (resultlistindex = 0;resultlistindex < resultlist.numstrings;resultlistindex++)
- if (!strcmp(resultlist.strings[resultlistindex], temp))
+ if (!strcmp(resultlist.strings[resultlistindex], direntry))
break;
if (resultlistindex == resultlist.numstrings)
{
- stringlistappend(&resultlist, temp);
+ stringlistappend(&resultlist, direntry);
if (!quiet && developer_loading.integer)
- Con_Printf("SearchDirFile: %s\n", temp);
+ Con_Printf("SearchDirFile: %s\n", direntry);
}
}
}
{
int i,j;
stringlist_t list;
+ int basedirlength;
stringlistinit(&list);
if (fs_basedir[0])
+ {
listdirectory(&list, fs_basedir);
+ basedirlength = strlen( fs_basedir );
+ }
else
+ {
listdirectory(&list, "./");
+ basedirlength = 2;
+ }
stringlistsort(&list);
modlist_count = 0;
modlist_numenabled = fs_numgamedirs;
if (FS_CheckNastyPath (list.strings[i], true)) continue;
if (!FS_CheckGameDir(list.strings[i])) continue;
- strlcpy (modlist[modlist_count].dir, list.strings[i], sizeof(modlist[modlist_count].dir));
+ strlcpy (modlist[modlist_count].dir, list.strings[i] + basedirlength, sizeof(modlist[modlist_count].dir));
//check currently loaded mods
modlist[modlist_count].loaded = false;
if (fs_numgamedirs)