/*---------------------------------------------------------------------------* Project: NintendoWare File: SmInitialFileParser.h Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Revision: 18422 $ *---------------------------------------------------------------------------*/ #ifndef SM_INITIAL_FILE_PARSER_H_ #define SM_INITIAL_FILE_PARSER_H_ #include #include #include #include "../include/SmBase.h" #include "../include/SmFile.h" //------------------------------------------------------------------------------ //! 4タイプの値を管理するパラメータクラスです。 class SmParam { public: enum { SM_PARAM_TYPE_U32 = 0, SM_PARAM_TYPE_S32 = 1, SM_PARAM_TYPE_F32 = 2, SM_PARAM_TYPE_STRING = 3 }; typedef u32 SmParamType; //! コンストラクタです SmParam() : m_Type( SM_PARAM_TYPE_U32 ), m_u32Param( 0 ) { m_String = ""; } //! パラメータタイプを取得します。 SmParamType GetType() const { return m_Type; } //! パラメータを取得します。 u32 GetU32() const { switch( m_Type ) { case SM_PARAM_TYPE_U32: { return m_u32Param; } case SM_PARAM_TYPE_S32: { return static_cast(m_s32Param); } case SM_PARAM_TYPE_F32: { return static_cast(m_f32Param); } case SM_PARAM_TYPE_STRING: { return static_cast(atoi(m_String.c_str())); } } return 0; } s32 GetS32() const { switch( m_Type ) { case SM_PARAM_TYPE_U32: { return static_cast(m_u32Param); } case SM_PARAM_TYPE_S32: { return m_s32Param; } case SM_PARAM_TYPE_F32: { return static_cast(m_f32Param); } case SM_PARAM_TYPE_STRING: { return static_cast(atoi(m_String.c_str())); } } return 0; } f32 GetF32() const { switch( m_Type ) { case SM_PARAM_TYPE_U32: { return static_cast(m_u32Param); } case SM_PARAM_TYPE_S32: { return static_cast(m_s32Param); } case SM_PARAM_TYPE_F32: { return m_f32Param; } case SM_PARAM_TYPE_STRING: { return static_cast(atof(m_String.c_str())); } } return 0; } const char* GetString() const { switch( m_Type ) { case SM_PARAM_TYPE_U32: case SM_PARAM_TYPE_S32: case SM_PARAM_TYPE_F32: { // m_String.Format( "%d", m_u32Param ); // return m_String.c_str(); NW_FATAL_ERROR( "no support!" ); } case SM_PARAM_TYPE_STRING: { return m_String.c_str(); } } return NULL; } //! パラメータを設定します。 void SetParam( u32 param ) { m_Type = SM_PARAM_TYPE_U32; m_u32Param = param; } void SetParam( s32 param ) { m_Type = SM_PARAM_TYPE_S32; m_s32Param = param; } void SetParam( f32 param ) { m_Type = SM_PARAM_TYPE_F32; m_f32Param = param; } void SetParam( const char* param ) { m_Type = SM_PARAM_TYPE_STRING; m_String = param; } private: SmParamType m_Type; union { u32 m_u32Param; s32 m_s32Param; f32 m_f32Param; }; std::string m_String; }; //--------------------------------------------------------------------------- //! 実行される1つのコマンドです。 class SmCmd : public SmBase { friend class SmInitialFileParser; private: //! 名前と値を組み合わせたデータです。 struct SmData { std::string name; // 名前 SmParam param; // 値 }; public: //! コンストラクタです。 SmCmd() : m_Parent( NULL ), m_Child( NULL ), m_Next( NULL ) { Init(); } //! データの初期化を行います。 void Init() { m_Command = "NULL"; for ( int i=0; i<16; ++i ) { m_Data[i].name = "null"; m_Data[i].param.SetParam( 0 ); } } //! エレメントを取得します。 const char* GetCommand() const { return m_Command.c_str(); } //! 名前を指定して値を取得します。 f32 GetF32( const char* strName ) const { for ( int i=0; i<16; ++i ) { const char* name = m_Data[i].name.c_str(); if ( strcmp( name, strName ) == 0 ) { return m_Data[i].param.GetF32(); } } return 0.f; } private: SmCmd* m_Parent; SmCmd* m_Child; SmCmd* m_Next; std::string m_Command; // SmCmdArray; public: SmInitialFileParser(); ~SmInitialFileParser(); //! 取得可能か問い合わせます。 bool IsGettable(); //! コマンドを取得します。 SmCmd GetCmd(); //! 初期化ファイルをロードします。 bool Load( const wchar_t* configFileName ); //! コマンド数を取得します。 u32 GetCmdNum() const { return m_CmdArray.size(); } //! コマンドを取得します。 const SmCmd* GetCmd( u32 no ) { return m_CmdArray[no]; } private: //! コマンドツリーを生成します。 void _createCmdTree(); private: SmFile m_File; char* m_Top; char* m_Current; SmCmdArray m_CmdArray; }; #endif // SM_INITIAL_FILE_PARSER_H_