/*++ Copyright (c) 1992 Microsoft Corporation Module Name: listmung.c Abstract: This is the main module for a stubfile generation utility Author: Sanford Staab (sanfords) 22-Apr-1992 Revision History: --*/ #include #include #include #include #include #include #define STRING_BUFFER_SIZE 120 char StringBuffer[STRING_BUFFER_SIZE]; char ItemBuffer[STRING_BUFFER_SIZE]; char ItemBuffer2[STRING_BUFFER_SIZE]; char *ListName, *TemplateName; FILE *ListFile, *TemplateFile; char szBEGINTRANSLATE[] = "BeginTranslate"; char szENDTRANSLATE[] = "EndTranslate"; char szENDTRANSLATEQLPC[] = "EndTranslateQLPC"; BOOL IsTranslateTag(char * pBuffer) { return (_strnicmp(pBuffer, szBEGINTRANSLATE, sizeof(szBEGINTRANSLATE)-1) == 0) || (_strnicmp(pBuffer, szENDTRANSLATE, sizeof(szENDTRANSLATE)-1) == 0); } BOOL IsCommentOrTag(char * pBuffer) { return ((*pBuffer == ';') || IsTranslateTag(pBuffer)); } int ProcessParameters( int argc, char *argv[] ) { char c, *p; while (*++argv != NULL) { p = *argv; // // if we have a delimiter for a parameter, case throught the valid // parameter. Otherwise, the rest of the parameters are the list of // input files. // if (*p == '/' || *p == '-') { // // Switch on all the valid delimiters. If we don't get a valid // one, return with an error. // c = *++p; switch (toupper( c )) { default: return 0; } } else { ListName = *argv++; TemplateName = *argv++; return (ListName && TemplateName); } } return 0; } BOOL mysubstr( char *s, char *find, char *put) { char *p; if (p = strstr(s, find)) { strcpy(p, put); strcpy(p + strlen(put), p + strlen(find)); // find > put! return(TRUE); } return(FALSE); } VOID myprint( char *s, char *item, int index) { if (strstr(s, "%d") || mysubstr(s, "%%INDEX%%", "%d")) { printf(s, item, index); } else { printf(s, item); } } //+--------------------------------------------------------------------------- // // Function: myfgets // // Synopsis: Calls fgets to read a string from a file. // It ignores empty lines or lines starting with a blank character // // This is needed when the input file was generated by the // compiler preprocessor. Using the preprocessor allows us // to use #idfdef, #inlcude, etc in the original list file. // // Arguments: [pszBuff] -- Buffer to store the string // [iBuffSize] -- Buffer size // [pFile] -- Pointer to the file to read // // Return [pszRet] -- Pointer to pszBuff if succesful read. NULL otherwise. //---------------------------------------------------------------------------- char * myfgets( char * pszBuff, int iBuffSize, FILE * pFile) { char *pszRet; while (pszRet = fgets(pszBuff, iBuffSize, pFile)) { if ((*pszRet == '\n') || (*pszRet == ' ')) { continue; } else { break; } } return pszRet; } //+--------------------------------------------------------------------------- // // Function: SkipCommentsAndTags // // Synopsis: Calls myfgets to read a string from a file. // It ignores lines starting with ; (ie, comments) and lines // containing the Begin/EndTranslate tags. // // Arguments: [pszBuff] -- Buffer to store the string // [iBuffSize] -- Buffer size // [pFile] -- Pointer to the file to read // // Return [pszRet] -- Pointer to pszBuff if succesful read. NULL otherwise. //---------------------------------------------------------------------------- char * SkipCommentsAndTags( char * pszBuff, int iBuffSize, FILE * pFile) { char *pszRet; while (pszRet = myfgets(pszBuff, iBuffSize, pFile)) { if (IsCommentOrTag(pszRet)) { continue; } else { break; } } return pszRet; } void ProcessTemplate( void ) { char *s; char *pchItem; char *pchLastItem; int index; s = fgets(StringBuffer,STRING_BUFFER_SIZE,TemplateFile); while ( s ) { if (mysubstr(s, "%%FOR_ALL_UPPER%%", "%-45s")) { rewind(ListFile); index = 0; while (pchItem = myfgets(ItemBuffer, STRING_BUFFER_SIZE, ListFile)) { if (ItemBuffer[0] != ';') { pchItem[strlen(pchItem) - 1] = '\0'; // strip off \n pchItem = _strupr(pchItem); if (IsTranslateTag(ItemBuffer)) { myprint(s, pchItem, index); } else { myprint(s, pchItem, index++); } } else { printf("// %s", ItemBuffer); } } } else if (mysubstr(s, "%%FOR_ALL%%", "%s")) { rewind(ListFile); index = 0; while (pchItem = myfgets(ItemBuffer, STRING_BUFFER_SIZE, ListFile)) { if (ItemBuffer[0] != ';') { pchItem[strlen(pchItem) - 1] = '\0'; // strip off \n myprint(s, pchItem, index++); } } } else if (mysubstr(s, "%%FOR_ALL_QLPC%%", "%s")) { rewind(ListFile); index = 0; while (pchItem = myfgets(ItemBuffer, STRING_BUFFER_SIZE, ListFile)) { if (ItemBuffer[0] != ';') { pchItem[strlen(pchItem) - 1] = '\0'; // strip off \n if (_strnicmp(ItemBuffer, szENDTRANSLATEQLPC, sizeof(szENDTRANSLATEQLPC)-1) == 0) break; myprint(s, pchItem, index++); } } } else if (mysubstr(s, "%%FOR_ALL_LPC%%", "%s")) { rewind(ListFile); index = 0; while (pchItem = myfgets(ItemBuffer, STRING_BUFFER_SIZE, ListFile)) { if (ItemBuffer[0] != ';') { pchItem[strlen(pchItem) - 1] = '\0'; // strip off \n if (_strnicmp(ItemBuffer, szENDTRANSLATEQLPC, sizeof(szENDTRANSLATEQLPC)-1) == 0) break; } } while (pchItem = myfgets(ItemBuffer, STRING_BUFFER_SIZE, ListFile)) { if (ItemBuffer[0] != ';') { pchItem[strlen(pchItem) - 1] = '\0'; // strip off \n myprint(s, pchItem, index++); } } } else if (mysubstr(s, "%%FOR_ALL_BUT_LAST%%", "%s")) { rewind(ListFile); index = 0; pchLastItem = SkipCommentsAndTags(ItemBuffer, STRING_BUFFER_SIZE, ListFile); if (pchLastItem != NULL) { pchLastItem[strlen(pchLastItem) - 1] = '\0'; // strip off \n while (pchItem = myfgets(ItemBuffer2, STRING_BUFFER_SIZE, ListFile)) { if (!IsCommentOrTag(pchItem)) { pchItem[strlen(pchItem) - 1] = '\0'; // strip off \n myprint(s, pchLastItem, index++); // Write previous line strcpy(pchLastItem, pchItem); // Save current line } } } else { fprintf(stderr,"LISTMUNG: FOR_ALL_BUT_LAST: no lines found\n"); } } else if (mysubstr(s, "%%FOR_LAST%%", "%s")) { rewind(ListFile); index = 0; pchLastItem = SkipCommentsAndTags(ItemBuffer, STRING_BUFFER_SIZE, ListFile); if (pchLastItem != NULL) { pchLastItem[strlen(pchLastItem) - 1] = '\0'; // strip off \n while (pchItem = myfgets(ItemBuffer2, STRING_BUFFER_SIZE, ListFile)) { if (!IsCommentOrTag(pchItem)) { pchItem[strlen(pchItem) - 1] = '\0'; // strip off \n strcpy(pchLastItem, pchItem); // Save current line index++; } } myprint(s, pchLastItem, index); // Write Last line. } else { fprintf(stderr,"LISTMUNG: FOR_LAST: no lines found\n"); } } else { printf("%s", s); } s = fgets(StringBuffer,STRING_BUFFER_SIZE,TemplateFile); } } int __cdecl main( argc, argv ) int argc; char *argv[]; { if (!ProcessParameters( argc, argv )) { fprintf( stderr, "Stub File Generation Utility. Version: 1.1\n" ); fprintf( stderr, "usage: listmung