1/*
2Copyright (C) 1996-1997 Id Software, Inc.
3
4This program is free software; you can redistribute it and/or
5modify it under the terms of the GNU General Public License
6as published by the Free Software Foundation; either version 2
7of the License, or (at your option) any later version.
8
9This program is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
13See the GNU General Public License for more details.
14
15You should have received a copy of the GNU General Public License
16along with this program; if not, write to the Free Software
17Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18
19*/
20// sys_null.h -- null system driver to aid porting efforts
21
22#include "quakedef.h"
23#include "winquake.h"
24#include "errno.h"
25#include <sys\types.h>
26#include <sys\timeb.h>
27
28
29/*
30===============================================================================
31
32FILE IO
33
34===============================================================================
35*/
36
37#define	MAX_HANDLES		10
38FILE	*sys_handles[MAX_HANDLES];
39
40int		findhandle (void)
41{
42	int		i;
43
44	for (i=1 ; i<MAX_HANDLES ; i++)
45		if (!sys_handles[i])
46			return i;
47	Sys_Error ("out of handles");
48	return -1;
49}
50
51/*
52================
53filelength
54================
55*/
56int filelength (FILE *f)
57{
58	int		pos;
59	int		end;
60
61	pos = ftell (f);
62	fseek (f, 0, SEEK_END);
63	end = ftell (f);
64	fseek (f, pos, SEEK_SET);
65
66	return end;
67}
68
69int Sys_FileOpenRead (char *path, int *hndl)
70{
71	FILE	*f;
72	int		i;
73
74	i = findhandle ();
75
76	f = fopen(path, "rb");
77	if (!f)
78	{
79		*hndl = -1;
80		return -1;
81	}
82	sys_handles[i] = f;
83	*hndl = i;
84
85	return filelength(f);
86}
87
88int Sys_FileOpenWrite (char *path)
89{
90	FILE	*f;
91	int		i;
92
93	i = findhandle ();
94
95	f = fopen(path, "wb");
96	if (!f)
97		Sys_Error ("Error opening %s: %s", path,strerror(errno));
98	sys_handles[i] = f;
99
100	return i;
101}
102
103void Sys_FileClose (int handle)
104{
105	fclose (sys_handles[handle]);
106	sys_handles[handle] = NULL;
107}
108
109void Sys_FileSeek (int handle, int position)
110{
111	fseek (sys_handles[handle], position, SEEK_SET);
112}
113
114int Sys_FileRead (int handle, void *dest, int count)
115{
116	return fread (dest, 1, count, sys_handles[handle]);
117}
118
119int Sys_FileWrite (int handle, void *data, int count)
120{
121	return fwrite (data, 1, count, sys_handles[handle]);
122}
123
124int	Sys_FileTime (char *path)
125{
126	FILE	*f;
127
128	f = fopen(path, "rb");
129	if (f)
130	{
131		fclose(f);
132		return 1;
133	}
134
135	return -1;
136}
137
138void Sys_mkdir (char *path)
139{
140}
141
142
143/*
144===============================================================================
145
146SYSTEM IO
147
148===============================================================================
149*/
150
151void Sys_MakeCodeWriteable (unsigned long startaddr, unsigned long length)
152{
153}
154
155
156void Sys_DebugLog(char *file, char *fmt, ...)
157{
158}
159
160void Sys_Error (char *error, ...)
161{
162	va_list		argptr;
163	char		text[1024];
164
165	va_start (argptr,error);
166	vsprintf (text, error,argptr);
167	va_end (argptr);
168
169//    MessageBox(NULL, text, "Error", 0 /* MB_OK */ );
170	printf ("ERROR: %s\n", text);
171
172	exit (1);
173}
174
175void Sys_Printf (char *fmt, ...)
176{
177	va_list		argptr;
178
179	va_start (argptr,fmt);
180	vprintf (fmt,argptr);
181	va_end (argptr);
182}
183
184void Sys_Quit (void)
185{
186	exit (0);
187}
188
189double Sys_FloatTime (void)
190{
191	double t;
192    struct _timeb tstruct;
193	static int	starttime;
194
195	_ftime( &tstruct );
196
197	if (!starttime)
198		starttime = tstruct.time;
199	t = (tstruct.time-starttime) + tstruct.millitm*0.001;
200
201	return t;
202}
203
204void Sys_Sleep (void)
205{
206}
207
208
209void Sys_SendKeyEvents (void)
210{
211}
212
213void Sys_HighFPPrecision (void)
214{
215}
216
217void Sys_LowFPPrecision (void)
218{
219}
220
221char *Sys_ConsoleInput (void)
222{
223	static char	text[256];
224	static int		len;
225	INPUT_RECORD	recs[1024];
226	int		count;
227	int		i;
228	int		c;
229
230	// read a line out
231	while (_kbhit())
232	{
233		c = _getch();
234		putch (c);
235		if (c == '\r')
236		{
237			text[len] = 0;
238			putch ('\n');
239			len = 0;
240			return text;
241		}
242		if (c == 8)
243		{
244			putch (' ');
245			putch (c);
246			len--;
247			text[len] = 0;
248			continue;
249		}
250		text[len] = c;
251		len++;
252		text[len] = 0;
253		if (len == sizeof(text))
254			len = 0;
255	}
256
257	return NULL;
258}
259
260
261
262/*
263==================
264main
265
266==================
267*/
268char	*newargv[256];
269
270int main (int argc, char **argv)
271{
272    MSG        msg;
273	quakeparms_t	parms;
274	double			time, oldtime;
275	static	char	cwd[1024];
276
277	memset (&parms, 0, sizeof(parms));
278
279	parms.memsize = 16384*1024;
280	parms.membase = malloc (parms.memsize);
281
282	_getcwd (cwd, sizeof(cwd));
283	if (cwd[Q_strlen(cwd)-1] == '\\')
284		cwd[Q_strlen(cwd)-1] = 0;
285	parms.basedir = cwd; //"f:/quake";
286//	parms.basedir = "f:\\quake";
287
288	COM_InitArgv (argc, argv);
289
290	// dedicated server ONLY!
291	if (!COM_CheckParm ("-dedicated"))
292	{
293		memcpy (newargv, argv, argc*4);
294		newargv[argc] = "-dedicated";
295		argc++;
296		argv = newargv;
297		COM_InitArgv (argc, argv);
298	}
299
300	parms.argc = argc;
301	parms.argv = argv;
302
303	printf ("Host_Init\n");
304	Host_Init (&parms);
305
306	oldtime = Sys_FloatTime ();
307
308    /* main window message loop */
309	while (1)
310	{
311		time = Sys_FloatTime();
312		if (time - oldtime < sys_ticrate.value )
313		{
314			Sleep(1);
315			continue;
316		}
317
318		Host_Frame ( time - oldtime );
319		oldtime = time;
320	}
321
322    /* return success of application */
323    return TRUE;
324}
325
326