1 /*---------------------------------------------------------------------------* 2 Project: NintendoWare 3 File: SmInitialFileParser.h 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: 18422 $ 14 *---------------------------------------------------------------------------*/ 15 16 #ifndef SM_INITIAL_FILE_PARSER_H_ 17 #define SM_INITIAL_FILE_PARSER_H_ 18 19 #include <ctype.h> 20 #include <stdlib.h> 21 22 #include <nn/gx.h> 23 #include "../include/SmBase.h" 24 #include "../include/SmFile.h" 25 26 27 28 //------------------------------------------------------------------------------ 29 //! 4タイプの値を管理するパラメータクラスです。 30 class SmParam 31 { 32 public: 33 enum 34 { 35 SM_PARAM_TYPE_U32 = 0, 36 SM_PARAM_TYPE_S32 = 1, 37 SM_PARAM_TYPE_F32 = 2, 38 SM_PARAM_TYPE_STRING = 3 39 }; 40 typedef u32 SmParamType; 41 42 //! コンストラクタです SmParam()43 SmParam() 44 : m_Type( SM_PARAM_TYPE_U32 ), 45 m_u32Param( 0 ) 46 { 47 m_String = ""; 48 } 49 50 //! パラメータタイプを取得します。 GetType()51 SmParamType GetType() const { return m_Type; } 52 53 //! パラメータを取得します。 GetU32()54 u32 GetU32() const 55 { 56 switch( m_Type ) 57 { 58 case SM_PARAM_TYPE_U32: 59 { 60 return m_u32Param; 61 } 62 case SM_PARAM_TYPE_S32: 63 { 64 return static_cast<u32>(m_s32Param); 65 } 66 case SM_PARAM_TYPE_F32: 67 { 68 return static_cast<u32>(m_f32Param); 69 } 70 case SM_PARAM_TYPE_STRING: 71 { 72 return static_cast<u32>(atoi(m_String.c_str())); 73 } 74 75 } 76 return 0; 77 } 78 GetS32()79 s32 GetS32() const 80 { 81 switch( m_Type ) 82 { 83 case SM_PARAM_TYPE_U32: 84 { 85 return static_cast<s32>(m_u32Param); 86 } 87 case SM_PARAM_TYPE_S32: 88 { 89 return m_s32Param; 90 } 91 case SM_PARAM_TYPE_F32: 92 { 93 return static_cast<s32>(m_f32Param); 94 } 95 case SM_PARAM_TYPE_STRING: 96 { 97 return static_cast<s32>(atoi(m_String.c_str())); 98 } 99 } 100 return 0; 101 } 102 GetF32()103 f32 GetF32() const 104 { 105 switch( m_Type ) 106 { 107 case SM_PARAM_TYPE_U32: 108 { 109 return static_cast<f32>(m_u32Param); 110 } 111 case SM_PARAM_TYPE_S32: 112 { 113 return static_cast<f32>(m_s32Param); 114 } 115 case SM_PARAM_TYPE_F32: 116 { 117 return m_f32Param; 118 } 119 case SM_PARAM_TYPE_STRING: 120 { 121 return static_cast<f32>(atof(m_String.c_str())); 122 } 123 } 124 return 0; 125 } 126 GetString()127 const char* GetString() const 128 { 129 switch( m_Type ) 130 { 131 case SM_PARAM_TYPE_U32: 132 case SM_PARAM_TYPE_S32: 133 case SM_PARAM_TYPE_F32: 134 { 135 // m_String.Format( "%d", m_u32Param ); 136 // return m_String.c_str(); 137 NW_FATAL_ERROR( "no support!" ); 138 } 139 140 case SM_PARAM_TYPE_STRING: 141 { 142 return m_String.c_str(); 143 } 144 } 145 146 return NULL; 147 } 148 149 //! パラメータを設定します。 SetParam(u32 param)150 void SetParam( u32 param ) 151 { 152 m_Type = SM_PARAM_TYPE_U32; 153 m_u32Param = param; 154 } 155 SetParam(s32 param)156 void SetParam( s32 param ) 157 { 158 m_Type = SM_PARAM_TYPE_S32; 159 m_s32Param = param; 160 } 161 SetParam(f32 param)162 void SetParam( f32 param ) 163 { 164 m_Type = SM_PARAM_TYPE_F32; 165 m_f32Param = param; 166 } 167 SetParam(const char * param)168 void SetParam( const char* param ) 169 { 170 m_Type = SM_PARAM_TYPE_STRING; 171 m_String = param; 172 } 173 174 private: 175 SmParamType m_Type; 176 union 177 { 178 u32 m_u32Param; 179 s32 m_s32Param; 180 f32 m_f32Param; 181 }; 182 std::string m_String; 183 }; 184 185 186 //--------------------------------------------------------------------------- 187 //! 実行される1つのコマンドです。 188 class SmCmd : public SmBase 189 { 190 friend class SmInitialFileParser; 191 192 private: 193 //! 名前と値を組み合わせたデータです。 194 struct SmData 195 { 196 std::string name; // 名前 197 SmParam param; // 値 198 }; 199 200 public: 201 //! コンストラクタです。 SmCmd()202 SmCmd() 203 : m_Parent( NULL ), 204 m_Child( NULL ), 205 m_Next( NULL ) 206 { 207 Init(); 208 } 209 210 //! データの初期化を行います。 Init()211 void Init() 212 { 213 m_Command = "NULL"; 214 215 for ( int i=0; i<16; ++i ) 216 { 217 m_Data[i].name = "null"; 218 m_Data[i].param.SetParam( 0 ); 219 } 220 } 221 222 //! エレメントを取得します。 GetCommand()223 const char* GetCommand() const 224 { 225 return m_Command.c_str(); 226 } 227 228 //! 名前を指定して値を取得します。 GetF32(const char * strName)229 f32 GetF32( const char* strName ) const 230 { 231 for ( int i=0; i<16; ++i ) 232 { 233 const char* name = m_Data[i].name.c_str(); 234 if ( strcmp( name, strName ) == 0 ) 235 { 236 return m_Data[i].param.GetF32(); 237 } 238 } 239 240 return 0.f; 241 } 242 243 private: 244 SmCmd* m_Parent; 245 SmCmd* m_Child; 246 SmCmd* m_Next; 247 248 std::string m_Command; // <XXXX 249 SmData m_Data[16]; // tx = 10 (16個固定) 250 }; 251 252 253 //--------------------------------------------------------------------------- 254 //! イニシャルファイルを解釈するクラスです。 255 class SmInitialFileParser : public SmBase 256 { 257 typedef nw::ut::FixedSizeArray<SmCmd*, 64> SmCmdArray; 258 259 public: 260 SmInitialFileParser(); 261 ~SmInitialFileParser(); 262 263 //! 取得可能か問い合わせます。 264 bool IsGettable(); 265 266 //! コマンドを取得します。 267 SmCmd GetCmd(); 268 269 //! 初期化ファイルをロードします。 270 bool Load( const wchar_t* configFileName ); 271 272 //! コマンド数を取得します。 GetCmdNum()273 u32 GetCmdNum() const { return m_CmdArray.size(); } 274 275 //! コマンドを取得します。 GetCmd(u32 no)276 const SmCmd* GetCmd( u32 no ) { return m_CmdArray[no]; } 277 278 private: 279 //! コマンドツリーを生成します。 280 void _createCmdTree(); 281 282 private: 283 SmFile m_File; 284 285 char* m_Top; 286 char* m_Current; 287 288 SmCmdArray m_CmdArray; 289 }; 290 291 292 293 #endif // SM_INITIAL_FILE_PARSER_H_ 294