1 /*---------------------------------------------------------------------------* 2 Project: NintendoWare 3 File: SmInitialFileParser.cpp 4 5 Copyright (C)2009-2011 Nintendo/HAL Laboratory, Inc. All rights reserved. 6 7 These coded instructions, statements, and computer programs contain proprietary 8 information of Nintendo and/or its licensed developers and are protected by 9 national and international copyright laws. They may not be disclosed to third 10 parties or copied or duplicated in any form, in whole or in part, without the 11 prior written consent of Nintendo. 12 13 The content herein is highly confidential and should be handled accordingly. 14 15 $Revision: $ 16 *---------------------------------------------------------------------------*/ 17 #include <ctype.h> 18 #include <stdlib.h> 19 #include "../include/SmFile.h" 20 #include "../include/SmInitialFileParser.h" 21 22 23 namespace 24 { 25 26 /*---------------------------------------------------------------------------* 27 @brief コンストラクタです。 28 *---------------------------------------------------------------------------*/ SmInitialFileParser()29SmInitialFileParser::SmInitialFileParser() 30 : m_Top( NULL ), 31 m_Current( NULL ) 32 { 33 34 } 35 36 37 /*---------------------------------------------------------------------------* 38 @brief デストラクタです。 39 *---------------------------------------------------------------------------*/ ~SmInitialFileParser()40SmInitialFileParser::~SmInitialFileParser() 41 { 42 m_File.Release(); 43 } 44 45 46 /*---------------------------------------------------------------------------* 47 @brief 取得可能か問い合わせます。 48 *---------------------------------------------------------------------------*/ 49 bool Load(const wchar_t * configFileName)50SmInitialFileParser::Load( const wchar_t* configFileName ) 51 { 52 m_File.Read( configFileName, m_Allocator ); 53 54 // todo:cast 55 // m_Top = static_cast<char *>(m_File.Buffer()); 56 m_Top = (char *)(m_File.Buffer()); 57 m_Current = m_Top; 58 59 // SmCmd コマンドツリーを生成します。 60 _createCmdTree(); 61 return true; 62 } 63 64 65 /*---------------------------------------------------------------------------* 66 @brief コマンドツリーを生成します。 67 *---------------------------------------------------------------------------*/ 68 void _createCmdTree()69SmInitialFileParser::_createCmdTree() 70 { 71 const char charCmdBegin = 0x3C; // < 72 const char charCmdEnd = 0x3E; // > 73 const char charCmdSlash = 0x2F; // / 74 const char charCmdSpace = 0x20; // " " 75 const char charCmdComma = 0x2C; // , 76 const char charCmdEqual = 0x3D; // = 77 78 char* curChar = m_Current; 79 char strTemp[32]; 80 81 u32 cmdReadingState = 0; 82 u32 readCharNum = 0; 83 u32 readDataNum = 0; 84 85 SmCmd* addCmd; 86 87 while( 1 ) 88 { 89 // コマンドの < を監視 90 if ( *curChar == charCmdBegin ) 91 { 92 cmdReadingState = 1; 93 94 // 1コマンド生成します。 95 addCmd = new SmCmd(); 96 m_CmdArray.push_back( addCmd ); 97 98 // エレメントを読み込む 99 ++curChar; 100 while( 1 ) 101 { 102 strTemp[readCharNum] = *curChar; 103 ++curChar; 104 ++readCharNum; 105 106 if ( *curChar == charCmdSpace ) 107 { 108 strTemp[readCharNum] = '\0'; 109 addCmd->m_Command = strTemp; 110 break; 111 } 112 } 113 } 114 115 // xxxxx, のデータ部分の解釈を行います。 116 if ( cmdReadingState ) 117 { 118 u32 state = 0; 119 readCharNum = 0; 120 121 while( 1 ) 122 { 123 switch ( state ) 124 { 125 // name の部分の読み込み 126 case 0: 127 { 128 while( *curChar == charCmdSpace ) ++curChar; 129 130 strTemp[readCharNum] = *curChar; 131 ++curChar; 132 ++readCharNum; 133 134 if ( *curChar == charCmdEqual ) 135 { 136 state = 1; 137 ++curChar; 138 139 strTemp[readCharNum] = '\0'; 140 addCmd->m_Data[readDataNum].name = strTemp; 141 142 readCharNum = 0; 143 } 144 } 145 break; 146 147 // param の部分の読み込み 148 case 1: 149 { 150 while( *curChar == charCmdSpace ) ++curChar; 151 152 strTemp[readCharNum] = *curChar; 153 ++curChar; 154 ++readCharNum; 155 156 // 1Cmdの最終文字もここで判定します。 157 if ( *curChar == charCmdComma || 158 *curChar == charCmdSlash || 159 *curChar == charCmdEnd ) 160 { 161 state = 1; 162 ++curChar; 163 164 strTemp[readCharNum] = '\0'; 165 addCmd->m_Data[readDataNum].param.SetParam( strTemp ); 166 167 ++readDataNum; 168 readCharNum = 0; 169 state = 0; 170 171 if ( *curChar == charCmdSlash || *curChar == charCmdEnd ) 172 { 173 state = 3; 174 } 175 } 176 } 177 break; 178 } 179 180 if ( state == 3 ) 181 { 182 // 1コマンド読み込み終了時の初期化 183 readDataNum = 0; 184 readCharNum = 0; 185 cmdReadingState = 0; 186 break; 187 } 188 } // while(1) 189 } // if ( cmdReadingState ) 190 191 // 空白は進める 192 //while( *curChar == charCmdSpace ) 193 u32 readSize = curChar - m_Top; 194 if ( readSize < m_File.Size() ) 195 { 196 ++curChar; 197 } 198 else 199 { 200 break; 201 } 202 } 203 } 204 205 206 } // namespace 207 208 209