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