Files
Jedi-Academy/tools/ModView/parser.cpp
2013-04-04 14:32:05 -07:00

137 lines
2.5 KiB
C++

// Filename:- parser.cpp
//
#include "stdafx.h"
#include "includes.h"
#include "stl.h"
//
#include "parser.h"
// Very simple parser, I just read the "alias" part of a raven-generic file, and store them into
// a string map.
//
// Example file:
//
/*
Alias
{
"srcarples" "boltpoint_righthand"
}
Alias
{
"slcarples" "boltpoint_lefthand"
}
*/
// (possibly more than one per "Alias" brace? I'll code for it.
//
// return = success / fail...
//
bool Parser_Load(LPCSTR psFullPathedFilename, MappedString_t &ParsedAliases)
{
bool bReturn = false;
ParsedAliases.clear();
FILE *fhHandle = fopen(psFullPathedFilename,"rt");
if (fhHandle)
{
bool bParsingBlock = false;
bool bSkippingBlock= false;
char sLine[1024];
while (fgets(sLine,sizeof(sLine)-1,fhHandle)!=NULL)
{
sLine[sizeof(sLine)-1]='\0';
// :-)
CString str(sLine);
str.TrimLeft();
str.TrimRight();
strcpy(sLine,str);
if (!bSkippingBlock)
{
if (!bParsingBlock)
{
if (strlen(sLine)) // found any kind of header?
{
if (!stricmp(sLine,"Alias"))
{
bParsingBlock = true;
}
else
{
// not a recognised header, so...
//
bSkippingBlock = true;
}
}
continue;
}
else
{
if (!stricmp(sLine,"{"))
continue;
if (!stricmp(sLine,"}"))
{
bParsingBlock = false;
continue;
}
if (strlen(sLine))
{
// must be a value pair, so...
//
// first, find the whitespace that seperates them...
//
CString strPair(sLine);
int iLoc = strPair.FindOneOf(" \t");
if (iLoc == -1)
{
assert(0);
ErrorBox(va("Parser_Load(): Couldn't find whitespace-seperator in line:\n\n\"%s\"\n\n( File: \"%s\" )",(LPCSTR) strPair,psFullPathedFilename));
bReturn = false;
break;
}
// stl & MFC rule!...
//
CString strArg_Left(strPair.Left(iLoc)); // real name
strArg_Left.TrimRight();
strArg_Left.Replace("\"","");
CString strArg_Right(strPair.Mid (iLoc)); // alias name
strArg_Right.TrimLeft();
strArg_Right.Replace("\"","");
ParsedAliases[(LPCSTR)strArg_Left] = (LPCSTR)strArg_Right;
bReturn = true;
continue;
}
}
}
else
{
// skip to close brace...
//
if (stricmp(sLine,"}"))
continue;
bSkippingBlock = false;
}
}
fclose(fhHandle);
}
return bReturn;
}
/////////////// eof /////////////