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