diff options
Diffstat (limited to 'src/optparser.cpp')
-rw-r--r-- | src/optparser.cpp | 105 |
1 files changed, 86 insertions, 19 deletions
diff --git a/src/optparser.cpp b/src/optparser.cpp index f99dd85..2a8e64b 100644 --- a/src/optparser.cpp +++ b/src/optparser.cpp | |||
@@ -28,28 +28,48 @@ void Bu::OptParser::parse( int argc, char **argv ) | |||
28 | 28 | ||
29 | Bu::FString sOpt; | 29 | Bu::FString sOpt; |
30 | int iCount = argc-j; | 30 | int iCount = argc-j; |
31 | Bu::FString sExtraParam; | ||
31 | if( argv[j][iEPos] == '=' ) | 32 | if( argv[j][iEPos] == '=' ) |
32 | { | 33 | { |
33 | sOpt.set( argv[j]+2, iEPos-2 ); | 34 | sOpt.set( argv[j]+2, iEPos-2 ); |
34 | iCount++; | 35 | iCount++; |
36 | sExtraParam.set( argv[j]+iEPos+1 ); | ||
35 | } | 37 | } |
36 | else | 38 | else |
37 | { | 39 | { |
38 | sOpt.set( argv[j]+2 ); | 40 | sOpt.set( argv[j]+2 ); |
39 | } | 41 | } |
40 | Option *pOpt = hlOption.get( sOpt ); | 42 | Option *pOpt = hlOption.get( sOpt ); |
41 | Bu::StrArray aParams( iCount ); | 43 | if( pOpt->sUsed ) |
42 | aParams.append( sOpt ); | ||
43 | if( argv[j][iEPos] == '=' ) | ||
44 | { | 44 | { |
45 | aParams.append( argv[j]+iEPos+1 ); | 45 | Bu::StrArray aParams( iCount ); |
46 | aParams.append( sOpt ); | ||
47 | if( sExtraParam ) | ||
48 | { | ||
49 | aParams.append( argv[j]+iEPos+1 ); | ||
50 | } | ||
51 | for( int k = j+1; k < argc; k++ ) | ||
52 | { | ||
53 | aParams.append( argv[k] ); | ||
54 | } | ||
55 | j += pOpt->sUsed( aParams ); | ||
46 | } | 56 | } |
47 | for( int k = j+1; k < argc; k++ ) | 57 | else if( pOpt->pProxy ) |
48 | { | 58 | { |
49 | aParams.append( argv[k] ); | 59 | if( pOpt->sOverride ) |
60 | { | ||
61 | pOpt->pProxy->setValue( pOpt->sOverride ); | ||
62 | } | ||
63 | else if( sExtraParam ) | ||
64 | { | ||
65 | pOpt->pProxy->setValue( sExtraParam ); | ||
66 | } | ||
67 | else if( argv[j+1] != '\0' ) | ||
68 | { | ||
69 | pOpt->pProxy->setValue( argv[j+1] ); | ||
70 | j++; | ||
71 | } | ||
50 | } | 72 | } |
51 | if( pOpt->sUsed ) | ||
52 | j += pOpt->sUsed( aParams ); | ||
53 | } | 73 | } |
54 | else | 74 | else |
55 | { | 75 | { |
@@ -57,26 +77,45 @@ void Bu::OptParser::parse( int argc, char **argv ) | |||
57 | for( iCPos = 1; argv[j][iCPos] != '\0'; iCPos++ ) | 77 | for( iCPos = 1; argv[j][iCPos] != '\0'; iCPos++ ) |
58 | { | 78 | { |
59 | Option *pOpt = hsOption.get( argv[j][iCPos] ); | 79 | Option *pOpt = hsOption.get( argv[j][iCPos] ); |
60 | Bu::StrArray aParams( argc-j+1 ); | ||
61 | char buf[2] = {argv[j][iCPos], '\0'}; | 80 | char buf[2] = {argv[j][iCPos], '\0'}; |
62 | aParams.append( buf ); | ||
63 | if( pOpt->bShortHasParams ) | 81 | if( pOpt->bShortHasParams ) |
64 | { | 82 | { |
65 | if( argv[j][iCPos+1] != '\0' ) | ||
66 | aParams.append( argv[j]+iCPos+1 ); | ||
67 | for( int k = j+1; k < argc; k++ ) | ||
68 | { | ||
69 | aParams.append( argv[k] ); | ||
70 | } | ||
71 | if( pOpt->sUsed ) | 83 | if( pOpt->sUsed ) |
72 | { | 84 | { |
85 | Bu::StrArray aParams( argc-j+1 ); | ||
86 | aParams.append( buf ); | ||
87 | if( argv[j][iCPos+1] != '\0' ) | ||
88 | aParams.append( argv[j]+iCPos+1 ); | ||
89 | for( int k = j+1; k < argc; k++ ) | ||
90 | { | ||
91 | aParams.append( argv[k] ); | ||
92 | } | ||
73 | j += pOpt->sUsed( aParams ); | 93 | j += pOpt->sUsed( aParams ); |
94 | break; | ||
95 | } | ||
96 | else if( pOpt->pProxy ) | ||
97 | { | ||
98 | if( pOpt->sOverride ) | ||
99 | { | ||
100 | pOpt->pProxy->setValue( pOpt->sOverride ); | ||
101 | } | ||
102 | else if( argv[j][iCPos+1] != '\0' ) | ||
103 | { | ||
104 | pOpt->pProxy->setValue( | ||
105 | argv[j]+iCPos+1 | ||
106 | ); | ||
107 | break; | ||
108 | } | ||
74 | } | 109 | } |
75 | break; | ||
76 | } | 110 | } |
77 | else | 111 | else |
78 | { | 112 | { |
79 | pOpt->sUsed( aParams ); | 113 | if( pOpt->sUsed ) |
114 | { | ||
115 | Bu::StrArray aParam( 1 ); | ||
116 | aParam.append( buf ); | ||
117 | pOpt->sUsed( aParam ); | ||
118 | } | ||
80 | } | 119 | } |
81 | } | 120 | } |
82 | } | 121 | } |
@@ -247,16 +286,44 @@ Bu::FString Bu::OptParser::format( const Bu::FString &sIn, int iWidth, | |||
247 | 286 | ||
248 | 287 | ||
249 | // | 288 | // |
289 | // Code for Bu::OptParser::_ValueProxy | ||
290 | // | ||
291 | |||
292 | Bu::OptParser::_ValueProxy::_ValueProxy() | ||
293 | { | ||
294 | } | ||
295 | |||
296 | Bu::OptParser::_ValueProxy::~_ValueProxy() | ||
297 | { | ||
298 | } | ||
299 | |||
300 | // | ||
250 | // Code for Bu::OptParser::Option | 301 | // Code for Bu::OptParser::Option |
251 | // | 302 | // |
252 | 303 | ||
253 | Bu::OptParser::Option::Option() : | 304 | Bu::OptParser::Option::Option() : |
254 | cOpt( '\0' ), | 305 | cOpt( '\0' ), |
255 | bShortHasParams( false ) | 306 | bShortHasParams( false ), |
307 | pProxy( NULL ) | ||
308 | { | ||
309 | } | ||
310 | |||
311 | Bu::OptParser::Option::Option( const Option &rSrc ) : | ||
312 | cOpt( rSrc.cOpt ), | ||
313 | sOpt( rSrc.sOpt ), | ||
314 | sHelp( rSrc.sHelp ), | ||
315 | sUsed( rSrc.sUsed ), | ||
316 | bShortHasParams( rSrc.bShortHasParams ), | ||
317 | pProxy( NULL ), | ||
318 | sOverride( rSrc.sOverride ) | ||
256 | { | 319 | { |
320 | if( rSrc.pProxy ) | ||
321 | pProxy = rSrc.pProxy->clone(); | ||
257 | } | 322 | } |
258 | 323 | ||
259 | Bu::OptParser::Option::~Option() | 324 | Bu::OptParser::Option::~Option() |
260 | { | 325 | { |
326 | delete pProxy; | ||
327 | pProxy = NULL; | ||
261 | } | 328 | } |
262 | 329 | ||