diff --git a/flags.c b/flags.c index 9581840..e401b24 100644 --- a/flags.c +++ b/flags.c @@ -1,3 +1,4 @@ + #ifdef __ORCAC__ #pragma optimize 79 #pragma noroot @@ -9,125 +10,106 @@ #include "flags.h" -// like getopt. - -Flags flags; - - -void help(void) +void FlagsHelp(void) { fputs("gopher [options] url\n", stdout); - fputs("-h display help information.\n", stdout); - fputs("-V display version information.\n", stdout); - fputs("-i display http headers.\n", stdout); + fputs("-h display help information\n", stdout); + fputs("-V display version information\n", stdout); + fputs("-v be verbose\n", stdout); + fputs("-i display http headers\n", stdout); fputs("-I http HEAD\n", stdout); - fputs("-O write output to file.\n", stdout); - fputs("-o write output to instead of stdout.\n", stdout); + fputs("-O write output to file\n", stdout); + fputs("-o write output to instead of stdout\n", stdout); fputs("-0 use HTTP 1.0\n", stdout); fputs("-9 use HTTP 0.9\n", stdout); fputs("\n", stdout); - exit(0); } -int ParseFlags(int argc, char **argv) +int FlagsParse(int argc, char **argv) { - char *cp; - char c; - int i; - int j; + char *cp; + char c; + int i; + int j; - memset(&flags, 0, sizeof(flags)); + memset(&flags, 0, sizeof(flags)); - for (i = 1; i < argc; ++i) - { - cp = argv[i]; - - c = cp[0]; - - if (c != '-') - return i; - - // -- = end of options. - if (cp[1] == '-' && cp[2] == 0) - return i + 1; - - - // now scan all the flags in the string... - for (j = 1; ; ++j) + for (i = 1; i < argc; ++i) + { + cp = argv[i]; + c = cp[0]; + + if (c != '-') + return i; + + // -- = end of options. + if (cp[1] == '-' && cp[2] == 0) + return i + 1; + + // now scan all the flags in the string... + for (j = 1; ; ++j) + { + int skip = 0; + + c = cp[j]; + if (c == 0) break; + + switch (c) + { + case 'h': + FlagsHelp(); + break; + case 'o': + // -xarg or -x arg + skip = 1; + if (cp[j + 1]) { - int skip = 0; - - c = cp[j]; - if (c == 0) break; - - switch (c) - { - case 'h': - help(); - break; - - case 'i': - flags._i = 1; - break; - - case 'I': - flags._I = 1; - break; - - case 'O': - flags._O = 1; - flags._o = 0; - break; - - case 'v': - flags._v = 1; - break; - - case 'V': - flags._V = 1; - break; - - case '0': - flags._0 = 1; - flags._9 = 0; - break; - - case '9': - flags._9 = 1; - flags._0 = 0; - break; - - // take an argument... - // -oarg or -o arg - case 'o': - flags._O = 0; - skip = 1; - if (cp[j + 1]) - flags._o = cp + j + 1; - else - { - if (++i >= argc) - { - fprintf(stderr, "option requires an argument -- %c\n", c); - return -1; - } - flags._o = argv[i]; - } - break; - default: - fprintf(stderr, "illegal option -- %c\n", c); - return -1; - } - - if (skip) break; + flags._o = cp + j + 1; } - - - - - } - + else + { + if (++i >= argc) + { + fprintf(stderr, "option requires an argument -- %c\n", c); + return -1; + } + flags._o = argv[i]; + } + flags._O = 0; + break; + case 'i': + flags._i = 1; + break; + case 'I': + flags._I = 1; + break; + case 'V': + flags._V = 1; + break; + case 'v': + flags._v++; + break; + case 'O': + flags._O = 1; + break; + case '0': + flags._0 = 1; + flags._1 = 0; + break; + case '1': + flags._1 = 1; + flags._0 = 0; + break; - return i; -} \ No newline at end of file + default: + fprintf(stderr, "illegal option -- %c\n", c); + return -1; + } + + if (skip) break; + } + } + + return i; +} diff --git a/flags.h b/flags.h index 898eb4b..7098e1e 100644 --- a/flags.h +++ b/flags.h @@ -1,24 +1,26 @@ + #ifndef __flags_h__ #define __flags_h__ typedef struct Flags { - - int _0:1; // -1 (use http 1.0) - int _9:1; // -9 (use http 0.9) - int _i:1; // -i (include http headers) - int _I:1; // -I (http HEAD command) - int _O:1; // -O (file name from url) - int _v:1; // -v (verbose) - int _V:1; - char *_o; + unsigned _v; + + unsigned _i:1; + unsigned _I:1; + unsigned _V:1; + unsigned _O:1; + unsigned _0:1; + unsigned _1:1; + } Flags; extern struct Flags flags; -int ParseFlags(int argc, char **argv); +int FlagsParse(int argc, char **argv); -void help(void); +void FlagsHelp(void); + +#endif -#endif \ No newline at end of file diff --git a/flags.rb b/flags.rb index a114cb5..b984d3b 100644 --- a/flags.rb +++ b/flags.rb @@ -75,6 +75,7 @@ class Option @char = hash['char'].to_s @argument = hash['argument'] || false + @increment = hash['increment'] || false @flag_name = hash['flag_name'] @flag_name = @flag_name.to_s if @flag_name @@ -92,10 +93,10 @@ class Option @xor.map! { |x| x.to_s } end - attr_reader :char, :xor, :argument + attr_reader :char, :xor, :argument, :increment def flag_name - return @flag_name if @flagname + return @flag_name if @flag_name return self.class.flag_name(@char) end @@ -173,7 +174,7 @@ argf_each {|filename, file| # check for help? basename = filename - basename = $1 if filename && filename =~ /^(.*)./ + basename = $1 if filename && filename =~ /^(.*)\./ b = binding # bind help, options for ERB. @@ -189,11 +190,13 @@ argf_each {|filename, file| options.each {|opt| if opt.argument io.printf(" char *%s;\n", opt.flag_name) + elsif opt.increment + io.printf(" unsigned %s;\n", opt.flag_name) end } io.puts() options.each {|opt| - if !opt.argument + if !opt.argument && !opt.increment io.printf(" unsigned %s:1;\n", opt.flag_name) end } @@ -208,7 +211,6 @@ argf_each {|filename, file| } - __END__ #ifdef __ORCAC__ @@ -289,6 +291,8 @@ int FlagsParse(int argc, char **argv) } <%= flag_name %> = argv[i]; } +% elsif opt.increment + <%= flag_name %>++; % else # no argument. <%= flag_name %> = 1; % end # if no argument. diff --git a/flags.txt b/flags.txt index 2d2b084..a71a618 100644 --- a/flags.txt +++ b/flags.txt @@ -4,7 +4,8 @@ options: - o: { argument : true, xor: 'O' } - i - I - - v + - V + - v: { increment: true } - O - 0: { xor: '1'} - 1: { xor: '0' } @@ -13,6 +14,7 @@ help: - gopher [options] url - -h display help information - -V display version information + - -v be verbose - -i display http headers - -I http HEAD - -O write output to file