1 /* 2 Copyright (C) 1996-1997 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 #include <sys/types.h> 21 #include <sys/timeb.h> 22 #include "qwsvdef.h" 23 #include <winsock.h> 24 #include <conio.h> 25 26 27 cvar_t sys_nostdout = {"sys_nostdout","0"}; 28 29 /* 30 ================ 31 Sys_FileTime 32 ================ 33 */ 34 int Sys_FileTime (char *path) 35 { 36 FILE *f; 37 38 f = fopen(path, "rb"); 39 if (f) 40 { 41 fclose(f); 42 return 1; 43 } 44 45 return -1; 46 } 47 48 /* 49 ================ 50 Sys_mkdir 51 ================ 52 */ 53 void Sys_mkdir (char *path) 54 { 55 _mkdir(path); 56 } 57 58 59 /* 60 ================ 61 Sys_Error 62 ================ 63 */ 64 void Sys_Error (char *error, ...) 65 { 66 va_list argptr; 67 char text[1024]; 68 69 va_start (argptr,error); 70 vsprintf (text, error,argptr); 71 va_end (argptr); 72 73 // MessageBox(NULL, text, "Error", 0 /* MB_OK */ ); 74 printf ("ERROR: %s\n", text); 75 76 exit (1); 77 } 78 79 80 /* 81 ================ 82 Sys_DoubleTime 83 ================ 84 */ 85 double Sys_DoubleTime (void) 86 { 87 double t; 88 struct _timeb tstruct; 89 static int starttime; 90 91 _ftime( &tstruct ); 92 93 if (!starttime) 94 starttime = tstruct.time; 95 t = (tstruct.time-starttime) + tstruct.millitm*0.001; 96 97 return t; 98 } 99 100 101 /* 102 ================ 103 Sys_ConsoleInput 104 ================ 105 */ 106 char *Sys_ConsoleInput (void) 107 { 108 static char text[256]; 109 static int len; 110 int c; 111 112 // read a line out 113 while (_kbhit()) 114 { 115 c = _getch(); 116 putch (c); 117 if (c == '\r') 118 { 119 text[len] = 0; 120 putch ('\n'); 121 len = 0; 122 return text; 123 } 124 if (c == 8) 125 { 126 if (len) 127 { 128 putch (' '); 129 putch (c); 130 len--; 131 text[len] = 0; 132 } 133 continue; 134 } 135 text[len] = c; 136 len++; 137 text[len] = 0; 138 if (len == sizeof(text)) 139 len = 0; 140 } 141 142 return NULL; 143 } 144 145 146 /* 147 ================ 148 Sys_Printf 149 ================ 150 */ 151 void Sys_Printf (char *fmt, ...) 152 { 153 va_list argptr; 154 155 if (sys_nostdout.value) 156 return; 157 158 va_start (argptr,fmt); 159 vprintf (fmt,argptr); 160 va_end (argptr); 161 } 162 163 /* 164 ================ 165 Sys_Quit 166 ================ 167 */ 168 void Sys_Quit (void) 169 { 170 exit (0); 171 } 172 173 174 /* 175 ============= 176 Sys_Init 177 178 Quake calls this so the system can register variables before host_hunklevel 179 is marked 180 ============= 181 */ 182 void Sys_Init (void) 183 { 184 Cvar_RegisterVariable (&sys_nostdout); 185 } 186 187 /* 188 ================== 189 main 190 191 ================== 192 */ 193 char *newargv[256]; 194 195 int main (int argc, char **argv) 196 { 197 quakeparms_t parms; 198 double newtime, time, oldtime; 199 static char cwd[1024]; 200 struct timeval timeout; 201 fd_set fdset; 202 int t; 203 204 COM_InitArgv (argc, argv); 205 206 parms.argc = com_argc; 207 parms.argv = com_argv; 208 209 parms.memsize = 16*1024*1024; 210 211 if ((t = COM_CheckParm ("-heapsize")) != 0 && 212 t + 1 < com_argc) 213 parms.memsize = Q_atoi (com_argv[t + 1]) * 1024; 214 215 if ((t = COM_CheckParm ("-mem")) != 0 && 216 t + 1 < com_argc) 217 parms.memsize = Q_atoi (com_argv[t + 1]) * 1024 * 1024; 218 219 parms.membase = malloc (parms.memsize); 220 221 if (!parms.membase) 222 Sys_Error("Insufficient memory.\n"); 223 224 parms.basedir = "."; 225 parms.cachedir = NULL; 226 227 SV_Init (&parms); 228 229 // run one frame immediately for first heartbeat 230 SV_Frame (0.1); 231 232 // 233 // main loop 234 // 235 oldtime = Sys_DoubleTime () - 0.1; 236 while (1) 237 { 238 // select on the net socket and stdin 239 // the only reason we have a timeout at all is so that if the last 240 // connected client times out, the message would not otherwise 241 // be printed until the next event. 242 FD_ZERO(&fdset); 243 FD_SET(net_socket, &fdset); 244 timeout.tv_sec = 0; 245 timeout.tv_usec = 100; 246 if (select (net_socket+1, &fdset, NULL, NULL, &timeout) == -1) 247 continue; 248 249 // find time passed since last cycle 250 newtime = Sys_DoubleTime (); 251 time = newtime - oldtime; 252 oldtime = newtime; 253 254 SV_Frame (time); 255 } 256 257 return true; 258 } 259 260 261