dir_t Sys_listdir (char *path, char *ext, qbool usesorting) { static file_t list[MAX_DIRFILES]; dir_t d; int i, extsize; DIR *dir; struct dirent *oneentry; char pathname[MAX_OSPATH]; qbool all; memset(list, 0, sizeof(list)); memset(&d, 0, sizeof(d)); d.files = list; extsize = strlen(ext); all = !strcmp(ext, ".*"); dir=opendir(path); if (!dir) { return d; } for(;;) { oneentry=readdir(dir); if(!oneentry) break; #ifndef __CYGWIN__ if (oneentry->d_type == DT_DIR || oneentry->d_type == DT_LNK) { d.numdirs++; continue; } #endif sprintf(pathname, "%s/%s", path, oneentry->d_name); list[d.numfiles].size = COM_FileSize(pathname); d.size += list[d.numfiles].size; i = strlen(oneentry->d_name); if (!all && (i < extsize || (Q_strcasecmp(oneentry->d_name+i-extsize, ext)))) continue; Q_strncpyz(list[d.numfiles].name, oneentry->d_name, MAX_MVD_NAME); if (++d.numfiles == MAX_DIRFILES) break; } closedir(dir); return d; }
// FIXME: evil evil terminating zero // adding a terminal zero bool_t COM_ReadFile( const char *path, byte **outBuf, size_t *outSz ) { size_t sz; FILE *f = fopen( path, "rb" ); byte *b; if ( ! f ) { return false; } sz = COM_FileSize( f ); b = A_Malloc( sz + 1 ); // make space for trailing zero sz = Minsz( sz, fread( b, 1, sz, f ) ); fclose( f ); b[sz] = '\0'; *outBuf = b; *outSz = sz; return true; }