/*======================================================== To Do: 1. Tag sequences on the command line p..table 2. Dumping documents into the right place *========================================================*/ /*======================================================== Special keywords: $0..$9: represent command line arguments @file: the name of the file being writtent @nextfile: the name of the next file to be written @htmlgen: runs the app recursively with given arguments. *========================================================*/ #include #include #include #include #include #include #include #include static char* tagTable[] = { "a", "abbr", "acronym", "address", "applet", "area", "b", "base", "basefont", "bdo", "bgsound", "big", "blink", "blockquote", "body", "br", "button", "caption", "center", "cite", "code", "col", "colgroup", "dd", "del", "dfn", "dir", "div", "dl", "dt", "em", "embed", "fieldset", "font", "form", "frame", "frameset", "h1", "h2", "h3", "h4", "h5", "h6", "head", "hr", "html", "i", "iframe", "ilayer", "img", "input", "ins", "isindex", "kbd", "keygen", "label", "layer", "legend", "li", "link", "listing", "map", "menu", "meta", "multicol", "nobr", "noembed", "noframes", "nolayer", "noscript", "object", "ol", "optgroup", "option", "p", "param", "plaintext", "pre", "q", "s","samp","script","select","server","small","sound","spacer","span","strike","strong","style","sub","sup", "table", "tbody", "td", "textarea", "tfoot", "th", "thead", "title", "tr", "tt", "u", "ul", "var", "wbr", "xmp", 0 }; static char gCWD[1025]; static char gPrevFile[128]; static char gThisFile[128]; static char gNextFile[128]; static int gFileIndex=0; int findTag(const char* aTagName) { int low = 0; int high = 107; while (low <= high) { int middle = (low + high) >> 1; int result = stricmp(aTagName, tagTable[middle]); if (result == 0) return middle; if (result < 0) high = middle - 1; else low = middle + 1; } return -1; } /** * Call this to find a tag that closely resembles the given tag. * Note that we match based on the first char. * @update gess12/23/98 * @param * @return */ int findNearestTag(char* aTag){ int result=-1; if(aTag){ char theChar=tolower(aTag[0]); int theIndex=-1; while(tagTable[++theIndex]){ if(tolower(tagTable[theIndex][0])==theChar) { return theIndex; } } } if(tolower(aTag[0])<'a') result=0; else result=107; return result; } char* getNthTagAfter(int aRangeIndex,char* aStartTag){ int theIndex=findTag(aStartTag); if(-1==theIndex){ theIndex=findNearestTag(aStartTag); } if(-10){ if((strchr(aString,',')) || (strchr(aString,'-'))) { mRanges[mCount]=new char[sLen+1]; strcpy(mRanges[mCount++],aString); } else { mKeys[mCount]=new char[sLen+1]; strcpy(mKeys[mCount++],aString); } return true; } } return false; } int getCount() {return mCount;} char* getMacro(int anIndex) { if(anIndex> theBuffer; if(!stricmp(theBuffer,"-F")){ //copy the filename... aStream >> theBuffer; strcpy(mFilename,theBuffer); readDefs=false; } else if(!stricmp(theBuffer,"-D")){ readDefs=true; } else if(!stricmp(theBuffer,"-O")){ aStream >> theBuffer; readDefs=false; } else if(readDefs){ if(theBuffer[0]){ addMacro(theBuffer); theBuffer[0]=0; } } } return true; } void buildArgBuffer(char* aBuffer) { aBuffer[0]=0; if(mFilename[0]) { sprintf(aBuffer,"-0 %s -f %s -d ",gThisFile,mFilename); } for(int i=0;i>theWord; char* thePos=strchr(theWord,'@'); if(thePos){ strncat(temp,theWord,thePos-theWord); if(!strnicmp(thePos,"@file",5)){ strcat(temp,gThisFile); thePos+=5; } else if(!strnicmp(thePos,"@nextfile",9)){ strcat(temp,gNextFile); thePos+=9; } else if(!strnicmp(thePos,"@prevfile",9)){ strcat(temp,gPrevFile); thePos+=9; } strcat(temp,thePos); } else strcat(temp,theWord); strcat(temp," "); } strcpy(aBuffer,temp); } } /** * * @update gess12/20/98 * @param * @return */ void expandMacros(char* aBuffer,CMacros& aMacroSet){ char temp[1024]; int rPos=-1; int wPos=0; if(aBuffer){ while(aBuffer[++rPos]){ if('$'==aBuffer[rPos]){ temp[wPos]=0; rPos++; //skip the $... int theIndex=aBuffer[rPos]-'0'; char* theMacro=aMacroSet.getMacro(theIndex); if(theMacro){ strcat(temp,theMacro); wPos=strlen(temp); } } else temp[wPos++]=aBuffer[rPos]; } temp[wPos]=0; strcpy(aBuffer,temp); } } /** * * @update gess12/20/98 * @param * @return */ int processFile(char* aDir,fstream& anOutputStream,istrstream& aInputArgs){ int result=0; CMacros theMacros; theMacros.consume(aInputArgs); char* theFilename=theMacros.getFilename(); fstream theInputStream(theFilename,ios::in); if(theInputStream.is_open()){ bool done=false; char theBuffer[1024]; char theWord[600]; while((!done) && (0==result)){ theInputStream.getline(theBuffer,sizeof(theBuffer)-1); if(theInputStream.gcount()){ //before doing anything else, expand the macros and keywords... expandMacros(theBuffer,theMacros); expandKeywords(theBuffer,theMacros); //Now process each line: if(strchr(theBuffer,'@')) { //First, see if the line is an htmlgen statement; if so, recurse to read new file... istrstream iStr(theBuffer); iStr>>theWord; if(!stricmp(theWord,"@htmlgen")){ //If you're here, we found an htmlgen statement. // To handle this, we have to: // 1. strip off the @htmlgen // 2. grab the filename and collect the args, // 3. and recurse... result=processFile(aDir,anOutputStream,iStr); } } else anOutputStream << theBuffer << endl; } else done=true; } } return result; } /** * This is where the different combinations of arguments * gets constructed and passed on for processing. * Note that this is even called when the args have only 1 value. * @return error code */ int iterate(istrstream& aInputArgs){ int result=0; CMacros theArgs; theArgs.consume(aInputArgs); char theBuffer[1024]; char theFilename[1024]; bool done=!theArgs.first(); while((!done) && (0==result)){ CMacros theTempArgs(theArgs); theTempArgs.buildArgBuffer(theBuffer); istrstream theArgStream(theBuffer); sprintf(theFilename,"%s\\%s",gCWD,gThisFile); fstream theOutStream(theFilename,ios::trunc); result=processFile(gCWD,theOutStream,theArgStream); theArgs.dump(); done=!theArgs.next(); } return result; } /** * * @update gess12/20/98 * @param * @return */ int main(int argc,char* argv[]){ int result=0; gPrevFile[0]=gThisFile[0]=gNextFile[0]; if(argc>1){ char theBuffer[1024]; theBuffer[0]=0; for(int i=1;i