q_shwin.c (5034B)
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 32 int hunkcount; 33 34 35 byte *membase; 36 int hunkmaxsize; 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 */ 119 int curtime; 120 int Sys_Milliseconds (void) 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 142 char findbase[MAX_OSPATH]; 143 char findpath[MAX_OSPATH]; 144 int findhandle; 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