//-------------------------------------------------------------------------------- int Parse(CStdioFile& fIn, CFile& fOut, CFile& fOutBkup) { char temp[4096]; char temp2[4096]; char sName[512]; char* pBuf; CTokenMaster* pMaster = NULL; sName[0] = 0; bool bRv = false; for(;;) { pBuf = temp; if(! fIn.ReadString(pBuf, 4096)) break; while(isspace(*pBuf) && *pBuf) pBuf++; if(! *pBuf) continue; if(*pBuf == ';') continue; else { // remove all non esential characters from the string int i = 0; for(char* pBuf2 = pBuf; *pBuf2; pBuf2++) { // if(isalnum(*pBuf2) || *pBuf2 == ',' || *pBuf2 == '=') if(isprint(*pBuf2)) temp2[i++] = *pBuf2; } if(i == 0) continue; temp2[i] = 0; pBuf = temp2; } printf("%s\n", pBuf); char* pBreak = strchr(pBuf, '='); if(pBreak == NULL) { printf("syntax error ^^^^^^^ (= missing)\n"); continue; } *pBreak = 0; if(*pBuf == 0) continue; LPCTSTR pKeywords[] = {"token", "count", "max", "bits", "name", "serial", "p3", "processor", "dongle", "email", "expires", "extra", "backup", "monitor", "parent" }; enum { IDTOKEN, IDCOUNT, IDMAX, IDBITS, IDNAME, IDSERIAL, IDP3, IDPROCESSOR, IDDONGLE, IDEMAIL, IDEXPIRES, IDEXTRA, IDBACKUP, IDMONITOR, IDPARENT, NCOUNT }; const int nCount = sizeof(pKeywords) / sizeof(LPCTSTR); assert(nCount == NCOUNT); for(int i = 0; i < nCount; i++) { if(strcmp(pBuf, pKeywords[i]) == 0) break; } switch(i) { case IDTOKEN: bRv = DoToken(pBreak+1, pMaster); break; case IDCOUNT: bRv = DoCount(pBreak+1, pMaster); break; case IDMAX: bRv = DoMax(pBreak+1, pMaster); break; case IDBITS: bRv = DoBits(pBreak+1, pMaster); break; case IDNAME: bRv = DoName(pBreak+1, pMaster); break; case IDSERIAL: case IDP3: case IDPROCESSOR: bRv = DoP3Serial(pBreak+1, pMaster); break; case IDDONGLE: bRv = DoDongle(pBreak+1, pMaster); break; case IDEMAIL: bRv = DoEmail(pBreak+1, pMaster); break; case IDEXPIRES: bRv = DoExpires(pBreak+1, pMaster); break; case IDEXTRA: bRv = DoExtra(pBreak+1, pMaster); break; case IDBACKUP: bRv = DoBackup(pBreak+1, pMaster); break; case IDMONITOR: bRv = DoMonitor(pBreak+1, pMaster); break; case IDPARENT: bRv = DoParent(pBreak+1, pMaster); break; default: printf("syntax error ^^^^^^^ (unknown keyword)\n"); bRv = false; continue; } } if(! bRv) return -1; if(! WriteFile(fOut, fOutBkup)) return -1; return 0; }
void DoFile (char *filename, FILE *op) { int done=0,curr_stack=0,stack_active[MAX_STACK] = { 1 }; FILE *fp; char brief_string[1024],token[256]; do { brief_string[0] = 0; done = 0; stack_active[0] = 1; fp = OpenCampFile(filename,"","r"); while (fp && !done) { ReadComments(fp); ReadToken(fp,token,120); if (!token[0]) continue; // Handle standard tokens if (strncmp(token,"#IF",3)==0) { // Don't repeat package missions with flight missions if (strncmp(token,"#IF_PACKAGE_MISSION_EQ",22)==0) { char *sptr = strchr(token,'E'); sptr -= 2; sptr[0] = '#'; sptr[1] = 'I'; sptr[2] = 'F'; sprintf(token,sptr); } curr_stack++; if (!stack_active[curr_stack-1]) stack_active[curr_stack] = 0; else stack_active[curr_stack] = DoIfToken(token+4); continue; } else if (strcmp(token,"#ELSE")==0) { if (curr_stack>0 && stack_active[curr_stack-1]) stack_active[curr_stack] = !stack_active[curr_stack]; continue; } else if (strcmp(token,"#ENDIF")==0) { if (!curr_stack) printf("<Brief reading Error - unmatched #ENDIF>\n"); else curr_stack--; continue; } else if (strcmp(token,"#ENDSCRIPT")==0) { done = 1; continue; } // Check for section activity if (stack_active[curr_stack]) DoToken(token, brief_string); } if (strlen(brief_string) > 1) { fprintf(op,"\n"); // printf("\n"); for (int i=0; i<gNumTokens; i++) { fprintf(op,"%s = %d\n",gTokenList[i],FindCurrentValue(gTokenList[i])); // printf("%s = %d\n",gTokenList[i],FindCurrentValue(gTokenList[i])); } // printf(brief_string); fprintf(op,brief_string); } fclose(fp); } while (IncrementPassOptions()); }