make -v flag increment (-v -v -> _v = 2)
This commit is contained in:
parent
55610990e1
commit
f1be63acb3
196
flags.c
196
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 <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
26
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
|
14
flags.rb
14
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.
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue