summaryrefslogtreecommitdiff
path: root/utils/xbox/dumpobj/dumpobj.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /utils/xbox/dumpobj/dumpobj.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'utils/xbox/dumpobj/dumpobj.cpp')
-rw-r--r--utils/xbox/dumpobj/dumpobj.cpp407
1 files changed, 407 insertions, 0 deletions
diff --git a/utils/xbox/dumpobj/dumpobj.cpp b/utils/xbox/dumpobj/dumpobj.cpp
new file mode 100644
index 0000000..e074d25
--- /dev/null
+++ b/utils/xbox/dumpobj/dumpobj.cpp
@@ -0,0 +1,407 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+/*****************************************************************************
+ DUMPOBJ.CPP
+
+*****************************************************************************/
+#include "..\toollib\toollib.h"
+
+typedef struct section_s
+{
+ int size;
+ char* name;
+ section_s* nextPtr;
+} section_t;
+
+typedef struct obj_s
+{
+ char* filename;
+ section_t* sectionPtr;
+ obj_s* nextPtr;
+} obj_t;
+
+obj_t* g_obj_head;
+char g_sectionName[128];
+bool g_bVerbose;
+
+typedef struct
+{
+ char* filename;
+ int size;
+} entry_t;
+
+/***********************************************************
+ _SortCallback
+
+***********************************************************/
+int _SortCallback(const void *a, const void *b)
+{
+ entry_t* aPtr;
+ entry_t* bPtr;
+
+ aPtr = (entry_t*)a;
+ bPtr = (entry_t*)b;
+
+ return (aPtr->size-bPtr->size);
+}
+
+/***********************************************************
+ FreeInfo
+
+***********************************************************/
+void FreeInfo()
+{
+ obj_t* objPtr;
+ obj_t* nextObjPtr;
+ section_t* sectionPtr;
+ section_t* nextSectionPtr;
+
+ objPtr = g_obj_head;
+ while (objPtr)
+ {
+ nextObjPtr = objPtr->nextPtr;
+ sectionPtr = objPtr->sectionPtr;
+ while (sectionPtr)
+ {
+ nextSectionPtr = sectionPtr->nextPtr;
+
+ TL_Free(sectionPtr->name);
+ TL_Free(sectionPtr);
+
+ sectionPtr = nextSectionPtr;
+ }
+
+ TL_Free(objPtr->filename);
+ TL_Free(objPtr);
+
+ objPtr = nextObjPtr;
+ }
+}
+
+/***********************************************************
+ AnalyzeData
+
+***********************************************************/
+void AnalyzeData()
+{
+ obj_t* objPtr;
+ section_t* sectionPtr;
+ char* sections[128];
+ int totals[128];
+ int numSections;
+ int i;
+ int index;
+ int numEntries;
+ entry_t* entries;
+ int total;
+
+ printf("\n");
+
+ memset(totals, 0, sizeof(totals));
+
+ // determine unique sections
+ numSections = 0;
+ objPtr = g_obj_head;
+ while (objPtr)
+ {
+ sectionPtr = objPtr->sectionPtr;
+ while (sectionPtr)
+ {
+ for (i=0; i<numSections; i++)
+ {
+ if (!stricmp(sections[i],sectionPtr->name))
+ break;
+ }
+ if (i >= numSections)
+ {
+ // add it
+ sections[numSections] = sectionPtr->name;
+ numSections++;
+ assert(numSections < 128);
+
+ index = numSections-1;
+ }
+ else
+ index = i;
+
+ totals[index] += sectionPtr->size;
+
+ sectionPtr = sectionPtr->nextPtr;
+ }
+ objPtr = objPtr->nextPtr;
+ }
+
+ if (g_sectionName[0])
+ {
+ // dump only matching section
+ printf("Section: %s\n", g_sectionName);
+ printf("-------------------------\n");
+
+ // tally entries
+ numEntries = 0;
+ objPtr = g_obj_head;
+ while (objPtr)
+ {
+ sectionPtr = objPtr->sectionPtr;
+ while (sectionPtr)
+ {
+ if (!stricmp(g_sectionName, sectionPtr->name))
+ numEntries++;
+ sectionPtr = sectionPtr->nextPtr;
+ }
+ objPtr = objPtr->nextPtr;
+ }
+
+ // fill entries
+ if (numEntries)
+ {
+ entries = (entry_t*)TL_Malloc(numEntries*sizeof(entry_t));
+ numEntries = 0;
+ objPtr = g_obj_head;
+ while (objPtr)
+ {
+ sectionPtr = objPtr->sectionPtr;
+ while (sectionPtr)
+ {
+ if (!stricmp(g_sectionName, sectionPtr->name))
+ {
+ entries[numEntries].size = sectionPtr->size;
+ entries[numEntries].filename = objPtr->filename;
+ numEntries++;
+ }
+ sectionPtr = sectionPtr->nextPtr;
+ }
+ objPtr = objPtr->nextPtr;
+ }
+
+ // sort
+ qsort(entries, numEntries, sizeof(entry_t), _SortCallback);
+
+ // display results
+ int total = 0;
+ for (i=0; i<numEntries; i++)
+ {
+ printf("%8d %s\n", entries[i].size, entries[i].filename);
+ total += entries[i].size;
+ }
+ printf("-------------------------\n");
+ printf("%8d Total\n", total);
+
+ TL_Free(entries);
+ }
+ }
+ else
+ {
+ // dump all sections
+ printf("Sections:\n");
+ printf("---------\n");
+ total = 0;
+ for (i=0; i<numSections; i++)
+ {
+ printf("%8d %s\n", totals[i], sections[i]);
+ total += totals[i];
+ }
+ printf("---------\n");
+ printf("%8d\n", total);
+ }
+}
+
+
+/***********************************************************
+ LocalExec
+
+***********************************************************/
+int LocalExec(const char* batfilename, const char* arg1)
+{
+ intptr_t pid;
+ int errcode;
+ const char* args[8];
+
+ args[0] = batfilename;
+ args[1] = arg1;
+ args[2] = NULL;
+
+ pid = _spawnvp(P_NOWAIT, batfilename, args);
+ _cwait(&errcode, pid, 0);
+
+ return (errcode);
+}
+
+/*****************************************************************************
+ GetInfo
+
+*****************************************************************************/
+void GetInfo(char* objFilename, char* batFilename, char* logFilename)
+{
+ char buff[TL_MAXPATH];
+ int size;
+ char name[128];
+ char* ptr;
+ int errcode;
+ char* token;
+ obj_t* objPtr;
+ section_t* sectionPtr;
+
+ if (g_bVerbose)
+ printf("%s\n", objFilename);
+
+ ptr = objFilename;
+ if (!strnicmp(objFilename,".\\",2))
+ {
+ ptr += 2;
+
+ getcwd(buff, sizeof(buff));
+ TL_AddSeperatorToPath(buff, buff);
+
+ strcat(buff, ptr);
+ }
+ else
+ strcpy(buff, objFilename);
+
+ // exec the batch file with the obj file
+ errcode = LocalExec(batFilename, buff);
+ if (errcode)
+ {
+ printf("Failed on %s\n", buff);
+ return;
+ }
+
+ // add new object node
+ objPtr = (obj_t*)TL_Malloc(sizeof(obj_t));
+ objPtr->filename = (char*)TL_Malloc((int)strlen(objFilename)+1);
+ strcpy(objPtr->filename, objFilename);
+
+ // link it in
+ objPtr->nextPtr = g_obj_head;
+ g_obj_head = objPtr;
+
+ // read the results
+ TL_LoadScriptFile(logFilename);
+
+ while (1)
+ {
+ token = TL_GetToken(true);
+ if (!token || !token[0])
+ break;
+
+ if (!stricmp(token, "summary"))
+ break;
+ else
+ TL_SkipRestOfLine();
+ }
+
+ while (1)
+ {
+ token = TL_GetToken(true);
+ if (!token || !token[0])
+ break;
+ sscanf(token, "%x", &size);
+
+ token = TL_GetToken(true);
+ if (!token || !token[0])
+ break;
+ strcpy(name, token);
+
+ // add new section node
+ sectionPtr = (section_t*)TL_Malloc(sizeof(section_t));
+ sectionPtr->name = (char*)TL_Malloc((int)strlen(name)+1);
+ strcpy(sectionPtr->name, name);
+ sectionPtr->size = size;
+
+ // link it in
+ sectionPtr->nextPtr = objPtr->sectionPtr;
+ objPtr->sectionPtr = sectionPtr;
+ }
+
+ TL_FreeScriptFile();
+}
+
+/*****************************************************************************
+ Usage
+
+*****************************************************************************/
+void Usage(void)
+{
+ printf("usage: dumpobj <*.obj> [-s section] [-r] [-v]\n");
+ exit(-1);
+}
+
+/*****************************************************************************
+ main
+
+*****************************************************************************/
+int main(int argc, char* argv[])
+{
+ tlfile_t** filelist;
+ int filecount;
+ int i;
+ int recurse;
+ int section;
+ FILE* fp;
+ char* vcvarsPath;
+ char batFilename[TL_MAXPATH];
+ char txtFilename[TL_MAXPATH];
+
+ batFilename[0] = '\0';
+ txtFilename[0] = '\0';
+
+ TL_Setup("DUMPOBJ",argc,argv);
+
+ // find critical path to vcvars32.bat
+ vcvarsPath = "c:\\Program Files\\Microsoft Visual Studio .Net 2003\\Vc7\\bin\\vcvars32.bat";
+ if (!TL_Exists(vcvarsPath))
+ TL_Error("Cannot find: %s\n", vcvarsPath);
+
+ if (argc < 2)
+ Usage();
+
+ recurse = TL_CheckParm("r");
+ filecount = TL_FindFiles2(argv[1], recurse != 0, &filelist);
+
+ g_bVerbose = TL_CheckParm("v") != 0;
+
+ section = TL_CheckParm("s");
+ if (section && section+1 < argc)
+ strcpy(g_sectionName, argv[section+1]);
+ else
+ g_sectionName[0] = '\0';
+
+ strcpy(batFilename,"c:\\");
+ TL_TempFilename(batFilename);
+ TL_ReplaceDosExtension(batFilename, ".bat");
+
+ strcpy(txtFilename,"c:\\");
+ TL_TempFilename(txtFilename);
+ TL_ReplaceDosExtension(txtFilename, ".txt");
+
+ if (filecount)
+ {
+ // create bat file
+ fp = fopen(batFilename, "wt+");
+ if (!fp)
+ TL_Error("Could not open bat file '%s'", batFilename);
+
+ fprintf(fp, "@echo off\n");
+ fprintf(fp, "@call \"%s\" > nul: \n", vcvarsPath);
+ fprintf(fp, "@dumpbin %%1 > %s\n", txtFilename);
+ fclose(fp);
+ }
+
+ for (i=0; i<filecount; i++)
+ GetInfo(filelist[i]->filename, batFilename, txtFilename);
+
+ if (filecount)
+ AnalyzeData();
+
+ if (filecount)
+ {
+ FreeInfo();
+ unlink(batFilename);
+ unlink(txtFilename);
+ }
+
+ TL_FreeFileList(filecount,filelist);
+
+ TL_End(false);
+
+ return (0);
+} \ No newline at end of file