/************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * * * Merc Diku Mud improvements copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * In order to use any part of this Merc Diku Mud, you must comply with * * both the original Diku license in 'license.doc' as well the Merc * * license in 'license.txt'. In particular, you may not remove either of * * these copyright notices. * * * * Much time and thought has gone into this software and you are * * benefiting. We hope that you share your changes too. What goes * * around, comes around. * *************************************************************************** * ROM 2.4 is copyright 1993-1998 Russ Taylor * * ROM has been brought to you by the ROM consortium * * Russ Taylor (rtaylor@hypercube.org) * * Gabrielle Taylor (gtaylor@hypercube.org) * * Brian Moore (zump@rom.org) * * By using this code, you have agreed to follow the terms of the * * ROM license, in the file Rom24/doc/rom.license * *************************************************************************** * 1stMUD ROM Derivative (c) 2001-2003 by Ryan Jennings * * http://1stmud.dlmud.com/ <r-jenn@shaw.ca> * ***************************************************************************/ #if defined (WIN32) #include "winstuff.h" int strcasecmp (const char *s1, const char *s2) { register const u_char *us1 = (const u_char *) s1, *us2 = (const u_char *) s2; while (tolower (*us1) == tolower (*us2++)) if (*us1++ == '\0') return (0); return (tolower (*us1) - tolower (*--us2)); } int strncasecmp (const char *s1, const char *s2, register size_t n) { if (n != 0) { register const u_char *us1 = (const u_char *) s1, *us2 = (const u_char *) s2; do { if (tolower (*us1) != tolower (*us2++)) return (tolower (*us1) - tolower (*--us2)); if (*us1++ == '\0') break; } while (--n != 0); } return (0); } int scandir(const char *dirname, struct dirent ***namelist, int (*select)(struct dirent *), int (*compar)(struct dirent **, struct dirent **)) { int len; char *findIn, *d; WIN32_FIND_DATA find; HANDLE h; int nDir = 0, NDir = 0; struct dirent **dir = 0, *selectDir; unsigned long ret; len = strlen(dirname); findIn = malloc(len+5); strcpy(findIn, dirname); for (d = findIn; *d; d++) if (*d=='/') *d='\\'; if ((len==0)) { strcpy(findIn, ".\\*"); } if ((len==1)&& (d[-1]=='.')) { strcpy(findIn, ".\\*"); } if ((len>0) && (d[-1]=='\\')) { *d++ = '*'; *d = 0; } if ((len>1) && (d[-1]=='.') && (d[-2]=='\\')) { d[-1] = '*'; } if ((h=FindFirstFile(findIn, &find))==INVALID_HANDLE_VALUE) { ret = GetLastError(); if (ret != ERROR_NO_MORE_FILES) { // TODO: return some error code } *namelist = dir; return nDir; } do { selectDir=(struct dirent*)malloc(sizeof(struct dirent)+strlen(find.cFileName)); strcpy(selectDir->d_name, find.cFileName); if (!select || (*select)(selectDir)) { if (nDir==NDir) { struct dirent **tempDir = calloc(sizeof(struct dirent*), NDir+33); if (NDir) memcpy(tempDir, dir, sizeof(struct dirent*)*NDir); if (dir) free(dir); dir = tempDir; NDir += 32; } dir[nDir] = selectDir; nDir++; dir[nDir] = 0; } else { free(selectDir); } } while (FindNextFile(h, &find)); ret = GetLastError(); if (ret != ERROR_NO_MORE_FILES) { // TODO: return some error code } FindClose(h); free (findIn); if (compar) qsort (dir, nDir, sizeof(*dir), (int(*)(const void*, const void*))compar); *namelist = dir; return nDir; } int alphasort (struct dirent **a, struct dirent **b) { return strcmp ((*a)->d_name, (*b)->d_name); } #endif /* WIN32 */