diff --git a/flags.c b/flags.c new file mode 100644 index 0000000..9581840 --- /dev/null +++ b/flags.c @@ -0,0 +1,133 @@ +#ifdef __ORCAC__ +#pragma optimize 79 +#pragma noroot +#endif + +#include +#include +#include + +#include "flags.h" + +// like getopt. + +Flags flags; + + +void help(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("-I http HEAD\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) +{ + char *cp; + char c; + int i; + int j; + + 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) + { + 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; + } + + + + + } + + + return i; +} \ No newline at end of file diff --git a/flags.h b/flags.h index f439a44..898eb4b 100644 --- a/flags.h +++ b/flags.h @@ -6,8 +6,10 @@ 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; } Flags; @@ -15,4 +17,8 @@ typedef struct Flags { extern struct Flags flags; +int ParseFlags(int argc, char **argv); + +void help(void); + #endif \ No newline at end of file diff --git a/main.c b/main.c index 5da896d..76e0810 100644 --- a/main.c +++ b/main.c @@ -12,8 +12,6 @@ #include "prototypes.h" #include "flags.h" -struct Flags flags; - // startup/shutdown flags. enum { kLoaded = 1, @@ -85,22 +83,6 @@ void ShutDown(word flags, Boolean force, displayPtr fx) } -void help(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("-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); -} - /* * * @@ -147,8 +129,23 @@ int main(int argc, char **argv) { int i; Word mf; - int ch; + int x; + + + x = ParseFlags(argc, argv); + if (x < 0) return 1; + argv += x; + argc -= x; + + + if (argc != 1) + { + help(); + return 1; + } + + mf = StartUp(NULL); if (mf == -1) @@ -156,64 +153,7 @@ int main(int argc, char **argv) fprintf(stderr, "Marinetti 3.0b3 or greater is required.\n"); exit(1); } - - memset(&flags, 0, sizeof(flags)); - - while ((ch = getopt(argc, argv, "o:hiOVv09")) != -1) - { - switch (ch) - { - case 'i': - flags._i = 1; - break; - - case 'o': - flags._o = optarg; - flags._O = 0; - break; - - case 'O': - flags._O = 1; - flags._o = NULL; - break; - - case 'v': - flags._v = 1; - break; - - case '9': - flags._9 = 1; - flags._0 = 0; - break; - - case '0': - flags._0 = 1; - flags._9 = 0; - break; - - case 'V': - fputs("gopher v 0.2\n", stdout); - exit(0); - break; - - case 'h': - case '?': - case ':': - default: - help(); - break; - } - - } - - argc -= optind; - argv += optind; - - if (argc != 1) - { - help(); - } if (argc == 1) {