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