// // E_GetStringForName // // As above, but causes an error if the string doesn't exist. // edf_string_t *E_GetStringForName(const char *key) { edf_string_t *str = E_StringForName(key); if(!str) I_Error("E_GetStringForName: no such string '%s'\n", key); return str; }
// // E_CreateString // // Creates an EDF string object with the given value which is hashable // by one or two different keys. The mnemonic key is required and must // be 128 or fewer characters long. The numeric key is optional. If a // negative value is passed as the numeric key, the object will not be // added to the numeric hash table. // edf_string_t *E_CreateString(const char *value, const char *key, int num) { int keyval; edf_string_t *newStr; if((newStr = E_StringForName(key))) { // Modify existing object. E_ReplaceString(newStr->string, estrdup(value)); // Modify numeric id and rehash object if necessary if(num != newStr->numkey) { // If old key is >= 0, must remove from hash first if(newStr->numkey >= 0) E_DelStringFromNumHash(newStr); // Set new key newStr->numkey = num; // If new key >= 0, add back to hash if(newStr->numkey >= 0) E_AddStringToNumHash(newStr); } } else { // Create a new string object newStr = estructalloc(edf_string_t, 1); // copy keys into string object if(strlen(key) >= sizeof(newStr->key)) { E_EDFLoggedErr(2, "E_CreateString: invalid string mnemonic '%s'\n", key); } strncpy(newStr->key, key, sizeof(newStr->key)); newStr->numkey = num; // duplicate value newStr->string = estrdup(value); // add to hash tables keyval = D_HashTableKey(newStr->key) % NUM_EDFSTR_CHAINS; newStr->next = edf_str_chains[keyval]; edf_str_chains[keyval] = newStr; // numeric key is not required if(num >= 0) E_AddStringToNumHash(newStr); } return newStr; }
static void HI_loadData(void) { int i; char mapname[9]; memset(mapname, 0, 9); // load interpic hi_interpic = NULL; hi_exitpic = nullptr; if(estrnonempty(hi_wbs.li_lastexitpic)) { hi_exitpic = PatchLoader::CacheName(wGlobalDir, hi_wbs.li_lastexitpic, PU_STATIC); } if(estrnonempty(hi_wbs.li_nextenterpic)) { hi_interpic = PatchLoader::CacheName(wGlobalDir, hi_wbs.li_nextenterpic, PU_STATIC); } else if(gameepisode <= 3) { sprintf(mapname, "MAPE%d", gameepisode); hi_interpic = PatchLoader::CacheName(wGlobalDir, mapname, PU_STATIC); } // load positional indicators hi_in_x = PatchLoader::CacheName(wGlobalDir, "IN_X", PU_STATIC); hi_in_yah = PatchLoader::CacheName(wGlobalDir, "IN_YAH", PU_STATIC); // get lump numbers for faces for(i = 0; i < 4; i++) { char tempstr[9]; memset(tempstr, 0, 9); sprintf(tempstr, "FACEA%.1d", i); hi_faces[i] = W_GetNumForName(tempstr); sprintf(tempstr, "FACEB%.1d", i); hi_dead_faces[i] = W_GetNumForName(tempstr); } // haleyjd 03/27/05: EDF-defined intermission map names mapName = NULL; nextMapName = NULL; { char nameBuffer[24]; const char *basename; edf_string_t *str; // set current map if(hi_wbs.li_lastlevelname && *hi_wbs.li_lastlevelname) mapName = hi_wbs.li_lastlevelname; else { psnprintf(nameBuffer, 24, "_IN_NAME_%s", gamemapname); if((str = E_StringForName(nameBuffer))) mapName = str->string; } if(hi_wbs.li_nextlevelname && *hi_wbs.li_nextlevelname) { nextMapName = hi_wbs.li_nextlevelname; return; } // are we going to a secret level? basename = hi_wbs.gotosecret ? LevelInfo.nextSecret : LevelInfo.nextLevel; // set next map if(*basename) { psnprintf(nameBuffer, 24, "_IN_NAME_%s", basename); if((str = E_StringForName(nameBuffer))) nextMapName = str->string; } else { // try ExMy and MAPxy defaults for normally-named maps if(isExMy(gamemapname)) { psnprintf(nameBuffer, 24, "_IN_NAME_E%01dM%01d", hi_wbs.epsd + 1, hi_wbs.next + 1); if((str = E_StringForName(nameBuffer))) nextMapName = str->string; } else if(isMAPxy(gamemapname)) { psnprintf(nameBuffer, 24, "_IN_NAME_MAP%02d", hi_wbs.next + 1); if((str = E_StringForName(nameBuffer))) nextMapName = str->string; } } } }