summaryrefslogtreecommitdiff
path: root/cpp/src/IceUtil/Options.cpp
diff options
context:
space:
mode:
authorMichi Henning <michi@zeroc.com>2005-03-14 04:42:53 +0000
committerMichi Henning <michi@zeroc.com>2005-03-14 04:42:53 +0000
commitaed0eca17c24e865fd583946796b4a354dd25e9f (patch)
tree8a37c2a313bd99cd88135faa0a861a5a07475b2a /cpp/src/IceUtil/Options.cpp
parentMerged fix for http://bugzilla.zeroc.com/bugzilla/show_bug.cgi?id=172 from (diff)
downloadice-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-xcpp/src/IceUtil/Options.cpp45
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;
}