|
|
1.1 ! root 1: #include <sys/types.h> ! 2: #include <errno.h> ! 3: #include <stdio.h> ! 4: #include <dirent.h> ! 5: #include <sys/stat.h> ! 6: #include <unistd.h> ! 7: #include <sys/mman.h> ! 8: #include <sys/time.h> ! 9: ! 10: #include "../linux/glob.h" ! 11: ! 12: #include "../qcommon/qcommon.h" ! 13: ! 14: //=============================================================================== ! 15: ! 16: byte *membase; ! 17: int maxhunksize; ! 18: int curhunksize; ! 19: ! 20: void *Hunk_Begin (int maxsize) ! 21: { ! 22: // reserve a huge chunk of memory, but don't commit any yet ! 23: maxhunksize = maxsize; ! 24: curhunksize = 0; ! 25: membase = malloc(maxhunksize); ! 26: if (membase == NULL) ! 27: Sys_Error(ERR_FATAL, "unable to allocate %d bytes", maxsize); ! 28: ! 29: return membase; ! 30: } ! 31: ! 32: void *Hunk_Alloc (int size) ! 33: { ! 34: byte *buf; ! 35: ! 36: // round to cacheline ! 37: size = (size+31)&~31; ! 38: if (curhunksize + size > maxhunksize) ! 39: Sys_Error(ERR_FATAL, "Hunk_Alloc overflow"); ! 40: buf = membase + curhunksize; ! 41: curhunksize += size; ! 42: return buf; ! 43: } ! 44: ! 45: int Hunk_End (void) ! 46: { ! 47: byte *n; ! 48: ! 49: n = realloc(membase, curhunksize); ! 50: if (n != membase) ! 51: Sys_Error(ERR_FATAL, "Hunk_End: Could not remap virtual block (%d)", errno); ! 52: ! 53: return curhunksize; ! 54: } ! 55: ! 56: void Hunk_Free (void *base) ! 57: { ! 58: if (base) ! 59: free(base); ! 60: } ! 61: ! 62: //=============================================================================== ! 63: ! 64: ! 65: /* ! 66: ================ ! 67: Sys_Milliseconds ! 68: ================ ! 69: */ ! 70: int curtime; ! 71: int Sys_Milliseconds (void) ! 72: { ! 73: struct timeval tp; ! 74: struct timezone tzp; ! 75: static int secbase; ! 76: ! 77: gettimeofday(&tp, &tzp); ! 78: ! 79: if (!secbase) ! 80: { ! 81: secbase = tp.tv_sec; ! 82: return tp.tv_usec/1000; ! 83: } ! 84: ! 85: curtime = (tp.tv_sec - secbase)*1000 + tp.tv_usec/1000; ! 86: ! 87: return curtime; ! 88: } ! 89: ! 90: void Sys_Mkdir (char *path) ! 91: { ! 92: mkdir (path, 0777); ! 93: } ! 94: ! 95: char *strlwr (char *s) ! 96: { ! 97: while (*s) { ! 98: *s = tolower(*s); ! 99: s++; ! 100: } ! 101: } ! 102: ! 103: //============================================ ! 104: ! 105: static char findbase[MAX_OSPATH]; ! 106: static char findpath[MAX_OSPATH]; ! 107: static char findpattern[MAX_OSPATH]; ! 108: static DIR *fdir; ! 109: ! 110: static qboolean CompareAttributes(char *path, char *name, ! 111: unsigned musthave, unsigned canthave ) ! 112: { ! 113: struct stat st; ! 114: char fn[MAX_OSPATH]; ! 115: ! 116: // . and .. never match ! 117: if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) ! 118: return false; ! 119: ! 120: sprintf(fn, "%s/%s", path, name); ! 121: if (stat(fn, &st) == -1) ! 122: return false; // shouldn't happen ! 123: ! 124: if ( ( st.st_mode & S_IFDIR ) && ( canthave & SFF_SUBDIR ) ) ! 125: return false; ! 126: ! 127: if ( ( musthave & SFF_SUBDIR ) && !( st.st_mode & S_IFDIR ) ) ! 128: return false; ! 129: ! 130: return true; ! 131: } ! 132: ! 133: char *Sys_FindFirst (char *path, unsigned musthave, unsigned canhave) ! 134: { ! 135: struct dirent *d; ! 136: char *p; ! 137: ! 138: if (fdir) ! 139: Sys_Error ("Sys_BeginFind without close"); ! 140: ! 141: // COM_FilePath (path, findbase); ! 142: strcpy(findbase, path); ! 143: ! 144: if ((p = strrchr(findbase, '/')) != NULL) { ! 145: *p = 0; ! 146: strcpy(findpattern, p + 1); ! 147: } else ! 148: strcpy(findpattern, "*"); ! 149: ! 150: if (strcmp(findpattern, "*.*") == 0) ! 151: strcpy(findpattern, "*"); ! 152: ! 153: if ((fdir = opendir(path)) == NULL) ! 154: return NULL; ! 155: while ((d = readdir(fdir)) != NULL) { ! 156: if (!*findpattern || glob_match(findpattern, d->d_name)) { ! 157: // if (*findpattern) ! 158: // printf("%s matched %s\n", findpattern, d->d_name); ! 159: if (CompareAttributes(findbase, d->d_name, musthave, canhave)) { ! 160: sprintf (findpath, "%s/%s", findbase, d->d_name); ! 161: return findpath; ! 162: } ! 163: } ! 164: } ! 165: return NULL; ! 166: } ! 167: ! 168: char *Sys_FindNext (unsigned musthave, unsigned canhave) ! 169: { ! 170: struct dirent *d; ! 171: ! 172: if (fdir == NULL) ! 173: return NULL; ! 174: while ((d = readdir(fdir)) != NULL) { ! 175: if (!*findpattern || glob_match(findpattern, d->d_name)) { ! 176: // if (*findpattern) ! 177: // printf("%s matched %s\n", findpattern, d->d_name); ! 178: if (CompareAttributes(findbase, d->d_name, musthave, canhave)) { ! 179: sprintf (findpath, "%s/%s", findbase, d->d_name); ! 180: return findpath; ! 181: } ! 182: } ! 183: } ! 184: return NULL; ! 185: } ! 186: ! 187: void Sys_FindClose (void) ! 188: { ! 189: if (fdir != NULL) ! 190: closedir(fdir); ! 191: fdir = NULL; ! 192: } ! 193: ! 194: ! 195: //============================================ ! 196:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.