X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=filematch.c;h=9092f55181332625e093091a80b949cf97a14013;hp=0837136f7e36bcea5d6d8821a5bec224d58070ef;hb=1c83503f63868a30f2090ce88e0bc0d76dd6dc16;hpb=cd7454f9df6b152a24c5a28750041d27023fbc1f diff --git a/filematch.c b/filematch.c index 0837136f..9092f551 100644 --- a/filematch.c +++ b/filematch.c @@ -57,129 +57,118 @@ int matchpattern(const char *in, const char *pattern, int caseinsensitive) return 1; // success } -// a little chained strings system -stringlist_t *stringlistappend(stringlist_t *current, char *text) +// a little strings system +void stringlistinit(stringlist_t *list) { - stringlist_t *newitem; - size_t textlen; + memset(list, 0, sizeof(*list)); +} - textlen = strlen(text) + 1; - newitem = (stringlist_t *)Z_Malloc(textlen + sizeof(stringlist_t)); - newitem->next = NULL; - newitem->text = (char *)(newitem + 1); - memcpy(newitem->text, text, textlen); - if (current) - current->next = newitem; - return newitem; +void stringlistfreecontents(stringlist_t *list) +{ + int i; + for (i = 0;i < list->numstrings;i++) + { + if (list->strings[i]) + Z_Free(list->strings[i]); + list->strings[i] = NULL; + } + list->numstrings = 0; + list->maxstrings = 0; + if (list->strings) + Z_Free(list->strings); + list->strings = NULL; } -void stringlistfree(stringlist_t *current) +void stringlistappend(stringlist_t *list, const char *text) { - stringlist_t *next; - while (current) + size_t textlen; + char **oldstrings; + + if (list->numstrings >= list->maxstrings) { - next = current->next; - Z_Free(current); - current = next; + oldstrings = list->strings; + list->maxstrings += 4096; + list->strings = Z_Malloc(list->maxstrings * sizeof(*list->strings)); + if (list->numstrings) + memcpy(list->strings, oldstrings, list->numstrings * sizeof(*list->strings)); + if (oldstrings) + Z_Free(oldstrings); } + textlen = strlen(text) + 1; + list->strings[list->numstrings] = Z_Malloc(textlen); + memcpy(list->strings[list->numstrings], text, textlen); + list->numstrings++; } -stringlist_t *stringlistsort(stringlist_t *start) +void stringlistsort(stringlist_t *list) { - int notdone; - stringlist_t *current, *previous, *temp2, *temp3, *temp4; - // exit early if there's nothing to sort - if (start == NULL || start->next == NULL) - return start; - notdone = 1; - while (notdone) + int i, j; + char *temp; + // this is a selection sort (finds the best entry for each slot) + for (i = 0;i < list->numstrings - 1;i++) { - current = start; - notdone = 0; - previous = NULL; - while (current && current->next) + for (j = i + 1;j < list->numstrings;j++) { - if (strcmp(current->text, current->next->text) > 0) + if (strcasecmp(list->strings[i], list->strings[j]) > 0) { - // current is greater than next - notdone = 1; - temp2 = current->next; - temp3 = current; - temp4 = current->next->next; - if (previous) - previous->next = temp2; - else - start = temp2; - temp2->next = temp3; - temp3->next = temp4; - break; + temp = list->strings[i]; + list->strings[i] = list->strings[j]; + list->strings[j] = temp; } - previous = current; - current = current->next; } } - return start; } // operating system specific code +static void adddirentry(stringlist_t *list, const char *path, const char *name) +{ + if (strcmp(name, ".") && strcmp(name, "..")) + { + char temp[MAX_OSPATH]; + dpsnprintf( temp, sizeof( temp ), "%s%s", path, name ); + stringlistappend(list, temp); + } +} #ifdef WIN32 #include -stringlist_t *listdirectory(const char *path) +void listdirectory(stringlist_t *list, const char *basepath, const char *path) { + int i; char pattern[4096], *c; struct _finddata_t n_file; long hFile; - stringlist_t *start, *current; - strlcpy (pattern, path, sizeof (pattern)); + strlcpy (pattern, basepath, sizeof(pattern)); + strlcat (pattern, path, sizeof (pattern)); strlcat (pattern, "*", sizeof (pattern)); // ask for the directory listing handle hFile = _findfirst(pattern, &n_file); if(hFile == -1) - return NULL; - // start a new chain with the the first name - start = current = stringlistappend(NULL, n_file.name); - // iterate through the directory - while (_findnext(hFile, &n_file) == 0) - current = stringlistappend(current, n_file.name); + return; + 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 - for (current = start;current;current = current->next) - for (c = current->text;*c;c++) + for (i = 0;i < list->numstrings;i++) + for (c = list->strings[i];*c;c++) if (*c >= 'A' && *c <= 'Z') *c += 'a' - 'A'; - - // sort the list alphanumerically - return stringlistsort(start); } #else #include -stringlist_t *listdirectory(const char *path) +void listdirectory(stringlist_t *list, const char *basepath, const char *path) { + char fullpath[MAX_OSPATH]; DIR *dir; struct dirent *ent; - stringlist_t *start, *current; - dir = opendir(path); + dpsnprintf(fullpath, "%s%s", sizeof(fullpath), basepath, *path ? path : "./"); + dir = opendir(fullpath); if (!dir) - return NULL; - start = current = NULL; + return; while ((ent = readdir(dir))) - { - if (strcmp(ent->d_name, ".") && strcmp(ent->d_name, "..")) - { - current = stringlistappend(current, ent->d_name); - if (!start) - start = current; - } - } + adddirentry(list, path, ent->d_name); closedir(dir); - // sort the list alphanumerically - return stringlistsort(start); } #endif -void freedirectory(stringlist_t *list) -{ - stringlistfree(list); -} -