123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461 |
- // AJM: ADDED THIS ENTIRE FILE IN
- #include "csg.h"
- #ifdef HLCSG_WADCFG
- //#ifdef SYSTEM_WIN32
- #if defined(SYSTEM_WIN32) && !defined( __GNUC__ )
- # include "atlbase.h" // win32 registry API
- #pragma warning(disable:4996)
- #else
- char *g_apppath = NULL; //JK: Stores application path
- #endif
- #define WAD_CONFIG_FILE "wad.cfg"
- typedef struct wadname_s
- {
- char wadname[_MAX_PATH];
- bool wadinclude;
- struct wadname_s* next;
- } wadname_t;
- typedef struct wadconfig_s
- {
- char name[_MAX_PATH];
- int entries;
- wadname_t* firstentry;
- wadconfig_s* next;
- } wadconfig_t;
- wadconfig_t* g_WadCfg; // anchor for the wadconfigurations linked list
- bool g_bWadConfigsLoaded = false;
- int g_wadcfglinecount = 1;
- //JK: added in
- char *g_wadcfgfile = NULL;
- // little helper function
- void stripwadpath (char *str)
- {
- char *p = str + strlen (str) - 1;
- while ((*p == ' ' || *p == '\n' || *p == '\t') && p >= str) *p-- = '\0';
- }
- // =====================================================================================
- // WadCfgParseError
- // =====================================================================================
- void WadCfgParseError(const char* message, int linenum, char* got)
- {
- stripwadpath(got); // strip newlines
- Log("Error parsing " WAD_CONFIG_FILE ", line %i:\n"
- "%s, got '%s'\n", linenum, message, got);
- Log("If you need help on usage of the wad.cfg file, be sure to check http://www.zhlt.info/using-wad.cfg.html that came"
- " in the zip file with these tools.\n");
- g_bWadConfigsLoaded = false;
- }
- // ============================================================================
- // IsWhitespace
- // ============================================================================
- bool IsWhitespace(const char ThinkChar)
- {
- if ((ThinkChar == ' ') || (ThinkChar == '\t') || (ThinkChar == '\n') || (ThinkChar == 13) /* strange whitespace char */)
- return true;
- return false;
- }
- // ============================================================================
- // Safe_GetToken
- // ============================================================================
- void Safe_GetToken(FILE* source, char* TokenBuffer, const unsigned int MaxBufferLength)
- {
- char ThinkChar[1]; // 2 char array = thinkchar and null terminator
- bool InToken = false; // are we getting a token?
- bool InQuotes = false; // are we in quotes?
- bool InComment = false; // are we in a comment (//)?
- //fpos_t* sourcepos;
- long sourcepos;
- TokenBuffer[0] = '\0';
- ThinkChar[1] = '\0';
-
- while(!feof(source))
- {
- if (strlen(TokenBuffer) >= MaxBufferLength)
- return; // we cant add any more chars onto the buffer, its maxed out
- ThinkChar[0] = fgetc(source);
-
- if (ThinkChar[0] == '\n') // newline
- {
- g_wadcfglinecount++;
- InComment = false;
- }
- if (ThinkChar[0] == 'ÿ')
- return;
-
- if (IsWhitespace(ThinkChar[0]) && !InToken)
- continue; // whitespace before token, ignore
- if (ThinkChar[0] == '"') // quotes
- {
- if(InQuotes)
- InQuotes = false;
- else
- InQuotes = true;
- continue; // dont include quotes
- }
- if (ThinkChar[0] == '/')
- {
- sourcepos = ftell(source);
- // might be a comment, see if the next char is a forward slash
- if (fgetc(source) == '/') // if it is, were in a comment
- {
- InComment = true;
- continue;
- }
- else // if not, rewind pretend nothing happened...
- {
- fseek(source, sourcepos, 0);
- }
- }
- if (
- (IsWhitespace(ThinkChar[0]) && InToken && !InQuotes) // whitespace AFTER token and not in quotes
- || (InToken && InComment) // we hit a comment, and we have our token
- )
- {
- //printf("[gt: %s]\n", TokenBuffer);
- return;
- }
- if (!InComment)
- {
- strcat(TokenBuffer, ThinkChar);
- InToken = true;
- }
- }
- }
- // =====================================================================================
- // GetWadConfig
- // return true if we didnt encounter any fatal errors
- #define MAX_TOKENBUFFER _MAX_PATH
- // =====================================================================================
- bool GetWadConfig(FILE* wadcfg, wadconfig_t* wadconfig)
- {
- char TokenBuffer[MAX_TOKENBUFFER];
- wadname_t* current;
- wadname_t* previous;
- while (!feof(wadcfg))
- {
- Safe_GetToken(wadcfg, TokenBuffer, MAX_TOKENBUFFER);
- if (!strcmp(TokenBuffer, "}"))
- return true; // no more work to do
-
- if (!strcmp(TokenBuffer, ";"))
- continue; // old seperator, no longer used but here for backwards compadibility
- if (!strcmp(TokenBuffer, "{")) // wtf
- {
- WadCfgParseError("Expected wadpath (Nested blocks illegal)", g_wadcfglinecount, TokenBuffer);
- return false;
- }
- // otherwise assume its a wadpath, make an entry in this configuration
- current = (wadname_t*)malloc(sizeof(wadname_t));
- wadconfig->entries++;
- current->next = NULL;
- current->wadinclude = false;
- if (!strcmp(TokenBuffer, "include"))
- {
- current->wadinclude = true;
- Safe_GetToken(wadcfg, TokenBuffer, MAX_TOKENBUFFER);
- }
-
- strcpy_s(current->wadname, TokenBuffer);
-
- if (!wadconfig->firstentry)
- {
- wadconfig->firstentry = current;
- }
- else
- {
- previous->next = current;
- }
- previous = current;
- previous->next = NULL;
- }
- safe_snprintf(TokenBuffer, MAX_TOKENBUFFER, "Unexptected end of file encountered while parsing configuration '%s'", wadconfig->name);
- WadCfgParseError(TokenBuffer, g_wadcfglinecount, "(eof)");
- return false;
- }
- #undef MAX_TOKENBUFFER
- // =====================================================================================
- // LoadWadConfigFile
- // =====================================================================================
- void LoadWadConfigFile()
- {
- FILE* wadcfg;
- wadconfig_t* current;
- wadconfig_t* previous;
- char temp[_MAX_PATH];
- //JK: If exists lets use user-defined file
- if (g_wadcfgfile && q_exists(g_wadcfgfile))
- {
- wadcfg = fopen(g_wadcfgfile, "r");
- }
- else // find the wad.cfg file
- {
- char appdir[_MAX_PATH];
- char tmp[_MAX_PATH];
-
- memset(tmp, 0, sizeof(tmp));
- memset(appdir, 0, sizeof(appdir));
- // Get application directory (only an approximation on posix systems)
- // try looking in the directory we were run from
- #ifdef SYSTEM_WIN32
- GetModuleFileName(NULL, tmp, _MAX_PATH);
- #else
- safe_strncpy(tmp, g_apppath, _MAX_PATH);
- #endif
-
- ExtractFilePath(tmp, appdir);
- safe_snprintf(tmp, _MAX_PATH, "%s%s", appdir, WAD_CONFIG_FILE);
- #ifdef _DEBUG
- Log("[dbg] Trying '%s'\n", tmp);
- #endif
- if (!q_exists(tmp))
- {
- // try the Half-Life directory
- #ifdef SYSTEM_WIN32
- {
- HKEY HLMachineKey;
- DWORD disposition;
- DWORD dwType, dwSize;
- // REG: create machinekey
- RegCreateKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\Valve\\Half-Life"), 0, NULL,
- 0, 0, NULL, &HLMachineKey, &disposition);
- // REG: get hl dir
- dwType = REG_SZ;
- dwSize = _MAX_PATH;
- RegQueryValueEx(HLMachineKey, TEXT("InstallPath"), NULL, &dwType, (PBYTE)&appdir, &dwSize);
- }
-
- safe_strncpy(tmp, appdir, _MAX_PATH);
- safe_strncat(tmp, SYSTEM_SLASH_STR, _MAX_PATH); // system slash pointless as this will only work on win32, but anyway...
- safe_strncat(tmp, WAD_CONFIG_FILE, _MAX_PATH);
- #ifdef _DEBUG
- Log("[dbg] Trying '%s'\n", tmp);
- #endif
- if (!q_exists(tmp))
- #endif // SYSTEM_WIN32
- {
- // still cant find it, error out
- Log("Warning: could not find wad configurations file\n"
- "Make sure that wad.cfg is in the Half-Life directory or the current working directory\n"
- );
- return;
- }
- }
- wadcfg = fopen(tmp, "r");
- }
- if (!wadcfg)
- {
- // cant open it, die
- Log("Warning: could not open the wad configurations file\n"
- "Make sure that wad.cfg is in the Half-Life directory or the current working directory\n"
- );
- return;
- }
- while(!feof(wadcfg))
- {
- Safe_GetToken(wadcfg, temp, MAX_WAD_CFG_NAME);
- if (!strcmp(temp, "HalfLifePath=")) // backwards compadibitly
- {
- Safe_GetToken(wadcfg, temp, MAX_WAD_CFG_NAME);
- Warning("Redundant line in " WAD_CONFIG_FILE ": \"HalfLifePath= %s\" - Ignoring...\n",
- temp);
- continue;
- }
- if (feof(wadcfg))
- break;
- // assume its the name of a configuration
- current = (wadconfig_t*)malloc(sizeof(wadconfig_t));
- safe_strncpy(current->name, temp, _MAX_PATH);
- current->entries = 0;
- current->next = NULL;
- current->firstentry = NULL;
- // make sure the next char starts a wad configuration
- Safe_GetToken(wadcfg, temp, _MAX_PATH);
- if (strcmp(temp, "{"))
- {
- WadCfgParseError("Expected start of wadfile configuration, '{'", g_wadcfglinecount, temp);
- //Log("[dbg] temp[0] is %i\n", temp[0]);
- fclose(wadcfg);
- return;
- }
- // otherwise were ok, get the definition
- if (!GetWadConfig(wadcfg, current))
- {
- fclose(wadcfg);
- return;
- }
- // add this config to the list
- if (!g_WadCfg)
- {
- g_WadCfg = current;
- }
- else
- {
- previous->next = current;
- }
- previous = current;
- previous->next = NULL;
- }
- g_bWadConfigsLoaded = true;
- }
- // =====================================================================================
- // ProcessWadConfiguration
- // =====================================================================================
- void ProcessWadConfiguration()
- {
- int usedwads = 0;
- char szTmp[1024]; // arbitrary, but needs to be large. probably bigger than this.
- wadconfig_t* config;
- wadname_t* path;
- if(!g_bWadConfigsLoaded) // we did a graceful exit due to some warning/error, so dont complain about it
- {
- Log("Using mapfile wad configuration\n");
- return;
- }
- szTmp[0] = 0;
- config = g_WadCfg;
- if (!wadconfigname)
- return; // this should never happen
- if (!config)
- {
- Warning("No configurations detected in wad.cfg\n"
- "using map wad configuration");
- return;
- }
- while (1)
- {
- if (!strcmp(config->name, wadconfigname))
- {
- path = config->firstentry;
- while (1)
- {
- if (!path)
- break;
- Verbose("Wadpath from wad.cfg: '%s'\n", path->wadname);
- PushWadPath(path->wadname, true);
- safe_snprintf(szTmp, 1024, "%s%s;", szTmp, path->wadname);
- usedwads++;
- if (path->wadinclude)
- g_WadInclude.push_back(path->wadname);
- // next path
- path = path->next;
- }
- break; // the user can only specify one wad configuration, were done here
- }
- // next config
- config = config->next;
- if (!config)
- break;
- }
-
- if (usedwads)
- {
- Log("Using custom wadfile configuration: '%s' (with %i wad%s)\n", wadconfigname, usedwads, usedwads > 1 ? "s" : "");
- SetKeyValue(&g_entities[0], "wad", szTmp);
- SetKeyValue(&g_entities[0], "_wad", szTmp);
- }
- else
- {
- Warning("no wadfiles are specified in configuration '%s' --\n"
- "Using map wadfile configuration", wadconfigname);
- g_bWadConfigsLoaded = false;
- }
- return;
- }
- // =====================================================================================
- // WadCfg_cleanup
- // =====================================================================================
- void WadCfg_cleanup()
- {
- wadconfig_t* config;
- wadconfig_t* nextconfig;
- wadname_t* path;
- wadname_t* nextpath;
- config = g_WadCfg;
- while (config)
- {
- path = config->firstentry;
- while (path)
- {
- nextpath = path->next;
- free(path);
- path = nextpath;
- }
- nextconfig = config->next;
- free(config);
- config = nextconfig;
- }
- g_WadCfg = NULL;
- g_bWadConfigsLoaded = false;
- return;
- }
- #endif // HLCSG_WADCFG
|