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()29 SmInitialFileParser::SmInitialFileParser()
30 : m_Top( NULL ),
31   m_Current( NULL )
32 {
33 
34 }
35 
36 
37 /*---------------------------------------------------------------------------*
38   @brief デストラクタです。
39  *---------------------------------------------------------------------------*/
~SmInitialFileParser()40 SmInitialFileParser::~SmInitialFileParser()
41 {
42     m_File.Release();
43 }
44 
45 
46 /*---------------------------------------------------------------------------*
47   @brief 取得可能か問い合わせます。
48  *---------------------------------------------------------------------------*/
49 bool
Load(const wchar_t * configFileName)50 SmInitialFileParser::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()69 SmInitialFileParser::_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