diff options
author | Michi Henning <michi@zeroc.com> | 2005-03-14 04:42:53 +0000 |
---|---|---|
committer | Michi Henning <michi@zeroc.com> | 2005-03-14 04:42:53 +0000 |
commit | aed0eca17c24e865fd583946796b4a354dd25e9f (patch) | |
tree | 8a37c2a313bd99cd88135faa0a861a5a07475b2a /cpp/src/IceUtil/Options.cpp | |
parent | Merged fix for http://bugzilla.zeroc.com/bugzilla/show_bug.cgi?id=172 from (diff) | |
download | ice-aed0eca17c24e865fd583946796b4a354dd25e9f.tar.bz2 ice-aed0eca17c24e865fd583946796b4a354dd25e9f.tar.xz ice-aed0eca17c24e865fd583946796b4a354dd25e9f.zip |
Fixed http://bugzilla.zeroc.com/bugzilla/show_bug.cgi?id=174
Diffstat (limited to 'cpp/src/IceUtil/Options.cpp')
-rwxr-xr-x | cpp/src/IceUtil/Options.cpp | 45 |
1 files changed, 31 insertions, 14 deletions
diff --git a/cpp/src/IceUtil/Options.cpp b/cpp/src/IceUtil/Options.cpp index 6654bee98fe..4a825e2930f 100755 --- a/cpp/src/IceUtil/Options.cpp +++ b/cpp/src/IceUtil/Options.cpp @@ -101,6 +101,8 @@ IceUtil::Options::parse(int argc, char* argv[]) } parseCalled = true; + set<string> seenNonRepeatableOpts; // To catch repeated non-repeatable options. + vector<string> result; int i; @@ -130,7 +132,7 @@ IceUtil::Options::parse(int argc, char* argv[]) } if(*p == '=') { - opt.assign(argv[i] + 2, p - argv[i] + 2); + opt.assign(argv[i] + 2, p - (argv[i] + 2)); } else { @@ -153,6 +155,18 @@ IceUtil::Options::parse(int argc, char* argv[]) setOpt(opt, p + 1, pos->second.repeat); argDone = true; } + + if(pos->second.repeat == NoRepeat) + { + set<string>::iterator seenPos = seenNonRepeatableOpts.find(opt); + if(seenPos != seenNonRepeatableOpts.end()) + { + string err = "`--"; + err += opt + ":' option cannot be repeated"; + throw BadOpt(err); + } + seenNonRepeatableOpts.insert(seenPos, opt); + } } else if(*argv[i] == '-') { @@ -178,10 +192,25 @@ IceUtil::Options::parse(int argc, char* argv[]) argDone = true; } } + + if(pos->second.repeat == NoRepeat) + { + set<string>::iterator seenPos = seenNonRepeatableOpts.find(opt); + if(seenPos != seenNonRepeatableOpts.end()) + { + string err = "`-"; + err += opt + ":' option cannot be repeated"; + throw BadOpt(err); + } + seenNonRepeatableOpts.insert(seenPos, opt); + } } else { - result.push_back(argv[i]); // Not an option or option argument. + // + // Not an option or option argument. + // + result.push_back(argv[i]); argDone = true; } @@ -331,18 +360,6 @@ IceUtil::Options::checkOpt(const string& opt, LengthType lt) err.push_back('\''); throw BadOpt(err); } - - if(pos->second.repeat == NoRepeat && _opts.find(opt) != _opts.end()) - { - string err = "`-"; - if(lt == LongOpt) - { - err.push_back('-'); - } - err += opt + ":' option cannot be repeated"; - throw BadOpt(err); - } - return pos; } |