icculus quake2 doxygen  1.0 dev
q_shwin.c
Go to the documentation of this file.
1 /*
2 Copyright (C) 1997-2001 Id Software, Inc.
3 
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
8 
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12 
13 See the GNU General Public License for more details.
14 
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 
19 */
20 
21 #include "../qcommon/qcommon.h"
22 #include "winquake.h"
23 #include <errno.h>
24 #include <fcntl.h>
25 #include <stdio.h>
26 #include <direct.h>
27 #include <io.h>
28 #include <conio.h>
29 
30 //===============================================================================
31 
33 
34 
35 byte *membase;
37 int cursize;
38 
39 #define VIRTUAL_ALLOC
40 
41 void *Hunk_Begin (int maxsize)
42 {
43  // reserve a huge chunk of memory, but don't commit any yet
44  cursize = 0;
45  hunkmaxsize = maxsize;
46 #ifdef VIRTUAL_ALLOC
47  membase = VirtualAlloc (NULL, maxsize, MEM_RESERVE, PAGE_NOACCESS);
48 #else
49  membase = malloc (maxsize);
50  memset (membase, 0, maxsize);
51 #endif
52  if (!membase)
53  Sys_Error ("VirtualAlloc reserve failed");
54  return (void *)membase;
55 }
56 
57 void *Hunk_Alloc (int size)
58 {
59  void *buf;
60 
61  // round to cacheline
62  size = (size+31)&~31;
63 
64 #ifdef VIRTUAL_ALLOC
65  // commit pages as needed
66 // buf = VirtualAlloc (membase+cursize, size, MEM_COMMIT, PAGE_READWRITE);
67  buf = VirtualAlloc (membase, cursize+size, MEM_COMMIT, PAGE_READWRITE);
68  if (!buf)
69  {
70  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &buf, 0, NULL);
71  Sys_Error ("VirtualAlloc commit failed.\n%s", buf);
72  }
73 #endif
74  cursize += size;
75  if (cursize > hunkmaxsize)
76  Sys_Error ("Hunk_Alloc overflow");
77 
78  return (void *)(membase+cursize-size);
79 }
80 
81 int Hunk_End (void)
82 {
83 
84  // free the remaining unused virtual memory
85 #if 0
86  void *buf;
87 
88  // write protect it
89  buf = VirtualAlloc (membase, cursize, MEM_COMMIT, PAGE_READONLY);
90  if (!buf)
91  Sys_Error ("VirtualAlloc commit failed");
92 #endif
93 
94  hunkcount++;
95 //Com_Printf ("hunkcount: %i\n", hunkcount);
96  return cursize;
97 }
98 
99 void Hunk_Free (void *base)
100 {
101  if ( base )
102 #ifdef VIRTUAL_ALLOC
103  VirtualFree (base, 0, MEM_RELEASE);
104 #else
105  free (base);
106 #endif
107 
108  hunkcount--;
109 }
110 
111 //===============================================================================
112 
113 
114 /*
115 ================
116 Sys_Milliseconds
117 ================
118 */
121 {
122  static int base;
123  static qboolean initialized = false;
124 
125  if (!initialized)
126  { // let base retain 16 bits of effectively random data
127  base = timeGetTime() & 0xffff0000;
128  initialized = true;
129  }
130  curtime = timeGetTime() - base;
131 
132  return curtime;
133 }
134 
135 void Sys_Mkdir (char *path)
136 {
137  _mkdir (path);
138 }
139 
140 //============================================
141 
145 
146 static qboolean CompareAttributes( unsigned found, unsigned musthave, unsigned canthave )
147 {
148  if ( ( found & _A_RDONLY ) && ( canthave & SFF_RDONLY ) )
149  return false;
150  if ( ( found & _A_HIDDEN ) && ( canthave & SFF_HIDDEN ) )
151  return false;
152  if ( ( found & _A_SYSTEM ) && ( canthave & SFF_SYSTEM ) )
153  return false;
154  if ( ( found & _A_SUBDIR ) && ( canthave & SFF_SUBDIR ) )
155  return false;
156  if ( ( found & _A_ARCH ) && ( canthave & SFF_ARCH ) )
157  return false;
158 
159  if ( ( musthave & SFF_RDONLY ) && !( found & _A_RDONLY ) )
160  return false;
161  if ( ( musthave & SFF_HIDDEN ) && !( found & _A_HIDDEN ) )
162  return false;
163  if ( ( musthave & SFF_SYSTEM ) && !( found & _A_SYSTEM ) )
164  return false;
165  if ( ( musthave & SFF_SUBDIR ) && !( found & _A_SUBDIR ) )
166  return false;
167  if ( ( musthave & SFF_ARCH ) && !( found & _A_ARCH ) )
168  return false;
169 
170  return true;
171 }
172 
173 char *Sys_FindFirst (char *path, unsigned musthave, unsigned canthave )
174 {
175  struct _finddata_t findinfo;
176 
177  if (findhandle)
178  Sys_Error ("Sys_BeginFind without close");
179  findhandle = 0;
180 
181  COM_FilePath (path, findbase);
182  findhandle = _findfirst (path, &findinfo);
183  if (findhandle == -1)
184  return NULL;
185  if ( !CompareAttributes( findinfo.attrib, musthave, canthave ) )
186  return NULL;
187  Com_sprintf (findpath, sizeof(findpath), "%s/%s", findbase, findinfo.name);
188  return findpath;
189 }
190 
191 char *Sys_FindNext ( unsigned musthave, unsigned canthave )
192 {
193  struct _finddata_t findinfo;
194 
195  if (findhandle == -1)
196  return NULL;
197  if (_findnext (findhandle, &findinfo) == -1)
198  return NULL;
199  if ( !CompareAttributes( findinfo.attrib, musthave, canthave ) )
200  return NULL;
201 
202  Com_sprintf (findpath, sizeof(findpath), "%s/%s", findbase, findinfo.name);
203  return findpath;
204 }
205 
206 void Sys_FindClose (void)
207 {
208  if (findhandle != -1)
209  _findclose (findhandle);
210  findhandle = 0;
211 }
212 
213 
214 //============================================
215 
curtime
int curtime
Definition: q_shwin.c:119
hunkcount
int hunkcount
Definition: q_shwin.c:32
Hunk_Begin
void * Hunk_Begin(int maxsize)
Definition: q_shwin.c:41
COM_FilePath
void COM_FilePath(char *in, char *out)
Definition: q_shared.c:888
hunkmaxsize
int hunkmaxsize
Definition: q_shwin.c:36
SFF_ARCH
#define SFF_ARCH
Definition: q_shared.h:279
Hunk_Free
void Hunk_Free(void *base)
Definition: q_shwin.c:99
Sys_Mkdir
void Sys_Mkdir(char *path)
Definition: q_shwin.c:135
Sys_Error
void Sys_Error(char *error,...)
Definition: sys_win.c:67
qboolean
qboolean
Definition: q_shared.h:56
winquake.h
findhandle
int findhandle
Definition: q_shwin.c:144
membase
byte * membase
Definition: q_shwin.c:35
Sys_FindFirst
char * Sys_FindFirst(char *path, unsigned musthave, unsigned canthave)
Definition: q_shwin.c:173
findbase
char findbase[MAX_OSPATH]
Definition: q_shwin.c:142
MAX_OSPATH
#define MAX_OSPATH
Definition: q_shared.h:74
Hunk_End
int Hunk_End(void)
Definition: q_shwin.c:81
NULL
#define NULL
Definition: q_shared.h:60
Sys_FindNext
char * Sys_FindNext(unsigned musthave, unsigned canthave)
Definition: q_shwin.c:191
cursize
int cursize
Definition: q_shwin.c:37
findpath
char findpath[MAX_OSPATH]
Definition: q_shwin.c:143
Sys_FindClose
void Sys_FindClose(void)
Definition: q_shwin.c:206
initialized
static qboolean initialized
Definition: cd_win.c:31
SFF_HIDDEN
#define SFF_HIDDEN
Definition: q_shared.h:280
Sys_Milliseconds
int Sys_Milliseconds(void)
Definition: q_shwin.c:120
SFF_RDONLY
#define SFF_RDONLY
Definition: q_shared.h:281
SFF_SUBDIR
#define SFF_SUBDIR
Definition: q_shared.h:282
CompareAttributes
static qboolean CompareAttributes(unsigned found, unsigned musthave, unsigned canthave)
Definition: q_shwin.c:146
Hunk_Alloc
void * Hunk_Alloc(int size)
Definition: q_shwin.c:57
Com_sprintf
void Com_sprintf(char *dest, int size, char *fmt,...)
Definition: q_shared.c:1236
SFF_SYSTEM
#define SFF_SYSTEM
Definition: q_shared.h:283