hgestrings.cpp
上传用户:maxiaolivb
上传日期:2022-06-07
资源大小:915k
文件大小:3k
- /*
- ** Haaf's Game Engine 1.6
- ** Copyright (C) 2003-2006, Relish Games
- ** hge.relishgames.com
- **
- ** hgeStringTable helper class implementation
- */
- #include "....includehgestrings.h"
- #include <ctype.h>
- const char STRHEADERTAG[]="[HGESTRINGTABLE]";
- const char STRFORMATERROR[]="String table %s has incorrect format.";
- HGE *hgeStringTable::hge=0;
- hgeStringTable::hgeStringTable(const char *filename)
- {
- int i;
- void *data;
- DWORD size;
- char *desc, *pdesc;
- NamedString *str;
- char str_name[MAXSTRNAMELENGTH];
- char *str_value, *pvalue;
-
- hge=hgeCreate(HGE_VERSION);
- strings=0;
- // load string table file
- data=hge->Resource_Load(filename, &size);
- if(!data) return;
- desc = new char[size+1];
- memcpy(desc,data,size);
- desc[size]=0;
- hge->Resource_Free(data);
- // check header
- if(memcmp(desc, STRHEADERTAG, sizeof(STRHEADERTAG)-1))
- {
- hge->System_Log(STRFORMATERROR, filename);
- delete[] desc;
- return;
- }
- pdesc=desc+sizeof(STRHEADERTAG);
- str_value=new char[8192];
- for(;;)
- {
- // skip whitespaces
- while(isspace(*pdesc)) pdesc++;
- if(!*pdesc) break;
- // get string name -> str_name
- i=0;
- while(pdesc[i] && pdesc[i]!='=' && !isspace(pdesc[i]) && i<MAXSTRNAMELENGTH)
- {
- str_name[i]=pdesc[i];
- i++;
- }
- str_name[i]=0;
- pdesc+=i;
- // skip string name overflow characters
- while(*pdesc && *pdesc!='=' && !isspace(*pdesc)) pdesc++;
- if(!*pdesc) break;
- // skip whitespaces to '='
- while(isspace(*pdesc)) pdesc++;
- if(*pdesc!='=') { hge->System_Log(STRFORMATERROR, filename); break; }
- pdesc++;
- // skip whitespaces to '"'
- while(isspace(*pdesc)) pdesc++;
- if(*pdesc!='"') { hge->System_Log(STRFORMATERROR, filename); break; }
- pdesc++;
- // parse string value till the closing '"' -> str_value
- // consider: ", n, \, LF, CR, whitespaces at line begin/end
- pvalue=str_value;
- while(*pdesc && *pdesc!='"')
- {
- if(*pdesc=='n' || *pdesc=='r')
- {
- while(isspace(*pdesc)) pdesc++;
- pvalue--;
- while(pvalue>=str_value && isspace(*pvalue)) pvalue--;
- pvalue++; *pvalue=' '; pvalue++;
- continue;
- }
- if(*pdesc=='\')
- {
- pdesc++;
- if(!*pdesc) continue;
- if(*pdesc=='n') *pvalue='n';
- else *pvalue=*pdesc;
- pvalue++;
- pdesc++;
- continue;
- }
- *pvalue=*pdesc; pvalue++;
- pdesc++;
- }
- *pvalue=0;
- // add the parsed string to the list
- str=new NamedString;
- strcpy(str->name, str_name);
- str->string=new char[strlen(str_value)+1];
- strcpy(str->string, str_value);
- str->next=strings;
- strings=str;
- if(!*pdesc) break;
- pdesc++;
- }
- delete[] str_value;
- delete[] desc;
- }
- hgeStringTable::~hgeStringTable()
- {
- NamedString *str, *strnext;
- str=strings;
- while(str)
- {
- strnext=str->next;
- delete[] str->string;
- delete str;
- str=strnext;
- }
- hge->Release();
- }
- char *hgeStringTable::GetString(const char *name)
- {
- NamedString *str=strings;
- while(str)
- {
- if(!strcmp(name, str->name)) return str->string;
- str=str->next;
- }
- return 0;
- }