#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "quakedef.h" char *basedir = "."; #if CACHEENABLE char *cachedir = "/tmp"; #endif // ======================================================================= // General routines // ======================================================================= void Sys_DebugNumber(int y, int val) { } void Sys_Quit (void) { Host_Shutdown(); fcntl (0, F_SETFL, fcntl (0, F_GETFL, 0) & ~FNDELAY); fflush(stdout); exit(0); } void Sys_Error (char *error, ...) { va_list argptr; char string[1024]; // change stdin to non blocking fcntl (0, F_SETFL, fcntl (0, F_GETFL, 0) & ~FNDELAY); va_start (argptr,error); vsprintf (string,error,argptr); va_end (argptr); fprintf(stderr, "Error: %s\n", string); Host_Shutdown (); exit (1); } void Sys_Warn (char *warning, ...) { va_list argptr; char string[1024]; va_start (argptr,warning); vsprintf (string,warning,argptr); va_end (argptr); fprintf(stderr, "Warning: %s", string); } /* ============ Sys_FileTime returns -1 if not present ============ */ int Sys_FileTime (char *path) { struct stat buf; if (stat (path,&buf) == -1) return -1; return buf.st_mtime; } void Sys_mkdir (char *path) { mkdir (path, 0777); } int Sys_FileOpenRead (char *path, int *handle) { int h; struct stat fileinfo; h = open (path, O_RDONLY, 0666); *handle = h; if (h == -1) return -1; if (fstat (h,&fileinfo) == -1) Sys_Error ("Error fstating %s", path); return fileinfo.st_size; } int Sys_FileOpenWrite (char *path) { int handle; umask (0); handle = open(path,O_RDWR | O_CREAT | O_TRUNC, 0666); if (handle == -1) { Con_Printf("Sys_FileOpenWrite: Error opening %s: %s", path, strerror(errno)); return 0; } return handle; } int Sys_FileWrite (int handle, void *src, int count) { return write (handle, src, count); } void Sys_FileClose (int handle) { close (handle); } void Sys_FileSeek (int handle, int position) { lseek (handle, position, SEEK_SET); } int Sys_FileRead (int handle, void *dest, int count) { return read (handle, dest, count); } void Sys_DebugLog(char *file, char *fmt, ...) { va_list argptr; static char data[1024]; int fd; va_start(argptr, fmt); vsprintf(data, fmt, argptr); va_end(argptr); fd = open(file, O_WRONLY | O_CREAT | O_APPEND, 0666); write(fd, data, strlen(data)); close(fd); } double Sys_DoubleTime (void) { static int first = true; static double oldtime = 0.0, curtime = 0.0; double newtime; struct timeval tp; gettimeofday(&tp, NULL); newtime = (double) tp.tv_sec + tp.tv_usec / 1000000.0; if (first) { first = false; oldtime = newtime; } if (newtime < oldtime) { if (newtime < oldtime - 0.001) Con_Printf("Sys_DoubleTime: time stepped backwards (went from %f to %f, difference %f)\n", oldtime, newtime, newtime - oldtime); } else curtime += newtime - oldtime; oldtime = newtime; return curtime; } // ======================================================================= // Sleeps for microseconds // ======================================================================= static volatile int oktogo; void alarm_handler(int x) { oktogo=1; } void floating_point_exception_handler(int whatever) { signal(SIGFPE, floating_point_exception_handler); } char *Sys_ConsoleInput(void) { static char text[256]; int len; fd_set fdset; struct timeval timeout; if (cls.state == ca_dedicated) { FD_ZERO(&fdset); FD_SET(0, &fdset); // stdin timeout.tv_sec = 0; timeout.tv_usec = 0; if (select (1, &fdset, NULL, NULL, &timeout) == -1 || !FD_ISSET(0, &fdset)) return NULL; len = read (0, text, sizeof(text)); if (len < 1) return NULL; text[len-1] = 0; // rip off the /n and terminate return text; } return NULL; } void Sys_Sleep(void) { usleep(1); } int main (int c, char **v) { double frameoldtime, framenewtime; signal(SIGFPE, SIG_IGN); memset(&host_parms, 0, sizeof(host_parms)); COM_InitArgv(c, v); host_parms.argc = com_argc; host_parms.argv = com_argv; host_parms.basedir = basedir; fcntl(0, F_SETFL, fcntl (0, F_GETFL, 0) | FNDELAY); Sys_Shared_EarlyInit(); Host_Init(); Sys_Shared_LateInit(); frameoldtime = Sys_DoubleTime () - 0.1; while (1) { // find time spent rendering last frame framenewtime = Sys_DoubleTime (); Host_Frame (framenewtime - frameoldtime); frameoldtime = framenewtime; } return 0; }