bool initlogging(const char *identity, int facility_, int consolethres, int filethres, int syslogthres, bool logtimestamp) { facility = facility_ & 7; timestamp = logtimestamp; if(consolethres >= 0) consolethreshold = min(consolethres, (int)ACLOG_NUM); if(filethres >= 0) filethreshold = min(filethres, (int)ACLOG_NUM); if(syslogthres >= 0) syslogthreshold = min(syslogthres, (int)ACLOG_NUM); if(ident != identity) copystring(ident, identity); formatstring(ident_full)("ACR[%s]", identity); if(syslogthreshold < ACLOG_NUM) { #ifdef AC_USE_SYSLOG openlog(ident_full, LOG_NDELAY, facilities[facility]); #else if((logsock = enet_socket_create(ENET_SOCKET_TYPE_DATAGRAM)) == ENET_SOCKET_NULL || enet_address_set_host(&logdest, "localhost") < 0) syslogthreshold = ACLOG_NUM; #endif } static int lognum = 0; formatstring(filepath)("serverlog_%s_%s.part%d.txt", timestring(true), identity, ++lognum); if(fp) { fclose(fp); fp = NULL; } if(filethreshold < ACLOG_NUM) { fp = fopen(filepath, "w"); if(!fp) printf("failed to open \"%s\" for writing\n", filepath); } defformatstring(msg)("logging started: console(%s), file(%s", levelname[consolethreshold], levelname[fp ? filethreshold : ACLOG_NUM]); if(fp) concatformatstring(msg, ", \"%s\"", filepath); concatformatstring(msg, "), syslog(%s", levelname[syslogthreshold]); if(syslogthreshold < ACLOG_NUM) concatformatstring(msg, ", \"%s\", local%d", ident_full, facility); concatformatstring(msg, "), timestamp(%s)", timestamp ? "ENABLED" : "DISABLED"); enabled = consolethreshold < ACLOG_NUM || fp || syslogthreshold < ACLOG_NUM; if(enabled) printf("%s\n", msg); return enabled; }
const char *findfile(const char *filename, const char *mode) { static string s; if(homedir[0]) { formatstring(s)("%s%s", homedir, filename); if(fileexists(s, mode)) return s; if(mode[0]=='w' || mode[0]=='a') { string dirs; copystring(dirs, s); char *dir = strchr(dirs[0]==PATHDIV ? dirs+1 : dirs, PATHDIV); while(dir) { *dir = '\0'; if(!fileexists(dirs, "r") && !createdir(dirs)) return s; *dir = PATHDIV; dir = strchr(dir+1, PATHDIV); } return s; } } if(mode[0]=='w' || mode[0]=='a') return filename; loopv(packagedirs) { formatstring(s)("%s%s", packagedirs[i], filename); if(fileexists(s, mode)) return s; } return filename; }
void getitemname(int i, const char *name) { if(strlen(library[i].name)==0) formatstring(name)("libitem %i", i); else formatstring(name)("%s", library[i].name); }
void listfiles(const char *dir, const char *ext, vector<char *> &files, int (__cdecl *sf)(const char **, const char **)) { listdir(dir, ext, files); string s; if(homedir[0]) { formatstring(s)("%s%s", homedir, dir); listdir(s, ext, files); } loopv(packagedirs) { formatstring(s)("%s%s", packagedirs[i], dir); listdir(s, ext, files); } #ifndef STANDALONE listzipfiles(dir, ext, files); #endif if(sf) { // sort and remove doubles files.sort(sf); for(int i = files.length() - 1; i > 0; i--) { if(!strcmp(files[i], files[i - 1])) delstring(files.remove(i)); } } }
void menuitemmapload(char *name, char *text) { if(!lastmenu) return; string caction; if(!text || text[0]=='\0') formatstring(caction)("map %s", name); else formatstring(caction)("%s", text); lastmenu->items.add(new mitemmapload(lastmenu, newstring(name), newstring(name), newstring(caction), NULL, NULL, NULL)); }
//tab is always at top of page void tab(const char *name, int color) { if(curdepth != 0) return; if(color) tcolor = color; tpos++; if(!name) { static string title; formatstring(title)("%d", tpos); name = title; } int w = max(text_width(name) - 2*INSERT, 0); if(layoutpass) { ty = max(ty, ysize); ysize = 0; } else { cury = -ysize; int h = FONTH-2*INSERT, x1 = curx + tx, x2 = x1 + w + ((skinx[3]-skinx[2]) + (skinx[5]-skinx[4]))*SKIN_SCALE, y1 = cury - ((skiny[6]-skiny[1])-(skiny[3]-skiny[2]))*SKIN_SCALE-h, y2 = cury; bool hit = tcurrent && windowhit==this && hitx>=x1 && hity>=y1 && hitx<x2 && hity<y2; if(hit && (!guiclicktab || mousebuttons&G3D_DOWN)) *tcurrent = tpos; //roll-over to switch tab drawskin(x1-skinx[visible()?2:6]*SKIN_SCALE, y1-skiny[1]*SKIN_SCALE, w, h, visible()?10:19, 9, gui2d ? 1 : 2, light, alpha); text_(name, x1 + (skinx[3]-skinx[2])*SKIN_SCALE - (w ? INSERT : INSERT/2), y1 + (skiny[2]-skiny[1])*SKIN_SCALE - INSERT, tcolor, visible()); } tx += w + ((skinx[5]-skinx[4]) + (skinx[3]-skinx[2]))*SKIN_SCALE; }
void sethomedir(const char *dir) { string tmpdir; copystring(tmpdir, dir); #ifdef WIN32 const char substitute[] = "?MYDOCUMENTS?"; if(!strncmp(dir, substitute, strlen(substitute))) { const char *regpath = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"; char *mydocuments = getregszvalue(HKEY_CURRENT_USER, regpath, "Personal"); if(mydocuments) { formatstring(tmpdir)("%s%s", mydocuments, dir+strlen(substitute)); delete[] mydocuments; } else { printf("failed to retrieve 'Personal' path from '%s'\n", regpath); } } #endif #ifndef STANDALONE clientlogf("Using home directory: %s", tmpdir); #endif if(fixpackagedir(tmpdir) > 0) { copystring(homedir, tmpdir); createdir(homedir); } }
void mapmodel(char *name) { mapmodelinfo &mmi = mapmodels.add(); if(name[0]) formatstring(mmi.name, "%s%s", mmprefix, name); else mmi.name[0] = '\0'; mmi.m = mmi.collide = NULL; }
void setmapfilenames(const char *fname, const char *cname = 0) { string pakname, mapname, mcfgname; getmapfilenames(fname, cname, pakname, mapname, mcfgname); formatstring(ogzname)("packages/%s.ogz", mapname); if(savebak==1) formatstring(bakname)("packages/%s.BAK", mapname); else formatstring(bakname)("packages/%s_%d.BAK", mapname, totalmillis); formatstring(cfgname)("packages/%s/%s.cfg", pakname, mcfgname); formatstring(picname)("packages/%s.jpg", mapname); path(ogzname); path(bakname); path(cfgname); path(picname); }
const char *findfile(const char *filename, const char *mode) { static string s; /* if(homedir[0]) { formatstring(s)("%s%s", homedir, filename); if(fileexists(s, mode)) return s; if(mode[0]=='w' || mode[0]=='a') { string dirs; copystring(dirs, s); char *dir = strchr(dirs[0]==PATHDIV ? dirs+1 : dirs, PATHDIV); while(dir) { *dir = '\0'; if(!fileexists(dirs, "r") && !createdir(dirs)) return s; *dir = PATHDIV; dir = strchr(dir+1, PATHDIV); } return s; } }*/ if(mode[0]=='w' || mode[0]=='a') return filename; /* loopv(packagedirs) { formatstring(s)("%s%s", packagedirs[i], filename); if(fileexists(s, mode)) return s; } */ try { //printf("We're looking for : %s\n", filename); //char *name; //copystring(name, filename); const char *new_filename = graphox::filesystem::locate(filename); //printf("| findfile: \"%s\"\n", new_filename); formatstring(s)("%s", new_filename); delete new_filename; return s; } catch(graphox::Exception *e) { //puts("graphox locate failed:"); e->print(); delete[] e; } return filename; }
void screenshot(char *sname) { ImageData image(screen->w, screen->h, 3); glPixelStorei(GL_PACK_ALIGNMENT, 1); glReadPixels(0, 0, screen->w, screen->h, GL_RGB, GL_UNSIGNED_BYTE, image.data); string fname; if(sname && *sname) copystring(fname, sname); else formatstring(fname, "screenshots/%s", *filetimeformat ? gettime(filetimelocal ? currenttime : clocktime, filetimeformat) : (*mapname ? mapname : "screen")); saveimage(fname, image, imageformat, compresslevel, true); }
int listfiles(const char *dir, const char *ext, vector<char *> &files) { int dirs = 0; if(listdir(dir, ext, files)) dirs++; string s; if(homedir[0]) { formatstring(s)("%s%s", homedir, dir); if(listdir(s, ext, files)) dirs++; } loopv(packagedirs) { formatstring(s)("%s%s", packagedirs[i], dir); if(listdir(s, ext, files)) dirs++; } #ifndef STANDALONE dirs += listzipfiles(dir, ext, files); #endif return dirs; }
char *getfiledesc(const char *dir, const char *name, const char *ext) { if(!browsefiledesc || !dir || !name || !ext) return NULL; defformatstring(fn)("%s/%s.%s", dir, name, ext); path(fn); string text; if(!strcmp(ext, "dmo")) { stream *f = opengzfile(fn, "rb"); if(!f) return NULL; demoheader hdr; if(f->read(&hdr, sizeof(demoheader))!=sizeof(demoheader) || memcmp(hdr.magic, DEMO_MAGIC, sizeof(hdr.magic))) { delete f; return NULL; } delete f; lilswap(&hdr.version, 1); lilswap(&hdr.protocol, 1); const char *tag = "(incompatible file) "; if(hdr.version == DEMO_VERSION) { if(hdr.protocol == PROTOCOL_VERSION) tag = ""; else if(hdr.protocol == -PROTOCOL_VERSION) tag = "(recorded on modded server) "; } formatstring(text)("%s%s", tag, hdr.desc); text[DHDR_DESCCHARS - 1] = '\0'; return newstring(text); } else if(!strcmp(ext, "cgz")) { stream *f = opengzfile(fn, "rb"); if(!f) return NULL; header hdr; if(f->read(&hdr, sizeof(header))!=sizeof(header) || (strncmp(hdr.head, "CUBE", 4) && strncmp(hdr.head, "ACMP",4) && strncmp(hdr.head, "ACRM",4))) { delete f; return NULL; } delete f; lilswap(&hdr.version, 1); // hdr.maprevision, hdr.maptitle ... hdr.version, hdr.headersize, formatstring(text)("%s%s", (hdr.version>MAPVERSION) ? "(incompatible file) " : "", hdr.maptitle); text[DHDR_DESCCHARS - 1] = '\0'; return newstring(text); } return NULL; }
const char *setnames(const char *name) { string pakname, mapname; const char *slash = strpbrk(name, "/\\"); if(slash) { copystring(pakname, name, slash-name+1); copystring(mapname, slash+1); } else { copystring(pakname, "maps"); copystring(mapname, name); } formatstring(cgzname)("packages/%s/%s.cgz", pakname, mapname); formatstring(ocgzname)("packages/maps/official/%s.cgz", mapname); formatstring(bakname)("packages/%s/%s_%s.BAK", pakname, mapname, numtime()); formatstring(pcfname)("packages/%s/package.cfg", pakname); formatstring(mcfname)("packages/%s/%s.cfg", pakname, mapname); formatstring(omcfname)("packages/maps/official/%s.cfg", mapname); path(cgzname); path(bakname); return cgzname; }
const char *get_mapfile_path(const char *rpath) { string aloc; copystring(aloc, curr_map_id); aloc[strlen(curr_map_id) - 7] = '\0'; defformatstring(buf)("media%c%s%c%s", PATHDIV, aloc, PATHDIV, rpath); formatstring(mapfile_path)("%s%s", homedir, buf); if (fileexists(mapfile_path, "r")) { return mapfile_path; } copystring(mapfile_path, buf); return mapfile_path; }
/* * Scenario code UUID (version 4) generator for OctaForge * Based on a JS snippet from here * * http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript * */ void generate_scenario_code() { copystring(scenario_code, "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx"); int r = 0; string tmp; for (char *it = scenario_code; *it; ++it) { if (*it == '4' || *it == '-') continue; r = (int)floor(rndscale(1) * 16); formatstring(tmp)("%x", (*it == 'x') ? r : ((r&0x3)|0x8)); *it = tmp[0]; } }
void listsubdirs(const char *dir, vector<char *> &subdirs, int (__cdecl *sf)(const char **, const char **)) { listsubdir(dir, subdirs); string s; if(homedir[0]) { formatstring(s)("%s%s", homedir, dir); listsubdir(s, subdirs); } loopv(packagedirs) { formatstring(s)("%s%s", packagedirs[i], dir); listsubdir(s, subdirs); } #ifndef STANDALONE listzipdirs(dir, subdirs); #endif subdirs.sort(sf); for(int i = subdirs.length() - 1; i > 0; i--) { // remove doubles if(!strcmp(subdirs[i], subdirs[i - 1])) delstring(subdirs.remove(i)); } }
const char *findfile(const char *filename, const char *mode) { while(filename[0] == PATHDIV) filename++; // skip leading pathdiv while(!strncmp(".." PATHDIVS, filename, 3)) filename += 3; // skip leading "../" (don't allow access to files below "AC root dir") static string s; formatstring(s)("%s%s", homedir, filename); // homedir may be "" findfilelocation = FFL_HOME; if(homedir[0] && fileexists(s, mode)) return s; if(mode[0]=='w' || mode[0]=='a') { // create missing directories, if necessary string dirs; copystring(dirs, s); char *dir = strchr(dirs[0]==PATHDIV ? dirs+1 : dirs, PATHDIV); while(dir) { *dir = '\0'; if(!fileexists(dirs, "r") && !createdir(dirs)) return s; *dir = PATHDIV; dir = strchr(dir+1, PATHDIV); } return s; } findfilelocation = FFL_ZIP; #ifndef STANDALONE formatstring(s)("zip://%s", filename); if(findzipfile(filename)) return s; #endif loopv(packagedirs) { findfilelocation++; formatstring(s)("%s%s", packagedirs[i], filename); if(fileexists(s, mode)) return s; } findfilelocation = FFL_WORKDIR; return filename; }
std::string briefSummary(float seconds) { std::string ret = ""; static string temp; for (int i = 0; i < NUM_CHANNELS; i++) { formatstring(temp)("%d - %.1fKB/s sent", i, float(bytesSentPerChannel[i])/seconds/1024); ret += temp; bytesSentPerChannel[i] = 0; if (i != NUM_CHANNELS-1) ret += " "; } return ret; }
void slider(int &val, int vmin, int vmax, int color, char *label) { autotab(); int x = curx; int y = cury; line_(10); if(visible()) { if(!label) { static string s; formatstring(s)("%d", val); label = s; } int w = text_width(label); bool hit; int px, py; if(ishorizontal()) { hit = ishit(FONTH, ysize, x, y); px = x + (FONTH-w)/2; py = y + (ysize-FONTH) - ((ysize-FONTH)*(val-vmin))/((vmax==vmin) ? 1 : (vmax-vmin)); //vmin at bottom } else { hit = ishit(xsize, FONTH, x, y); px = x + FONTH/2 - w/2 + ((xsize-w)*(val-vmin))/((vmax==vmin) ? 1 : (vmax-vmin)); //vmin at left py = y; } if(hit) color = 0xFF0000; text_(label, px, py, color, hit && actionon); if(hit && actionon) { int vnew = (vmin < vmax ? 1 : -1)+vmax-vmin; if(ishorizontal()) vnew = int(vnew*(y+ysize-FONTH/2-hity)/(ysize-FONTH)); else vnew = int(vnew*(hitx-x-FONTH/2)/(xsize-w)); vnew += vmin; vnew = vmin < vmax ? clamp(vnew, vmin, vmax) : clamp(vnew, vmax, vmin); if(vnew != val) val = vnew; } } }
void selectweapon(weapon *w) { if(!w || !player1->weaponsel->deselectable()) return; if(w->selectable()) { int i = w->type; // substitute akimbo weapon *akimbo = player1->weapons[GUN_AKIMBO]; if(w->type==GUN_PISTOL && akimbo->selectable()) w = akimbo; player1->weaponswitch(w); if(identexists("onWeaponSwitch")) { string o; formatstring(o)("onWeaponSwitch %d", i); execute(o); } } }
void getmapfilenames(const char *fname, const char *cname, char *pakname, char *mapname, char *cfgname) { if(!cname) cname = fname; string name; copystring(name, cname, 100); cutogz(name); char *slash = strpbrk(name, "/\\"); if(slash) { copystring(pakname, name, slash-name+1); copystring(cfgname, slash+1); } else { copystring(pakname, "base"); copystring(cfgname, name); } if(strpbrk(fname, "/\\")) copystring(mapname, fname); else formatstring(mapname)("base/%s", fname); cutogz(mapname); }
/// Internal: Render the cstring provided to an escaped version that can be printed. static char *print_string_ptr(const char *str) { const char *ptr; char *ptr2,*out; int len=0; unsigned char token; if(!str) return newstring(""); ptr = str; while ((token=*ptr) && ++len) { if(strchr("\"\\\b\f\n\r\t", token)) len++; else if(token<32) len+=5; ptr++; } out = new char[len+3]; if(!out) return 0; ptr2 = out; ptr = str; *ptr2++ = '\"'; while (*ptr) { if((unsigned char)*ptr>31 && *ptr!='\"' && *ptr!='\\') *ptr2++ = *ptr++; else { *ptr2++ = '\\'; switch (token = *ptr++) { case '\\': *ptr2++ = '\\'; break; case '\"': *ptr2++ = '\"'; break; case '\b': *ptr2++ = 'b'; break; case '\f': *ptr2++ = 'f'; break; case '\n': *ptr2++ = 'n'; break; case '\r': *ptr2++ = 'r'; break; case '\t': *ptr2++ = 't'; break; default: formatstring(ptr2) ("u%04x", token); ptr2 += 5; break; // escape and print } } } *ptr2++ = '\"'; *ptr2++ = 0; return out; }
mitemmaploadmanual(gmenu *parent, const char *filename, const char *altfontname, char *text, char *action, char *hoveraction, color *bgcolor, const char *desc = NULL) : mitemmanual(parent, text, action, NULL, NULL, NULL), filename(filename) { image = NULL; copystring(maptitle, filename ? filename : "-n/a-"); if(filename) { // see worldio.cpp:setnames() string pakname, mapname, cgzpath; const char *slash = strpbrk(filename, "/\\"); if(slash) { copystring(pakname, filename, slash-filename+1); copystring(mapname, slash+1); } else { copystring(pakname, "maps"); copystring(mapname, filename); } formatstring(cgzpath)("packages/%s", pakname); char *d = getfiledesc(cgzpath, mapname, "cgz"); if( d ) { formatstring(maptitle)("%s", d[0] ? d : "-n/a-"); } else { copystring(pakname, "maps/official"); formatstring(cgzpath)("packages/%s", pakname); char *d = getfiledesc("packages/maps/official", mapname, "cgz"); if( d ) { formatstring(maptitle)("%s", d[0] ? d : "-n/a-"); } else formatstring(maptitle)("-n/a-:%s", mapname); } defformatstring(p2p)("%s/preview/%s.jpg", cgzpath, mapname); silent_texture_load = true; image = textureload(p2p, 3); if(image==notexture) image = textureload("packages/misc/nopreview.jpg", 3); silent_texture_load = false; } else { formatstring(maptitle)("-n/a-:%s", filename); image = textureload("packages/misc/nopreview.png", 3); } copystring(mapstats, ""); }
/// Internal: Render an array to text static char *print_array(JSON *item, int depth, bool fmt) { char **entries; char *out = 0, *ptr, *ret; int len = 5; JSON *child = item->firstchild; int numentries = 0 , i = 0, fail = 0; // How many entries in the array? while (child) numentries++, child = child->next; if(!numentries)// Explicitly handle numentries==0 { out = new char[3]; formatstring(out)("[]"); return out; } // Allocate an array to hold the values for each entries = new char*[numentries*sizeof(char *)]; if(!entries) return 0; memset(entries, 0, numentries*sizeof(char*)); // Retrieve all the results: child = item->firstchild; while (child && !fail) { ret = print_value(child, depth+1, fmt); entries[i++] = ret; if(ret) len += strlen(ret) + 2 + (fmt?1:0); else fail = 1; child = child->next; } // If we didn't fail, try to malloc the output string if(!fail) out = new char[len]; // If that fails, we fail. if(!out) fail = 1; // Handle failure. if(fail) { for (i=0; i<numentries; i++) delete[] entries[i]; delete[] entries; return 0; } // Compose the output array. *out='['; ptr = out+1; *ptr = 0; for( i=0; i<numentries; i++) { strcpy(ptr, entries[i]); ptr += strlen(entries[i]); if(i!=numentries-1) { *ptr++=','; if(fmt) *ptr++=' '; *ptr=0;} delete[] entries[i]; } delete[] entries; *ptr++=']'; *ptr++=0; return out; }