jedioutcast/utils/Assimilate/ASEFile.cpp
2013-04-04 13:07:40 -05:00

331 lines
6.6 KiB
C++

// ASEFile.cpp
#include "Module.h"
#include "Tokenizer.h"
#include "AlertErrHandler.h"
#include "ASEFile.h"
keywordArray_t CASEFile::s_symbols[] =
{
"*", TK_ASE_ASTERISK,
"{", TK_ASE_OBRACE,
"}", TK_ASE_CBRACE,
":", TK_ASE_COLON,
NULL, TK_EOF,
};
keywordArray_t CASEFile::s_keywords[] =
{
"GEOMOBJECT", TK_GEOMOBJECT,
"SCENE", TK_SCENE,
"MATERIAL_LIST", TK_MATERIAL_LIST,
"COMMENT", TK_ASE_COMMENT,
"3DSMAX_ASCIIEXPORT", TK_3DSMAX_ASCIIEXPORT,
NULL, TK_EOF,
};
keywordArray_t CASEFile::s_sceneKeywords[] =
{
NULL, TK_EOF,
};
keywordArray_t CASEFile::s_materialKeywords[] =
{
NULL, TK_EOF,
};
keywordArray_t CASEFile::s_mapKeywords[] =
{
NULL, TK_EOF,
};
keywordArray_t CASEFile::s_objectKeywords[] =
{
NULL, TK_EOF,
};
keywordArray_t CASEFile::s_nodeKeywords[] =
{
NULL, TK_EOF,
};
keywordArray_t CASEFile::s_meshKeywords[] =
{
NULL, TK_EOF,
};
keywordArray_t CASEFile::s_vertexKeywords[] =
{
NULL, TK_EOF,
};
keywordArray_t CASEFile::s_faceKeywords[] =
{
NULL, TK_EOF,
};
keywordArray_t CASEFile::s_faceOptionKeywords[] =
{
NULL, TK_EOF,
};
keywordArray_t CASEFile::s_tvertKeywords[] =
{
NULL, TK_EOF,
};
keywordArray_t CASEFile::s_tfaceKeywords[] =
{
NULL, TK_EOF,
};
keywordArray_t CASEFile::s_animationKeywords[] =
{
NULL, TK_EOF,
};
keywordArray_t CASEFile::s_contorlPosBezierKeywords[] =
{
NULL, TK_EOF,
};
keywordArray_t CASEFile::s_controlRotTCBKeywords[] =
{
NULL, TK_EOF,
};
keywordArray_t CASEFile::s_controlScaleBezierKeywords[] =
{
NULL, TK_EOF,
};
keywordArray_t CASEFile::s_labelKeywords[] =
{
NULL, TK_EOF,
};
CASEFile::CASEFile()
{
}
CASEFile::~CASEFile()
{
}
CASEFile* CASEFile::Create(LPCTSTR filename)
{
CASEFile* retval = new CASEFile();
retval->Init(filename);
return retval;
}
void CASEFile::Delete()
{
if (m_file != NULL)
{
free(m_file);
m_file = NULL;
}
if (m_comment != NULL)
{
free(m_comment);
m_comment = NULL;
}
delete this;
}
void CASEFile::Init(LPCTSTR filename)
{
if ((filename != NULL) && (strlen(filename) > 0))
{
m_file = (char*)malloc(strlen(filename) + 1);
strcpy(m_file, filename);
}
else
{
m_file = NULL;
}
m_export = 0;
m_comment = NULL;
}
void CASEFile::Parse()
{
if (m_file == NULL)
{
return;
}
CAlertErrHandler errhandler;
CTokenizer* tokenizer = CTokenizer::Create(TKF_USES_EOL | TKF_NUMERICIDENTIFIERSTART);
tokenizer->SetErrHandler(&errhandler);
tokenizer->SetKeywords(s_keywords);
tokenizer->SetSymbols(s_symbols);
tokenizer->AddParseFile(m_file, 16 * 1024);
int tokType = TK_UNDEFINED;
while(tokType != TK_EOF)
{
CToken* curToken = tokenizer->GetToken();
if (curToken->GetType() == TK_EOF)
{
curToken->Delete();
tokType = TK_EOF;
break;
}
if (curToken->GetType() == TK_EOL)
{
curToken->Delete();
continue;
}
if (curToken->GetType() != TK_ASE_ASTERISK)
{
tokenizer->Error(TKERR_UNEXPECTED_TOKEN);
curToken->Delete();
tokenizer->GetToEndOfLine()->Delete();
continue;
}
curToken->Delete();
curToken = tokenizer->GetToken();
tokType = curToken->GetType();
curToken->Delete();
switch(tokType)
{
case TK_EOF:
break;
case TK_GEOMOBJECT:
ParseGeomObject(tokenizer);
break;
case TK_SCENE:
ParseScene(tokenizer);
break;
case TK_MATERIAL_LIST:
ParseMaterialList(tokenizer);
break;
case TK_ASE_COMMENT:
ParseComment(tokenizer);
break;
case TK_3DSMAX_ASCIIEXPORT:
ParseAsciiExport(tokenizer);
break;
default:
tokenizer->Error(TKERR_UNEXPECTED_TOKEN);
tokenizer->GetToEndOfLine()->Delete();
break;
}
}
}
void CASEFile::ParseAsciiExport(CTokenizer* tokenizer)
{
CToken* token = tokenizer->GetToken();
if (token->GetType() != TK_INT)
{
tokenizer->Error(token->GetStringValue(), TKERR_UNEXPECTED_TOKEN);
token->Delete();
tokenizer->GetToEndOfLine()->Delete();
return;
}
m_export = token->GetIntValue();
token->Delete();
}
void CASEFile::ParseComment(CTokenizer* tokenizer)
{
CToken* token = tokenizer->GetToken();
if (token->GetType() != TK_STRING)
{
tokenizer->Error(token->GetStringValue(), TKERR_UNEXPECTED_TOKEN);
token->Delete();
tokenizer->GetToEndOfLine()->Delete();
return;
}
m_comment = (char*)malloc(strlen(token->GetStringValue()) + 1);
strcpy(m_comment, token->GetStringValue());
token->Delete();
}
void CASEFile::ParseMaterialList(CTokenizer* tokenizer)
{
}
void CASEFile::ParseScene(CTokenizer* tokenizer)
{
CToken* token = tokenizer->GetToken(s_sceneKeywords, 0, TKF_USES_EOL);
if (token->GetType() != TK_ASE_OBRACE)
{
tokenizer->Error(token->GetStringValue(), TKERR_UNEXPECTED_TOKEN);
token->Delete();
tokenizer->GetToEndOfLine()->Delete();
return;
}
token->Delete();
bool inScene = true;
while(inScene)
{
token = tokenizer->GetToken(s_sceneKeywords, 0, 0);
switch(token->GetType())
{
case TK_EOF:
inScene = false;
tokenizer->Error("End of File", TKERR_UNEXPECTED_TOKEN);
token->Delete();
break;
case TK_ASE_CBRACE:
token->Delete();
inScene = false;
break;
case TK_EOL:
token->Delete();
break;
case TK_ASE_ASTERISK:
token->Delete();
token = tokenizer->GetToken(s_sceneKeywords, 0, 0);
switch (token->GetType())
{
case TK_SCENE_FILENAME:
token->Delete();
tokenizer->GetToEndOfLine()->Delete();
break;
case TK_SCENE_FIRSTFRAME:
token->Delete();
tokenizer->GetToEndOfLine()->Delete();
break;
case TK_SCENE_LASTFRAME:
token->Delete();
tokenizer->GetToEndOfLine()->Delete();
break;
case TK_SCENE_FRAMESPEED:
token->Delete();
tokenizer->GetToEndOfLine()->Delete();
break;
case TK_SCENE_TICKSPERFRAME:
token->Delete();
tokenizer->GetToEndOfLine()->Delete();
break;
case TK_SCENE_BACKGROUND_STATIC:
token->Delete();
tokenizer->GetToEndOfLine()->Delete();
break;
case TK_SCENE_AMBIENT_STATIC:
token->Delete();
tokenizer->GetToEndOfLine()->Delete();
break;
default:
tokenizer->Error(token->GetStringValue(), TKERR_UNEXPECTED_TOKEN);
token->Delete();
tokenizer->GetToEndOfLine()->Delete();
break;
}
default:
tokenizer->Error(token->GetStringValue(), TKERR_UNEXPECTED_TOKEN);
token->Delete();
tokenizer->GetToEndOfLine()->Delete();
}
}
}
void CASEFile::ParseGeomObject(CTokenizer* tokenizer)
{
}