make -v flag increment (-v -v -> _v = 2)

This commit is contained in:
Kelvin Sherlock 2014-09-11 15:31:07 -04:00
parent 55610990e1
commit f1be63acb3
4 changed files with 115 additions and 125 deletions

196
flags.c
View File

@ -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 <file> write output to <file> instead of stdout.\n", stdout);
fputs("-O write output to file\n", stdout);
fputs("-o <file> write output to <file> 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;
}
default:
fprintf(stderr, "illegal option -- %c\n", c);
return -1;
}
if (skip) break;
}
}
return i;
}

26
flags.h
View File

@ -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

View File

@ -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.

View File

@ -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