Index: Options.cpp =================================================================== RCS file: /home/cvsroot/ice/src/IceUtil/Options.cpp,v retrieving revision 1.3 retrieving revision 1.5 diff -c -r1.3 -r1.5 *** Options.cpp 18 Feb 2005 01:07:06 -0000 1.3 --- Options.cpp 14 Mar 2005 04:42:53 -0000 1.5 *************** *** 97,110 **** if(parseCalled) { ! throw APIError("Cannot call parse() more than once on the same Option instance"); } parseCalled = true; int i; ! for(i = 1; i < argc && *argv[i] == '-'; ++i) { ! if(argv[i][1] == '\0' || strcmp(argv[i], "--") == 0) { ++i; break; // "-" and "--" indicate end of options. --- 97,114 ---- if(parseCalled) { ! throw APIError("cannot call parse() more than once on the same Option instance"); } parseCalled = true; + set seenNonRepeatableOpts; // To catch repeated non-repeatable options. + + vector result; + int i; ! for(i = 1; i < argc; ++i) { ! if(strcmp(argv[i], "-") == 0 || strcmp(argv[i], "--") == 0) { ++i; break; // "-" and "--" indicate end of options. *************** *** 114,120 **** ValidOpts::iterator pos; bool argDone = false; ! if(argv[i][1] == '-') { // // Long option. If the option has an argument, it can either be separated by '=' --- 118,124 ---- ValidOpts::iterator pos; bool argDone = false; ! if(strncmp(argv[i], "--", 2) == 0) { // // Long option. If the option has an argument, it can either be separated by '=' *************** *** 128,134 **** } if(*p == '=') { ! opt.assign(argv[i] + 2, p - argv[i] + 2); } else { --- 132,138 ---- } if(*p == '=') { ! opt.assign(argv[i] + 2, p - (argv[i] + 2)); } else { *************** *** 151,158 **** setOpt(opt, p + 1, pos->second.repeat); argDone = true; } } ! else { // // Short option. --- 155,174 ---- setOpt(opt, p + 1, pos->second.repeat); argDone = true; } + + if(pos->second.repeat == NoRepeat) + { + set::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] == '-') { // // Short option. *************** *** 176,181 **** --- 192,217 ---- argDone = true; } } + + if(pos->second.repeat == NoRepeat) + { + set::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 + { + // + // Not an option or option argument. + // + result.push_back(argv[i]); + argDone = true; } if(!argDone) *************** *** 202,208 **** } } - vector result; while(i < argc) { result.push_back(argv[i++]); --- 238,243 ---- *************** *** 273,279 **** err.push_back('-'); } err += opt + "': is a non-repeating option -- use optArg() to get its argument"; - cerr << "p7" << endl; throw APIError(err); } --- 308,313 ---- *************** *** 326,343 **** 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; } --- 360,365 ----