5128eecc9f 2011-02-23 kinaba: //--- K.I.LIB --- 5128eecc9f 2011-02-23 kinaba: // kl_cmd.h : commandline parser 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: #include "stdafx.h" 5128eecc9f 2011-02-23 kinaba: #include "kilib.h" 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: //------------------------ 文字列のメモリ処理など -----------------------// 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: kiCmdParser::kiCmdParser( char* cmd, bool ignoreFirst ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: m_Buffer = NULL; 5128eecc9f 2011-02-23 kinaba: if( cmd ) 5128eecc9f 2011-02-23 kinaba: doit( cmd, ignoreFirst ); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: kiCmdParser::kiCmdParser( const char* cmd, bool ignoreFirst ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: m_Buffer=NULL; 5128eecc9f 2011-02-23 kinaba: if( cmd ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: m_Buffer = new char[ ki_strlen(cmd)+1 ]; 5128eecc9f 2011-02-23 kinaba: ki_strcpy( m_Buffer, cmd ); 5128eecc9f 2011-02-23 kinaba: doit( m_Buffer, ignoreFirst ); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: kiCmdParser::~kiCmdParser() 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: delete [] m_Buffer; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: //---------------------------- 分割の処理 -----------------------------// 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: void kiCmdParser::doit( char* start, bool ignoreFirst ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: char* p=start; 5128eecc9f 2011-02-23 kinaba: char endc; 5128eecc9f 2011-02-23 kinaba: bool first = true; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: while( *p!='\0' ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: // 余分な空白はスキップ 5128eecc9f 2011-02-23 kinaba: while( *p==' ' ) //|| *p=='\t' || *p=='\r' || *p=='\n' ) 5128eecc9f 2011-02-23 kinaba: p++; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: // " だったら、その旨記録してさらに一個進める 5128eecc9f 2011-02-23 kinaba: if( *p=='"' ) 5128eecc9f 2011-02-23 kinaba: endc='"', p++; 5128eecc9f 2011-02-23 kinaba: else 5128eecc9f 2011-02-23 kinaba: endc=' '; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: // end-of-text なら終了 5128eecc9f 2011-02-23 kinaba: if( *p=='\0' ) 5128eecc9f 2011-02-23 kinaba: break; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: if( first && ignoreFirst ) 5128eecc9f 2011-02-23 kinaba: first = false; 5128eecc9f 2011-02-23 kinaba: else 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: // 引数を保存 5128eecc9f 2011-02-23 kinaba: if( *p=='-' ) 5128eecc9f 2011-02-23 kinaba: m_Switch.add( p ); 5128eecc9f 2011-02-23 kinaba: else 5128eecc9f 2011-02-23 kinaba: m_Param.add( p ); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: // 引数の終わりへ… 5128eecc9f 2011-02-23 kinaba: while( *p!=endc && *p!='\0' ) 5128eecc9f 2011-02-23 kinaba: p++; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: // 終わりは'\0'にすることによって、引数を区切る 5128eecc9f 2011-02-23 kinaba: if( *p!='\0' ) 5128eecc9f 2011-02-23 kinaba: *(p++) = '\0'; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: }