123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643 |
- #include "ripent.h"
- typedef enum
- {
- hl_undefined = -1,
- hl_export = 0,
- hl_import = 1
- }
- hl_types;
- static hl_types g_mode = hl_undefined;
- bool g_parse = DEFAULT_PARSE;
- bool g_chart = DEFAULT_CHART;
- bool g_info = DEFAULT_INFO;
- bool ScanForToken(char cToken, int &iIndex, int &iLine, bool bIgnoreWhiteSpace, bool bIgnoreOthers, int *iToken = 0)
- {
- for(; iIndex < g_entdatasize; iIndex++)
- {
-
- if(g_dentdata[iIndex] == '\0')
- {
- iIndex = g_entdatasize;
- return false;
- }
-
- if(g_dentdata[iIndex] == '\n')
- {
- iLine++;
- }
-
- if(!bIgnoreWhiteSpace && isspace(g_dentdata[iIndex]))
- {
- continue;
- }
- if(g_dentdata[iIndex] != cToken)
- {
- if(bIgnoreOthers)
- continue;
- else
- return false;
- }
-
- iIndex++;
-
- if(iToken != 0)
- {
- *iToken = iIndex - 1;
- }
- return true;
- }
-
- return false;
- }
- #include <list>
- typedef std::list<char *> CEntityPairList;
- typedef std::list<CEntityPairList *> CEntityList;
- void ParseEntityData(const char *cTab, int iTabLength, const char *cNewLine, int iNewLineLength, const char *cTerminator, int iTerminatorLength)
- {
- CEntityList EntityList;
- int iIndex = 0;
- int iLine = 0;
- char cError[256] = "";
- try
- {
-
-
-
- Log("\nParsing entity data.\n");
- while(true)
- {
-
- if(!ScanForToken('{', iIndex, iLine, false, false))
- {
- if(iIndex == g_entdatasize)
- {
-
- break;
- }
- else
- {
- sprintf_s(cError, "expected token %s on line %d.", "{", iLine);
- throw cError;
- }
- }
- CEntityPairList *EntityPairList = new CEntityPairList();
-
- while(true)
- {
-
- for(int j = 0; j < 2; j++)
- {
- int iStart;
-
- if(!ScanForToken('\"', iIndex, iLine, false, false, &iStart))
- {
- sprintf_s(cError, "expected token %s on line %d.", "\"", iLine);
- throw cError;
- }
- int iEnd;
-
- if(!ScanForToken('\"', iIndex, iLine, true, true, &iEnd))
- {
- sprintf_s(cError, "expected token %s on line %d.", "\"", iLine);
- throw cError;
- }
-
- int iLength = iEnd - iStart - 1;
- char *cString = new char[iLength + 1];
- memcpy(cString, &g_dentdata[iStart + 1], iLength);
- cString[iLength] = '\0';
-
- EntityPairList->push_back(cString);
- }
-
- if(!ScanForToken('}', iIndex, iLine, false, false))
- {
- if(g_dentdata[iIndex] == '\"')
- {
-
- continue;
- }
- else
- {
- sprintf_s(cError, "expected token %s on line %d.", "}", iLine);
- throw cError;
- }
- }
-
- EntityList.push_back(EntityPairList);
- break;
- }
- }
- Log("%d entities parsed.\n", EntityList.size());
-
-
-
- int iNewLength = 0;
- for(CEntityList::iterator i = EntityList.begin(); i != EntityList.end(); ++i)
- {
-
- iNewLength += 1;
-
- iNewLength += iNewLineLength;
- CEntityPairList *EntityPairList = *i;
- for(CEntityPairList::iterator j = EntityPairList->begin(); j != EntityPairList->end(); ++j)
- {
-
- iNewLength += iTabLength;
-
- iNewLength += 1;
- iNewLength += (int)strlen(*j);
- iNewLength += 1;
-
- iNewLength += 1;
- ++j;
-
- iNewLength += 1;
- iNewLength += (int)strlen(*j);
- iNewLength += 1;
-
- iNewLength += iNewLineLength;
- }
-
- iNewLength += 1;
-
- iNewLength += iNewLineLength;
- }
-
- iNewLength += iTerminatorLength;
-
-
-
- assume(iNewLength != 0, "No entity data.");
- assume(iNewLength < sizeof(g_dentdata), "Entity data size exceedes dentdata limit.");
-
-
-
- g_entdatasize = 0;
-
-
-
- Log("Formating entity data.\n\n");
- for(CEntityList::iterator i = EntityList.begin(); i != EntityList.end(); ++i)
- {
-
- g_dentdata[g_entdatasize] = '{';
- g_entdatasize += 1;
-
- memcpy(&g_dentdata[g_entdatasize], cNewLine, iNewLineLength);
- g_entdatasize += iNewLineLength;
- CEntityPairList *EntityPairList = *i;
- for(CEntityPairList::iterator j = EntityPairList->begin(); j != EntityPairList->end(); ++j)
- {
-
- memcpy(&g_dentdata[g_entdatasize], cTab, iTabLength);
- g_entdatasize += iTabLength;
-
- g_dentdata[g_entdatasize] = '\"';
- g_entdatasize += 1;
- memcpy(&g_dentdata[g_entdatasize], *j, strlen(*j));
- g_entdatasize += (int)strlen(*j);
- g_dentdata[g_entdatasize] = '\"';
- g_entdatasize += 1;
-
- g_dentdata[g_entdatasize] = ' ';
- g_entdatasize += 1;
- ++j;
-
- g_dentdata[g_entdatasize] = '\"';
- g_entdatasize += 1;
- memcpy(&g_dentdata[g_entdatasize], *j, strlen(*j));
- g_entdatasize += (int)strlen(*j);
- g_dentdata[g_entdatasize] = '\"';
- g_entdatasize += 1;
-
- memcpy(&g_dentdata[g_entdatasize], cNewLine, iNewLineLength);
- g_entdatasize += iNewLineLength;
- }
-
- g_dentdata[g_entdatasize] = '}';
- g_entdatasize += 1;
-
- memcpy(&g_dentdata[g_entdatasize], cNewLine, iNewLineLength);
- g_entdatasize += iNewLineLength;
- }
-
- memcpy(&g_dentdata[g_entdatasize], cTerminator, iTerminatorLength);
- g_entdatasize += iTerminatorLength;
-
-
-
- for(CEntityList::iterator i = EntityList.begin(); i != EntityList.end(); ++i)
- {
- CEntityPairList *EntityPairList = *i;
- for(CEntityPairList::iterator j = EntityPairList->begin(); j != EntityPairList->end(); ++j)
- {
- delete []*j;
- }
- delete EntityPairList;
- }
-
- }
- catch(...)
- {
-
-
-
- for(CEntityList::iterator i = EntityList.begin(); i != EntityList.end(); ++i)
- {
- CEntityPairList *EntityPairList = *i;
- for(CEntityPairList::iterator j = EntityPairList->begin(); j != EntityPairList->end(); ++j)
- {
- delete []*j;
- }
- delete EntityPairList;
- }
-
-
- if(*cError != '\0')
- {
- Error(cError);
- }
- Error("unknowen exception.");
-
- }
- }
- static void ReadBSP(const char* const name)
- {
- char filename[_MAX_PATH];
- safe_strncpy(filename, name, _MAX_PATH);
- StripExtension(filename);
- DefaultExtension(filename, ".bsp");
- LoadBSPFile(name);
- }
- static void WriteBSP(const char* const name)
- {
- char filename[_MAX_PATH];
- safe_strncpy(filename, name, _MAX_PATH);
- StripExtension(filename);
- DefaultExtension(filename, ".bsp");
- WriteBSPFile(filename);
- }
- static void WriteEntities(const char* const name)
- {
- char filename[_MAX_PATH];
- safe_strncpy(filename, name, _MAX_PATH);
- StripExtension(filename);
- DefaultExtension(filename, ".ent");
- _unlink(filename);
- {
- if(g_parse)
- {
- ParseEntityData(" ", 2, "\r\n", 2, "", 0);
- }
- FILE *f = SafeOpenWrite(filename);
- Log("\nWriting %s.\n", filename);
- SafeWrite(f, g_dentdata, g_entdatasize);
- fclose(f);
- }
- }
- static void ReadEntities(const char* const name)
- {
- char filename[_MAX_PATH];
- safe_strncpy(filename, name, _MAX_PATH);
- StripExtension(filename);
- DefaultExtension(filename, ".ent");
- {
- FILE *f = SafeOpenRead(filename);
- Log("\nReading %s.\n", filename);
- g_entdatasize = q_filelength(f);
- assume(g_entdatasize != 0, "No entity data.");
- assume(g_entdatasize < sizeof(g_dentdata), "Entity data size exceedes dentdata limit.");
- SafeRead(f, g_dentdata, g_entdatasize);
- fclose(f);
- if (g_dentdata[g_entdatasize-1] != 0)
- {
- if(g_parse)
- {
- ParseEntityData("", 0, "\n", 1, "\0", 1);
- }
- else
- {
- if(g_dentdata[g_entdatasize - 1] != '\0')
- {
- g_dentdata[g_entdatasize] = '\0';
- g_entdatasize++;
- }
- }
- }
- }
- }
- static void Usage(void)
- {
-
-
-
- Banner();
- Log("\n-= %s Options =-\n\n", g_Program);
- Log(" -export : Export entity data\n");
- Log(" -import : Import entity data\n\n");
- Log(" -parse : Parse and format entity data\n\n");
- Log(" -texdata # : Alter maximum texture memory limit (in kb)\n");
- Log(" -lightdata # : Alter maximum lighting memory limit (in kb)\n");
- Log(" -chart : Display bsp statitics\n");
- Log(" -noinfo : Do not show tool configuration information\n\n");
- Log(" mapfile : The mapfile to process\n\n");
- exit(1);
- }
- static void Settings()
- {
- char* tmp;
- if (!g_info)
- {
- return;
- }
- Log("\n-= Current %s Settings =-\n", g_Program);
- Log("Name | Setting | Default\n" "-------------------|-------------|-------------------------\n");
-
- Log("chart [ %9s ] [ %9s ]\n", g_chart ? "on" : "off", DEFAULT_CHART ? "on" : "off");
- Log("max texture memory [ %9d ] [ %9d ]\n", g_max_map_miptex, DEFAULT_MAX_MAP_MIPTEX);
- Log("max lighting memory [ %9d ] [ %9d ]\n", g_max_map_lightdata, DEFAULT_MAX_MAP_LIGHTDATA);
- switch (g_mode)
- {
- case hl_import:
- default:
- tmp = "Import";
- break;
- case hl_export:
- tmp = "Export";
- break;
- }
- Log("\n");
-
- Log("mode [ %9s ] [ %9s ]\n", tmp, "N/A");
- Log("parse [ %9s ] [ %9s ]\n", g_parse ? "on" : "off", DEFAULT_PARSE ? "on" : "off");
- Log("\n\n");
- }
- int main(int argc, char** argv)
- {
- int i;
- double start, end;
- g_Program = "ripent";
- if (argc == 1)
- {
- Usage();
- }
- for (i = 1; i < argc; i++)
- {
- if (!strcasecmp(argv[i], "-import"))
- {
- g_mode = hl_import;
- }
- else if (!strcasecmp(argv[i], "-export"))
- {
- g_mode = hl_export;
- }
-
-
- else if(!strcasecmp(argv[i], "-parse"))
- {
- g_parse = true;
- }
- else if (!strcasecmp(argv[i], "-texdata"))
- {
- if (i < argc)
- {
- int x = atoi(argv[++i]) * 1024;
- if (x > g_max_map_miptex)
- {
- g_max_map_miptex = x;
- }
- }
- else
- {
- Usage();
- }
- }
- else if (!strcasecmp(argv[i], "-lightdata"))
- {
- if (i < argc)
- {
- int x = atoi(argv[++i]) * 1024;
- if (x > g_max_map_lightdata)
- {
- g_max_map_lightdata = x;
- }
- }
- else
- {
- Usage();
- }
- }
- else if (!strcasecmp(argv[i], "-chart"))
- {
- g_chart = true;
- }
- else if (!strcasecmp(argv[i], "-noinfo"))
- {
- g_info = false;
- }
- else
- {
- safe_strncpy(g_Mapname, argv[i], _MAX_PATH);
- StripExtension(g_Mapname);
- DefaultExtension(g_Mapname, ".bsp");
- }
- }
- if (g_mode == hl_undefined)
- {
- fprintf(stderr, "%s", "Must specify either -import or -export\n");
- Usage();
- }
- if (!q_exists(g_Mapname))
- {
- fprintf(stderr, "%s", "bspfile '%s' does not exist\n", g_Mapname);
- Usage();
- }
- LogStart(argc, argv);
- atexit(LogEnd);
- Settings();
- dtexdata_init();
- atexit(dtexdata_free);
-
- start = I_FloatTime();
- switch (g_mode)
- {
- case hl_import:
- ReadBSP(g_Mapname);
- ReadEntities(g_Mapname);
- WriteBSP(g_Mapname);
- break;
- case hl_export:
- ReadBSP(g_Mapname);
- WriteEntities(g_Mapname);
- break;
- }
- if (g_chart)
- PrintBSPFileSizes();
- end = I_FloatTime();
- LogTimeElapsed(end - start);
-
- return 0;
- }
- void GetParamsFromEnt(entity_t* mapent) {}
|