|
|
/****************************** Module Header ******************************\
* Module Name: structo.c * * Structure parser - struct field name-offset tabel generator. * * Copyright (c) 1985-96, Microsoft Corporation * * 04/09/96 GerardoB Created \***************************************************************************/ #include "structo.h"
/*********************************************************************
* soProcessParameters * \***************************************************************************/ UINT soProcessParameters(int argc, LPSTR argv[], PWORKINGFILES pwf) { char c, *p; int argcParm = argc;
while (--argc) { p = *++argv; if (*p == '/' || *p == '-') { while (c = *++p) { switch (toupper(c)) { case 'I': if (pwf->pszIncInputFileExt != NULL) { soLogMsg(SOLM_ERROR, "Invalid -i parameter"); goto PrintHelp; } pwf->dwOptions |= SOWF_INCLUDEINPUTFILE; argc--, argv++; pwf->pszIncInputFileExt = *argv; break;
case 'L': pwf->dwOptions |= SOWF_LISTONLY; break;
case 'O': if (pwf->pszOutputFile != NULL) { soLogMsg(SOLM_ERROR, "Invalid -o parameter"); goto PrintHelp; } argc--, argv++; pwf->pszOutputFile = *argv; break;
case 'P': pwf->dwOptions |= SOWF_INLCLUDEPRECOMPH; break;
case 'S': if (pwf->pszStructsFile != NULL) { soLogMsg(SOLM_ERROR, "Invalid -s parameter"); goto PrintHelp; } argc--, argv++; pwf->pszStructsFile = *argv; break;
default: soLogMsg(SOLM_ERROR, "Invalid parameter: %c", c); // Fall through
case '?': goto PrintHelp; } } /* while (c = *++p) */ } else { /* if switch */ pwf->pszInputFile = *argv; break; } } /* while (--argc) */
if ((pwf->pszInputFile == NULL) || (pwf->pszOutputFile == NULL)) { goto PrintHelp; }
if ((pwf->dwOptions & SOWF_LISTONLY) && (pwf->pszStructsFile != NULL)) { soLogMsg(SOLM_ERROR, "Cannot use -s and -l together "); goto PrintHelp; }
return argcParm - argc;
PrintHelp: soLogMsg(SOLM_DEFAULT, "Structure Field Name-Offset Table Generator"); soLogMsg(SOLM_NOLABEL, "Usage: structo [options] <-o OutputFile> InputFile1 ..."); soLogMsg(SOLM_NOLABEL, "\tInputFile - Preprocessed C header file"); soLogMsg(SOLM_NOLABEL, "\t[-i ext] #include input file name using extension ext"); soLogMsg(SOLM_NOLABEL, "\t[-l] Build structure list only"); soLogMsg(SOLM_NOLABEL, "\t<-o OutputFile> required"); soLogMsg(SOLM_NOLABEL, "\t[-p] #include \"precomp.h\" and #pragma hdrstop in output file"); soLogMsg(SOLM_NOLABEL, "\t[-s StructFile] Struct names text file."); return 0; } /*********************************************************************
* soGenerateTable * \***************************************************************************/ BOOL soGenerateTable (PWORKINGFILES pwf) { char * pTag; UINT uLoops;
if (!soOpenWorkingFiles(pwf)) { return FALSE; }
soLogMsg (SOLM_NOEOL, "Processing %s ...", pwf->pszInputFile);
uLoops = 0; while (pTag = soFindTag(pwf->pmap, pwf->pmapEnd, gszStructTag)) { pwf->pmap = pTag; pTag = soParseStruct (pwf); if (pTag == NULL) { break; } pwf->pmap = pTag; if (++uLoops == 50) { soLogMsg (SOLM_APPEND, "."); uLoops = 0; } }
soLogMsg (SOLM_NOLABEL, ".");
soCloseWorkingFiles(pwf, SOCWF_DEFAULT); return TRUE; } /*********************************************************************
* InitWF \***************************************************************************/ BOOL InitWF (PWORKINGFILES pwf) { ZeroMemory (pwf, sizeof(WORKINGFILES)); pwf->hfileInput = INVALID_HANDLE_VALUE ; pwf->hfileOutput = INVALID_HANDLE_VALUE ; pwf->hfileTemp = INVALID_HANDLE_VALUE ;
return TRUE; } /*********************************************************************
* main * \***************************************************************************/ int __cdecl main (int argc, char *argv[]) { BOOL fGenerated = TRUE; int argcProcessed; WORKINGFILES wf;
InitWF(&wf);
do { argcProcessed = soProcessParameters(argc, argv, &wf); if (argcProcessed == 0) { break; } argc -= argcProcessed; argv += argcProcessed;
if (!soGenerateTable(&wf)) { fGenerated = FALSE; break; }
wf.dwOptions |= SOWF_APPENDOUTPUT;
} while (argc > 1);
if (fGenerated && (wf.hfileTemp != INVALID_HANDLE_VALUE)) { fGenerated = soCopyStructuresTable (&wf); if (fGenerated) { soLogMsg (SOLM_DEFAULT, "%s has been succesfully generated.", wf.pszOutputFile); } }
soCloseWorkingFiles (&wf, SOCWF_CLEANUP); return !fGenerated; }
|