diff --git a/source/src/tools.cpp b/source/src/tools.cpp index edc6017c..462f49df 100644 --- a/source/src/tools.cpp +++ b/source/src/tools.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #endif string homedir = ""; @@ -164,6 +165,62 @@ char *loadfile(const char *fn, int *size) return buf; } +bool listdir(const char *dir, const char *ext, vector &files) +{ + int extsize = ext ? (int)strlen(ext)+1 : 0; + #if defined(WIN32) + s_sprintfd(pathname)("%s\\*.%s", dir, ext ? ext : "*"); + WIN32_FIND_DATA FindFileData; + HANDLE Find = FindFirstFile(path(pathname), &FindFileData); + if(Find != INVALID_HANDLE_VALUE) + { + do { + files.add(newstring(FindFileData.cFileName, (int)strlen(FindFileData.cFileName) - extsize)); + } while(FindNextFile(Find, &FindFileData)); + return true; + } + #else + string pathname; + s_strcpy(pathname, dir); + DIR *d = opendir(path(pathname)); + if(d) + { + struct dirent *de; + while((de = readdir(d)) != NULL) + { + if(!ext) files.add(newstring(de->d_name)); + else + { + int namelength = (int)strlen(de->d_name) - extsize; + if(namelength > 0 && de->d_name[namelength] == '.' && strncmp(de->d_name+namelength+1, ext, extsize-1)==0) + files.add(newstring(de->d_name, namelength)); + } + } + closedir(d); + return true; + } + #endif + else return false; +} + +int listfiles(const char *dir, const char *ext, vector &files) +{ + int dirs = 0; + if(listdir(dir, ext, files)) dirs++; + string s; + if(homedir[0]) + { + s_sprintf(s)("%s%s", homedir, dir); + if(listdir(s, ext, files)) dirs++; + } + loopv(packagedirs) + { + s_sprintf(s)("%s%s", packagedirs[i], dir); + if(listdir(s, ext, files)) dirs++; + } + return dirs; +} + ///////////////////////// misc tools /////////////////////// bool cmpb(void *b, int n, enet_uint32 c) diff --git a/source/src/tools.h b/source/src/tools.h index cf69992a..e5c92335 100644 --- a/source/src/tools.h +++ b/source/src/tools.h @@ -98,26 +98,8 @@ struct s_sprintf_f #define s_sprintfdlv(d,last,fmt) string d; { va_list ap; va_start(ap, last); formatstring(d, fmt, ap); va_end(ap); } #define s_sprintfdv(d,fmt) s_sprintfdlv(d,fmt,fmt) - template void _swap(T &a, T &b) { T t = a; a = b; b = t; } - -extern char *path(char *s); -extern const char *parentdir(const char *directory); -extern bool fileexists(const char *path, const char *mode); -extern bool createdir(const char *path); -extern void sethomedir(const char *dir); -extern void addpackagedir(const char *dir); -extern const char *findfile(const char *filename, const char *mode); -extern FILE *openfile(const char *filename, const char *mode); -#ifndef STANDALONE -extern gzFile opengzfile(const char *filename, const char *mode); -#endif -extern char *loadfile(const char *fn, int *size); -extern bool cmpb(void *b, int n, enet_uint32 c); -extern bool cmpf(char *fn, enet_uint32 c); -extern void endianswap(void *, int, int); - #define loopv(v) if(false) {} else for(int i = 0; i<(v).length(); i++) #define loopvj(v) if(false) {} else for(int j = 0; j<(v).length(); j++) #define loopvk(v) if(false) {} else for(int k = 0; k<(v).length(); k++) @@ -484,5 +466,23 @@ inline char *newstring(const char *s, size_t l) { return s_strncpy(newstring(l), inline char *newstring(const char *s) { return newstring(s, strlen(s)); } inline char *newstringbuf(const char *s) { return newstring(s, _MAXDEFSTR-1); } +extern char *path(char *s); +extern const char *parentdir(const char *directory); +extern bool fileexists(const char *path, const char *mode); +extern bool createdir(const char *path); +extern void sethomedir(const char *dir); +extern void addpackagedir(const char *dir); +extern const char *findfile(const char *filename, const char *mode); +extern FILE *openfile(const char *filename, const char *mode); +#ifndef STANDALONE +extern gzFile opengzfile(const char *filename, const char *mode); +#endif +extern char *loadfile(const char *fn, int *size); +extern bool listdir(const char *dir, const char *ext, vector &files); +extern int listfiles(const char *dir, const char *ext, vector &files); +extern bool cmpb(void *b, int n, enet_uint32 c); +extern bool cmpf(char *fn, enet_uint32 c); +extern void endianswap(void *, int, int); + #endif