//--------------------------------------------------------------------------------
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());
	}