/*---------------------------------------------------------------------------* Project: NintendoWare File: SmInitialFileParser.cpp Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Revision: 1 $ *---------------------------------------------------------------------------*/ #include #include #include "../include/SmFile.h" #include "../include/SmInitialFileParser.h" namespace { /*---------------------------------------------------------------------------* @brief コンストラクタです。 *---------------------------------------------------------------------------*/ SmInitialFileParser::SmInitialFileParser() : m_Top( NULL ), m_Current( NULL ) { } /*---------------------------------------------------------------------------* @brief デストラクタです。 *---------------------------------------------------------------------------*/ SmInitialFileParser::~SmInitialFileParser() { m_File.Release(); } /*---------------------------------------------------------------------------* @brief 取得可能か問い合わせます。 *---------------------------------------------------------------------------*/ bool SmInitialFileParser::Load( const wchar_t* configFileName ) { m_File.Read( configFileName, m_Allocator ); // todo:cast // m_Top = static_cast(m_File.Buffer()); m_Top = (char *)(m_File.Buffer()); m_Current = m_Top; // SmCmd コマンドツリーを生成します。 _createCmdTree(); return true; } /*---------------------------------------------------------------------------* @brief コマンドツリーを生成します。 *---------------------------------------------------------------------------*/ void SmInitialFileParser::_createCmdTree() { const char charCmdBegin = 0x3C; // < const char charCmdEnd = 0x3E; // > const char charCmdSlash = 0x2F; // / const char charCmdSpace = 0x20; // " " const char charCmdComma = 0x2C; // , const char charCmdEqual = 0x3D; // = char* curChar = m_Current; char strTemp[32]; u32 cmdReadingState = 0; u32 readCharNum = 0; u32 readDataNum = 0; SmCmd* addCmd; while( 1 ) { // コマンドの < を監視 if ( *curChar == charCmdBegin ) { cmdReadingState = 1; // 1コマンド生成します。 addCmd = new SmCmd(); m_CmdArray.push_back( addCmd ); // エレメントを読み込む ++curChar; while( 1 ) { strTemp[readCharNum] = *curChar; ++curChar; ++readCharNum; if ( *curChar == charCmdSpace ) { strTemp[readCharNum] = '\0'; addCmd->m_Command = strTemp; break; } } } // xxxxx, のデータ部分の解釈を行います。 if ( cmdReadingState ) { u32 state = 0; readCharNum = 0; while( 1 ) { switch ( state ) { // name の部分の読み込み case 0: { while( *curChar == charCmdSpace ) ++curChar; strTemp[readCharNum] = *curChar; ++curChar; ++readCharNum; if ( *curChar == charCmdEqual ) { state = 1; ++curChar; strTemp[readCharNum] = '\0'; addCmd->m_Data[readDataNum].name = strTemp; readCharNum = 0; } } break; // param の部分の読み込み case 1: { while( *curChar == charCmdSpace ) ++curChar; strTemp[readCharNum] = *curChar; ++curChar; ++readCharNum; // 1Cmdの最終文字もここで判定します。 if ( *curChar == charCmdComma || *curChar == charCmdSlash || *curChar == charCmdEnd ) { state = 1; ++curChar; strTemp[readCharNum] = '\0'; addCmd->m_Data[readDataNum].param.SetParam( strTemp ); ++readDataNum; readCharNum = 0; state = 0; if ( *curChar == charCmdSlash || *curChar == charCmdEnd ) { state = 3; } } } break; } if ( state == 3 ) { // 1コマンド読み込み終了時の初期化 readDataNum = 0; readCharNum = 0; cmdReadingState = 0; break; } } // while(1) } // if ( cmdReadingState ) // 空白は進める //while( *curChar == charCmdSpace ) u32 readSize = curChar - m_Top; if ( readSize < m_File.Size() ) { ++curChar; } else { break; } } } } // namespace