From: stephan b. <sg...@us...> - 2004-12-30 16:38:56
|
Update of /cvsroot/pclasses/pclasses2/src/Util In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22607/src/Util Added Files: SimpleArgvParser.cpp Log Message: egg. Doesn't yet do equals-sign parsing, but basically works. --- NEW FILE: SimpleArgvParser.cpp --- #include <vector> #include <list> #include <pclasses/Util/SimpleArgvParser.h> #include <pclasses/Phoenix.h> namespace P { namespace Util { SimpleArgvParser::SimpleArgvParser() { } SimpleArgvParser::SimpleArgvParser( int argc, char ** argv ) { } SimpleArgvParser::~SimpleArgvParser() { } template <typename ListT> size_t toList( ListT & tgt, int argc, char ** argv ) { for( int i = 0; i < argc; i++) { tgt.push_back( argv[i] ); } } std::string strip_dashes( const std::string & s ) { if( 0 != s.find( "-" ) ) return s; std::string::size_type first = s.find_first_not_of( "-" ); std::string ret; if( std::string::npos == first ) return ret; return s.substr( first ); } size_t SimpleArgvParser::parse( int argc, char ** argv ) { #define IS_ARG(S) ( '-' == S[0] && S != "-" ) if( argc < 1 ) return 0; typedef std::vector<std::string> SVec; SVec alist; int count = toList( alist, argc, argv ); size_t ret = 0; std::string k; std::string nextarg; bool skipnext = false; for( int at = 0; at < count; at++) { if( skipnext ) { skipnext = false; continue; } k = alist[at]; if( IS_ARG(k) ) { k = strip_dashes( k ); if( at == argc-1 ) { // final arg ++ret; this->set( k, "1" ); break; } nextarg = alist[at+1]; if( IS_ARG(nextarg) ) { ++ret; this->set( k, "1" ); continue; } else { ++ret; this->set( k, nextarg ); skipnext = true; continue; } } } return ret; #undef IS_ARG } SimpleArgvParser & SimpleArgvParser::args( int argc, char ** argv ) { SimpleArgvParser & s = args(); if( s.empty() ) { s.parse( argc, argv ); } return s; } SimpleArgvParser & SimpleArgvParser::args() { return ArgvPhoenix::instance(); } } } // namespace P:: Util |