int GetFullPath(const char* FileName, const char* ext, char *Buffer, size_t BufferLength) { int i, Result; char *p; char dir[PATH_MAX]; for (i=0; i<3; i++) { switch(i) { case 0: getcwd(dir, sizeof(dir)); break; case 1: if (!getenv("DOOMWADDIR")) continue; strcpy(dir, getenv("DOOMWADDIR")); break; case 2: strcpy(dir, I_DoomExeDir()); break; } Result = SearchPath(dir,FileName,ext,BufferLength,Buffer,&p); if (Result) return Result; } return false; }
static void IdentifyVersion (void) { int i; //jff 3/24/98 index of args on commandline struct stat sbuf; //jff 3/24/98 used to test save path for existence char *iwad; // set save path to -save parm or current dir //jff 3/27/98 default to current dir //V.Aguilar (5/30/99): In LiNUX, default to $HOME/.lxdoom { // CPhipps - use DOOMSAVEDIR if defined char* p = getenv("DOOMSAVEDIR"); if (p != NULL) if (strlen(p) > PATH_MAX-12) p = NULL; strcpy(basesavegame,(p == NULL) ? I_DoomExeDir() : p); } if ((i=M_CheckParm("-save")) && i<myargc-1) //jff 3/24/98 if -save present { if (!stat(myargv[i+1],&sbuf) && S_ISDIR(sbuf.st_mode)) // and is a dir { strcpy(basesavegame,myargv[i+1]); //jff 3/24/98 use that for savegame NormalizeSlashes(basesavegame); //jff 9/22/98 fix c:\ not working } //jff 9/3/98 use logical output routine else lprintf(LO_ERROR,"Error: -save path does not exist, using %s\n", basesavegame); } // locate the IWAD and determine game mode from it iwad = FindIWADFile(); #if (defined(GL_DOOM) && defined(_DEBUG)) // proff 11/99: used for debugging { FILE *f; f=fopen("levelinfo.txt","w"); if (f) { fprintf(f,"%s\n",iwad); fclose(f); } } #endif if (iwad && *iwad) { //jff 9/3/98 use logical output routine lprintf(LO_CONFIRM,"IWAD found: %s\n",iwad); //jff 4/20/98 print only if found CheckIWAD(iwad,&gamemode,&haswolflevels); /* jff 8/23/98 set gamemission global appropriately in all cases * cphipps 12/1999 - no version output here, leave that to the caller */ switch(gamemode) { case retail: case registered: case shareware: gamemission = doom; break; case commercial: i = strlen(iwad); gamemission = doom2; if (i>=10 && !strnicmp(iwad+i-10,"doom2f.wad",10)) language=french; else if (i>=7 && !strnicmp(iwad+i-7,"tnt.wad",7)) gamemission = pack_tnt; else if (i>=12 && !strnicmp(iwad+i-12,"plutonia.wad",12)) gamemission = pack_plut; break; default: gamemission = none; break; } if (gamemode == indetermined) //jff 9/3/98 use logical output routine lprintf(LO_WARN,"Unknown Game Version, may not work\n"); D_AddFile(iwad,source_iwad); free(iwad); } else I_Error("IdentifyVersion: IWAD not found\n" "prboom requires a doom data (\"IWAD\") file to use.\n" "please install one, either freedoom or a package built\n" "using game-data-packager.\n" ); }
static void FindResponseFile (void) { int i; for (i = 1;i < myargc;i++) if (myargv[i][0] == '@') { int size; int index; int indexinfile; byte *file = NULL; const char **moreargs = malloc(myargc * sizeof(const char*)); const char **newargv; // proff 04/05/2000: Added for searching responsefile char fname[PATH_MAX+1]; strcpy(fname,&myargv[i][1]); AddDefaultExtension(fname,".rsp"); // READ THE RESPONSE FILE INTO MEMORY // proff 04/05/2000: changed for searching responsefile // cph 2002/08/09 - use M_ReadFile for simplicity size = M_ReadFile(fname, &file); // proff 04/05/2000: Added for searching responsefile if (size < 0) { strcat(strcpy(fname,I_DoomExeDir()),&myargv[i][1]); AddDefaultExtension(fname,".rsp"); size = M_ReadFile(fname, &file); } if (size < 0) { /* proff 04/05/2000: Changed from LO_FATAL * proff 04/05/2000: Simply removed the exit(1); * cph - made fatal, don't drop through and SEGV */ I_Error("No such response file: %s",fname); } //jff 9/3/98 use logical output routine lprintf(LO_CONFIRM,"Found response file %s\n",fname); // proff 04/05/2000: Added check for empty rsp file if (size<=0) { int k; lprintf(LO_ERROR,"\nResponse file empty!\n"); newargv = calloc(sizeof(char *),MAXARGVS); newargv[0] = myargv[0]; for (k = 1,index = 1;k < myargc;k++) { if (i!=k) newargv[index++] = myargv[k]; } myargc = index; myargv = newargv; return; } // KEEP ALL CMDLINE ARGS FOLLOWING @RESPONSEFILE ARG memcpy((void *)moreargs,&myargv[i+1],(index = myargc - i - 1) * sizeof(myargv[0])); { const char *firstargv = myargv[0]; newargv = calloc(sizeof(char *),MAXARGVS); newargv[0] = firstargv; } { byte *infile = file; indexinfile = 0; indexinfile++; // SKIP PAST ARGV[0] (KEEP IT) do { while (size > 0 && isspace(*infile)) { infile++; size--; } if (size > 0) { char *s = malloc(size+1); char *p = s; int quoted = 0; while (size > 0) { // Whitespace terminates the token unless quoted if (!quoted && isspace(*infile)) break; if (*infile == '\"') { // Quotes are removed but remembered infile++; size--; quoted ^= 1; } else { *p++ = *infile++; size--; } } if (quoted) I_Error("Runaway quoted string in response file"); // Terminate string, realloc and add to argv *p = 0; newargv[indexinfile++] = realloc(s,strlen(s)+1); } } while(size > 0); } free(file); memcpy((void *)&newargv[indexinfile],moreargs,index*sizeof(moreargs[0])); free((void *)moreargs); myargc = indexinfile+index; myargv = newargv; // DISPLAY ARGS //jff 9/3/98 use logical output routine lprintf(LO_CONFIRM,"%d command-line args:\n",myargc); for (index=1;index<myargc;index++) //jff 9/3/98 use logical output routine lprintf(LO_CONFIRM,"%s\n",myargv[index]); break; } }
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"; }
void R_InitTranMap(int progress) { int lump = W_CheckNumForName("TRANMAP"); // If a tranlucency filter map lump is present, use it if (lump != -1) // Set a pointer to the translucency filter maps. main_tranmap = W_CacheLumpNum(lump); // killough 4/11/98 else if (W_CheckNumForName("PLAYPAL")!=-1) // can be called before WAD loaded { // Compose a default transparent filter map based on PLAYPAL. const byte *playpal = W_CacheLumpName("PLAYPAL"); byte *my_tranmap; char *fname; int fnlen; struct { unsigned char pct; unsigned char playpal[256]; } cache; FILE *cachefp; fnlen = doom_snprintf(NULL, 0, "%s/tranmap.dat", I_DoomExeDir()); fname = malloc(fnlen+1); doom_snprintf(fname, fnlen+1, "%s/tranmap.dat", I_DoomExeDir()); cachefp = fopen(fname, "rb"); main_tranmap = my_tranmap = Z_Malloc(256*256, PU_STATIC, 0); // killough 4/11/98 // Use cached translucency filter if it's available if (!cachefp || fread(&cache, 1, sizeof cache, cachefp) != sizeof cache || cache.pct != tran_filter_pct || memcmp(cache.playpal, playpal, sizeof cache.playpal) || fread(my_tranmap, 256, 256, cachefp) != 256 ) // killough 4/11/98 { long pal[3][256], tot[256], pal_w1[3][256]; long w1 = ((unsigned long) tran_filter_pct<<TSC)/100; long w2 = (1l<<TSC)-w1; if (progress) lprintf(LO_INFO, "Tranmap build [ ]\x08\x08\x08\x08\x08\x08\x08\x08\x08"); // First, convert playpal into long int type, and transpose array, // for fast inner-loop calculations. Precompute tot array. { register int i = 255; register const unsigned char *p = playpal+255*3; do { register long t,d; pal_w1[0][i] = (pal[0][i] = t = p[0]) * w1; d = t*t; pal_w1[1][i] = (pal[1][i] = t = p[1]) * w1; d += t*t; pal_w1[2][i] = (pal[2][i] = t = p[2]) * w1; d += t*t; p -= 3; tot[i] = d << (TSC-1); } while (--i>=0); } // Next, compute all entries using minimum arithmetic. { int i,j; byte *tp = my_tranmap; for (i=0;i<256;i++) { long r1 = pal[0][i] * w2; long g1 = pal[1][i] * w2; long b1 = pal[2][i] * w2; if (!(i & 31) && progress) //jff 8/3/98 use logical output routine lprintf(LO_INFO,"."); for (j=0;j<256;j++,tp++) { register int color = 255; register long err; long r = pal_w1[0][j] + r1; long g = pal_w1[1][j] + g1; long b = pal_w1[2][j] + b1; long best = LONG_MAX; do if ((err = tot[color] - pal[0][color]*r - pal[1][color]*g - pal[2][color]*b) < best) best = err, *tp = color; while (--color >= 0); } } } if ((cachefp = fopen(fname,"wb")) != NULL) // write out the cached translucency map { cache.pct = tran_filter_pct; memcpy(cache.playpal, playpal, 256); fseek(cachefp, 0, SEEK_SET); fwrite(&cache, 1, sizeof cache, cachefp); fwrite(main_tranmap, 256, 256, cachefp); // CPhipps - leave close for a few lines... } } if (cachefp) // killough 11/98: fix filehandle leak fclose(cachefp); free(fname); W_UnlockLumpName("PLAYPAL"); } }
static bool IdentifyVersion (void) { int i; //jff 3/24/98 index of args on commandline struct stat sbuf; //jff 3/24/98 used to test save path for existence char *iwad = NULL; // set save path to -save parm or current dir strcpy(basesavegame,I_DoomExeDir()); lprintf(LO_ALWAYS, "IdentifyVersion: basesavegame: %s\n", basesavegame); #ifndef __CELLOS_LV2__ if ((i=M_CheckParm("-save")) && i<myargc-1) //jff 3/24/98 if -save present { if (!stat(myargv[i+1],&sbuf) && S_ISDIR(sbuf.st_mode)) // and is a dir { strcpy(basesavegame,myargv[i+1]); //jff 3/24/98 use that for savegame NormalizeSlashes(basesavegame); //jff 9/22/98 fix c:\ not working } //jff 9/3/98 use logical output routine else lprintf(LO_ERROR,"Error: -save path does not exist, using %s\n", basesavegame); } #endif // locate the IWAD and determine game mode from it iwad = FindIWADFile(); lprintf(LO_ALWAYS, "iwad: %s\n", iwad); if (iwad && *iwad) { //jff 9/3/98 use logical output routine lprintf(LO_CONFIRM,"IWAD found: %s\n",iwad); //jff 4/20/98 print only if found if (!CheckIWAD(iwad,&gamemode,&haswolflevels)) return false; /* jff 8/23/98 set gamemission global appropriately in all cases * cphipps 12/1999 - no version output here, leave that to the caller */ switch(gamemode) { case retail: case registered: case shareware: gamemission = doom; break; case commercial: i = strlen(iwad); gamemission = doom2; if (i>=10 && !strnicmp(iwad+i-10,"doom2f.wad",10)) language=french; else if (i>=7 && !strnicmp(iwad+i-7,"tnt.wad",7)) gamemission = pack_tnt; else if (i>=12 && !strnicmp(iwad+i-12,"plutonia.wad",12)) gamemission = pack_plut; break; default: gamemission = none; break; } if (gamemode == indetermined) //jff 9/3/98 use logical output routine lprintf(LO_WARN,"Unknown Game Version, may not work\n"); D_AddFile(iwad,source_iwad); free(iwad); } else return I_Error("IdentifyVersion: IWAD not found\n"); return true; }
static GLShader* gld_LoadShader(const char *vpname, const char *fpname) { #define buffer_size 2048 int idx; int linked; char buffer[buffer_size]; char *vp_data = NULL; char *fp_data = NULL; int vp_size, fp_size; size_t vp_fnlen, fp_fnlen; char *filename = NULL; GLShader* shader = NULL; vp_fnlen = doom_snprintf(NULL, 0, "%s/shaders/%s.txt", I_DoomExeDir(), vpname); fp_fnlen = doom_snprintf(NULL, 0, "%s/shaders/%s.txt", I_DoomExeDir(), fpname); filename = malloc(MAX(vp_fnlen, fp_fnlen) + 1); sprintf(filename, "%s/shaders/%s.txt", I_DoomExeDir(), vpname); vp_size = ReadLump(filename, vpname, &vp_data); sprintf(filename, "%s/shaders/%s.txt", I_DoomExeDir(), fpname); fp_size = ReadLump(filename, fpname, &fp_data); if (vp_data && fp_data) { shader = calloc(1, sizeof(GLShader)); shader->hVertProg = GLEXT_glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB); shader->hFragProg = GLEXT_glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB); GLEXT_glShaderSourceARB(shader->hVertProg, 1, &vp_data, &vp_size); GLEXT_glShaderSourceARB(shader->hFragProg, 1, &fp_data, &fp_size); GLEXT_glCompileShaderARB(shader->hVertProg); GLEXT_glCompileShaderARB(shader->hFragProg); shader->hShader = GLEXT_glCreateProgramObjectARB(); GLEXT_glAttachObjectARB(shader->hShader, shader->hVertProg); GLEXT_glAttachObjectARB(shader->hShader, shader->hFragProg); GLEXT_glLinkProgramARB(shader->hShader); GLEXT_glGetInfoLogARB(shader->hShader, buffer_size, NULL, buffer); GLEXT_glGetObjectParameterivARB(shader->hShader, GL_OBJECT_LINK_STATUS_ARB, &linked); if (linked) { lprintf(LO_INFO, "gld_LoadShader: Shader \"%s+%s\" compiled OK: %s\n", vpname, fpname, buffer); shader->lightlevel_index = GLEXT_glGetUniformLocationARB(shader->hShader, "lightlevel"); GLEXT_glUseProgramObjectARB(shader->hShader); idx = GLEXT_glGetUniformLocationARB(shader->hShader, "tex"); GLEXT_glUniform1iARB(idx, 0); GLEXT_glUseProgramObjectARB(0); } else { lprintf(LO_ERROR, "gld_LoadShader: Error compiling shader \"%s+%s\": %s\n", vpname, fpname, buffer); free(shader); shader = NULL; } } free(filename); free(vp_data); free(fp_data); return shader; }
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 #if ((defined GL_DOOM) && (defined _MSC_VER)) #define BOOM_CFG "glboom.cfg" #else #define BOOM_CFG "prboom.cfg" #endif i = M_CheckParm ("-config"); if (i && i < myargc-1) defaultfile = strdup(myargv[i+1]); else { const char* exedir = I_DoomExeDir(); /* get config file from same directory as executable */ #if 1 int len = doom_snprintf(NULL, 0, BOOM_CFG); defaultfile = malloc(len+1); doom_snprintf(defaultfile, len+1, BOOM_CFG); #else int len = doom_snprintf(NULL, 0, "%s/" BOOM_CFG, exedir); defaultfile = malloc(len+1); doom_snprintf(defaultfile, len+1, "%s/" BOOM_CFG, exedir); #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 { union { const char **c; char **s; } u; // type punning via unions u.c = defaults[i].location.ppsz; free(*(u.s)); *(u.s) = newstring; } break; } } } fclose (f); } //jff 3/4/98 redundant range checks for hud deleted here }