From 404e1eafe9c6e5b61a6d7e113a92b0d66f51f589 Mon Sep 17 00:00:00 2001 From: Kelvin Sherlock Date: Mon, 29 Jul 2013 15:06:35 -0400 Subject: [PATCH] new option parser code --- flags.rb | 44 ++++++++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/flags.rb b/flags.rb index 062c0a0..b1db3e9 100644 --- a/flags.rb +++ b/flags.rb @@ -235,29 +235,39 @@ struct Flags flags; int FlagsParse(int argc, char **argv) { char *cp; + char *optarg; + char c; int i; int j; - + int eof; // end-of-flags + int mindex; // mutation index. + memset(&flags, 0, sizeof(flags)); - for (i = 1; i < argc; ++i) + for (i = 1, mindex = 1, eof = 0; i < argc; ++i) { cp = argv[i]; c = cp[0]; - if (c != '-') - return i; + if (c != '-' || eof) + { + if (i != mindex) argv[mindex] = argv[i]; + mindex++; + continue; + } // -- = end of options. if (cp[1] == '-' && cp[2] == 0) - return i + 1; + { + eof = 1; + continue; + } // now scan all the flags in the string... + optarg = NULL; for (j = 1; ; ++j) - { - int skip = 0; - + { c = cp[j]; if (c == 0) break; @@ -276,20 +286,22 @@ int FlagsParse(int argc, char **argv) % # % if opt.argument // -xarg or -x arg - skip = 1; - if (cp[j + 1]) + ++j; + if (cp[j]) { - <%= flag_name %> = cp + j + 1; + optarg = cp + j; } else { if (++i >= argc) { fputs("option requires an argument -- <%= opt.char %>\n", stderr); - return -1; + exit(1); } - <%= flag_name %> = argv[i]; + optarg = argv[i]; } + <%= flag_name %> = optarg; + % else # no argument. <%= flag_name %> = 1; % end # if no argument. @@ -303,12 +315,12 @@ int FlagsParse(int argc, char **argv) default: fprintf(stderr, "illegal option -- %c\n", c); - return -1; + exit(1); } - if (skip) break; + if (optarg) break; } } - return i; + return mindex; }