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