/* * I_FindFile * * proff_fs 2002-07-04 - moved to i_system * * cphipps 19/1999 - writen to unify the logic in FindIWADFile and the WAD * autoloading code. * Searches the standard dirs for a named WAD file * The dirs are listed at the start of the function */ #ifndef MACOSX /* OSX defines its search paths elsewhere. */ char* I_FindFile(const char* wfname, const char* ext) { // lookup table of directories to search static const struct { const char *dir; // directory const char *sub; // subdirectory const char *env; // environment variable const char *(*func)(void); // for I_DoomExeDir } search[] = { {NULL}, // current working directory {NULL, NULL, "DOOMWADDIR"}, // run-time $DOOMWADDIR {DOOMWADDIR}, // build-time configured DOOMWADDIR {NULL, "doom", "HOME"}, // ~/doom {NULL, NULL, "HOME"}, // ~ {NULL, NULL, NULL, I_DoomExeDir}, // config directory {"/usr/local/share/games/doom"}, {"/usr/share/games/doom"}, {"/usr/local/share/doom"}, {"/usr/share/doom"}, }; int i; /* Precalculate a length we will need in the loop */ size_t pl = strlen(wfname) + strlen(ext) + 4; for (i = 0; i < sizeof(search)/sizeof(*search); i++) { char * p; const char * d = NULL; const char * s = NULL; /* Each entry in the switch sets d to the directory to look in, * and optionally s to a subdirectory of d */ // switch replaced with lookup table if (search[i].env) { if (!(d = getenv(search[i].env))) continue; } else if (search[i].func) d = search[i].func(); else d = search[i].dir; s = search[i].sub; p = malloc((d ? strlen(d) : 0) + (s ? strlen(s) : 0) + pl); sprintf(p, "%s%s%s%s%s", d ? d : "", (d && !HasTrailingSlash(d)) ? "/" : "", s ? s : "", (s && !HasTrailingSlash(s)) ? "/" : "", wfname); if (access(p,F_OK)) strcat(p, ext); if (!access(p,F_OK)) { lprintf(LO_INFO, " found %s\n", p); return p; } free(p); } return NULL; }
static int G_ReadDemoFooter(const char *filename) { #ifndef __CELLOS_LV2__ int result = false; byte *buffer = NULL; byte *demoex_p = NULL; size_t size; M_ChangeDemoExtendedFormat(); if (!use_demoex_info) return result; demoex_filename[0] = 0; if (demo_demoex_filename && *demo_demoex_filename) { strncpy(demoex_filename, demo_demoex_filename, PATH_MAX); } else { const char* tmp_dir; char* tmp_path = NULL; const char* template_format = "%sprboom-plus-demoex-XXXXXX"; tmp_dir = I_GetTempDir(); if (tmp_dir && *tmp_dir != '\0') { tmp_path = malloc(strlen(tmp_dir) + 2); strcpy(tmp_path, tmp_dir); if (!HasTrailingSlash(tmp_dir)) { strcat(tmp_path, "/"); } SNPRINTF(demoex_filename, sizeof(demoex_filename), template_format, tmp_path); mktemp(demoex_filename); free(tmp_path); } } if (!demoex_filename[0]) { lprintf(LO_ERROR, "G_ReadDemoFooter: failed to create demoex temp file"); } else { AddDefaultExtension(demoex_filename, ".wad"); buffer = G_GetDemoFooter(filename, &demoex_p, &size); if (buffer) { //the demo has an additional information itself size_t i; waddata_t waddata; //write an additional info from a demo to demoex.wad if (!M_WriteFile(demoex_filename, (void*)demoex_p, size)) { lprintf(LO_ERROR, "G_ReadDemoFooter: failed to create demoex temp file %s", demoex_filename); } else { //add demoex.wad to the wads list D_AddFile(demoex_filename, source_auto_load); //cache demoex.wad for immediately getting its data with W_CacheLumpName W_Init(); WadDataInit(&waddata); //enumerate and save all auto-loaded files and demo for future use for (i = 0; i < numwadfiles; i++) { if ( wadfiles[i].src == source_auto_load || wadfiles[i].src == source_pre || wadfiles[i].src == source_lmp) { WadDataAddItem(&waddata, wadfiles[i].name, wadfiles[i].src, 0); } } //get needed wads and dehs from demoex.wad //restore all critical params like -spechit x R_DemoEx_GetParams(buffer, &waddata); //replace old wadfiles with the new ones if (waddata.numwadfiles) { for (i = 0; (size_t)i < waddata.numwadfiles; i++) { if (waddata.wadfiles[i].src == source_iwad) { W_ReleaseAllWads(); WadDataToWadFiles(&waddata); result = true; break; } } } WadDataFree(&waddata); } free(buffer); } else { demoex_filename[0] = 0; } } return result; #else return false; #endif }
void M_LoadDefaults (void) { int i; int len; FILE* f; char def[80]; char strparm[100]; char* newstring = NULL; // killough int parm; boolean isstring; // set everything to base values numdefaults = sizeof(defaults)/sizeof(defaults[0]); for (i = 0 ; i < numdefaults ; i++) { if (defaults[i].location.ppsz) *defaults[i].location.ppsz = strdup(defaults[i].defaultvalue.psz); if (defaults[i].location.pi) *defaults[i].location.pi = defaults[i].defaultvalue.i; } // check for a custom default file i = M_CheckParm ("-config"); if (i && i < myargc-1) defaultfile = myargv[i+1]; else { const char* exedir = I_DoomExeDir(); defaultfile = malloc(PATH_MAX+1); /* get config file from same directory as executable */ #ifdef HAVE_SNPRINTF snprintf((char *)defaultfile, PATH_MAX, #else sprintf ((char *)defaultfile, #endif "%s%s%sboom.cfg", exedir, HasTrailingSlash(exedir) ? "" : "/", #if ((defined GL_DOOM) && (defined _MSC_VER)) "gl"); #else "pr"); #endif } lprintf (LO_CONFIRM, " default file: %s\n",defaultfile); // read the file in, overriding any set defaults f = fopen (defaultfile, "r"); if (f) { while (!feof(f)) { isstring = false; if (fscanf (f, "%79s %[^\n]\n", def, strparm) == 2) { //jff 3/3/98 skip lines not starting with an alphanum if (!isalnum(def[0])) continue; if (strparm[0] == '"') { // get a string default isstring = true; len = strlen(strparm); newstring = (char *) malloc(len); strparm[len-1] = 0; // clears trailing double-quote mark strcpy(newstring, strparm+1); // clears leading double-quote mark } else if ((strparm[0] == '0') && (strparm[1] == 'x')) { // CPhipps - allow ints to be specified in hex sscanf(strparm+2, "%x", &parm); } else { sscanf(strparm, "%i", &parm); // Keycode hack removed } for (i = 0 ; i < numdefaults ; i++) if ((defaults[i].type != def_none) && !strcmp(def, defaults[i].name)) { // CPhipps - safety check if (isstring != IS_STRING(defaults[i])) { lprintf(LO_WARN, "M_LoadDefaults: Type mismatch reading %s\n", defaults[i].name); continue; } if (!isstring) { //jff 3/4/98 range check numeric parameters if ((defaults[i].minvalue==UL || defaults[i].minvalue<=parm) && (defaults[i].maxvalue==UL || defaults[i].maxvalue>=parm)) *(defaults[i].location.pi) = parm; } else { free((char*)*(defaults[i].location.ppsz)); /* phares 4/13/98 */ *(defaults[i].location.ppsz) = newstring; } break; } } } fclose (f); } //jff 3/4/98 redundant range checks for hud deleted here /* proff 2001/7/1 - added prboom.wad as last entry so it's always loaded and doesn't overlap with the cfg settings */ wad_files[MAXLOADFILES-1]="prboom.wad"; }