ref: e43997246b9f7b9bcb762743dd44c08906cc3a33
dir: /sys_9.c/
#include <u.h> #include <libc.h> #include <stdio.h> #include <thread.h> #include "quakedef.h" qboolean isDedicated; int nostdout = 0; mainstacksize = 512*1024; /* FIXME */ void Sys_Printf (char *fmt, ...) { char buf[1024]; uchar *p; va_list arg; if(nostdout) return; va_start(arg, fmt); vseprint(buf, buf+sizeof(buf), fmt, arg); va_end(arg); //write(1, buf, out-buf); for(p = (uchar *)buf; *p; p++){ *p &= 0x7f; if((*p > 128 || *p < 32) && *p != 10 && *p != 13 && *p != 9) print("[%02x]", *p); else print("%c", *p); } } void Sys_Quit (void) { Host_Shutdown(); exits(nil); } void Sys_Warn (char *msg, ...) { char buf[1024], *out; va_list arg; out = seprint(buf, buf+sizeof(buf), "%s: ", argv0); va_start(arg, msg); out = vseprint(out, buf+sizeof(buf), msg, arg); va_end(arg); out = seprint(out, buf+sizeof(buf), ": %r\n"); write(2, buf, out-buf); } void Sys_Error (char *error, ...) { char buf[1024], *out; va_list arg; va_start(arg, error); out = vseprint(buf, buf+sizeof(buf), error, arg); va_end(arg); out = seprint(out, buf+sizeof(buf), "\n%s: %r\n", argv0); write(2, buf, out-buf); Host_Shutdown(); sysfatal("ending"); } int Sys_FileTime (char *path) { uchar sb[1024]; if(stat(path, sb, sizeof sb) < 0){ Sys_Warn("Sys_FileTime:stat"); return -1; } return *((int *)(sb+25)); } void Sys_mkdir (char *path) { int d; if((d = create(path, OREAD, DMDIR|0777)) < 0) Sys_Warn("Sys_mkdir:create %s", path); else close(d); } vlong Sys_FileOpenRead (char *path, int *handle) { int d; uchar bs[1024]; d = open (path, OREAD); *handle = d; if(d < 0) return -1; if(fstat(d, bs, sizeof bs) < 0) Sys_Error("Sys_FileOpenRead %s failed", path); return *((vlong *)(bs+33)); } int Sys_FileOpenWrite (char *path) { int d; if((d = open(path, OREAD|OTRUNC)) < 0) Sys_Error("Sys_FileOpenWrite %s failed", path); return d; } 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) { seek(handle, position, 0); } int Sys_FileRead (int handle, void *dest, int count) { return read(handle, dest, count); } double Sys_FloatTime (void) { static long secbase; if(secbase == 0) secbase = time(nil); return nsec()/1000000000.0 - secbase; } char *Sys_ConsoleInput(void) { static char text[256]; int len; if(cls.state == ca_dedicated){ if((len = read(0, text, sizeof(text))) < 1) return nil; text[len-1] = '\0'; return text; } return nil; } void Sys_HighFPPrecision (void) { } void Sys_LowFPPrecision (void) { } void threadmain (int c, char **v) { static char basedir[1024]; int j; char *home; double time, oldtime, newtime; quakeparms_t parms; extern int vcrFile; extern int recording; memset(&parms, 0, sizeof(parms)); /* ignore fp exceptions (bad), rendering shit assumes they are */ setfcr(getfcr() & ~(FPOVFL|FPUNFL|FPINVAL|FPZDIV)); /* FIXME */ COM_InitArgv(c, v); parms.argc = com_argc; parms.argv = com_argv; argv0 = *v; parms.memsize = 8*1024*1024; if(j = COM_CheckParm("-mem")) parms.memsize = (int)(Q_atof(com_argv[j+1]) * 1024*1024); parms.membase = malloc(parms.memsize); if(home = getenv("home")){ snprintf(basedir, sizeof basedir, "%s/lib/quake", home); free(home); }else snprintf(basedir, sizeof basedir, "/sys/lib/quake"); parms.basedir = basedir; Host_Init(&parms); if(COM_CheckParm("-nostdout")) nostdout = 1; else print("(9)quake %4.2f\n", (float)VERSION); oldtime = Sys_FloatTime() - 0.1; for(;;){ // find time spent rendering last frame newtime = Sys_FloatTime(); time = newtime - oldtime; if(cls.state == ca_dedicated){ // play vcrfiles at max speed if(time < sys_ticrate.value && (vcrFile == -1 || recording)){ //usleep(1); continue; // not time to run a server only tic yet } time = sys_ticrate.value; } if(time > sys_ticrate.value*2) oldtime = newtime; else oldtime += time; Host_Frame(time); } }