diff options
author | Colm MacCarthaigh <colm@apache.org> | 2010-01-08 11:45:43 +0000 |
---|---|---|
committer | Colm MacCarthaigh <colm@apache.org> | 2010-01-08 11:45:43 +0000 |
commit | 396931c93e46f5d130f0df7044a9c0e63fd12ebd (patch) | |
tree | 9ff5247f604985caa9581ebe4bfa6aa5164db5ce /APACHE_1_3_42/src/os/netware/getopt.c | |
parent | 7d344b579813528064a6711a91f675b7f47e4926 (diff) | |
download | httpd-1.3.tar.gz |
Tag 1.3.421.3
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/tags/1.3@897175 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'APACHE_1_3_42/src/os/netware/getopt.c')
-rw-r--r-- | APACHE_1_3_42/src/os/netware/getopt.c | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/APACHE_1_3_42/src/os/netware/getopt.c b/APACHE_1_3_42/src/os/netware/getopt.c new file mode 100644 index 0000000000..8b04bf9803 --- /dev/null +++ b/APACHE_1_3_42/src/os/netware/getopt.c @@ -0,0 +1,177 @@ +/* Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <stdio.h> +#include <string.h> +#include <assert.h> +#include <stdlib.h> + +#define OPTERRCOLON (1) +#define OPTERRNF (2) +#define OPTERRARG (3) + +char *optarg; +int optind = 1; +int opterr = 1; +int optopt; + +static int +optiserr(int argc, char * const *argv, int oint, const char *optstr, + int optchr, int err) +{ + if (opterr) { + fprintf(stderr, "Error in argument %d, char %d: ", oint, optchr + 1); + + switch (err) { + case OPTERRCOLON: + fprintf(stderr, ": in flags\n"); + break; + case OPTERRNF: + fprintf(stderr, "option not found %c\n", argv[oint][optchr]); + break; + case OPTERRARG: + fprintf(stderr, "no argument for option %c\n", argv[oint][optchr]); + break; + default: + fprintf(stderr, "unknown\n"); + break; + } + } + optopt = argv[oint][optchr]; + return('?'); +} + +int +getopt(int argc, char* const *argv, const char *optstr) +{ + static int optchr = 0; + static int dash = 0; /* have already seen the - */ + + char *cp; + + if (optind >= argc) + return(EOF); + + if (!dash && (argv[optind][0] != '-')) + return(EOF); + + if (!dash && (argv[optind][0] == '-') && !argv[optind][1]) { + /* + * use to specify stdin. Need to let pgm process this and + * the following args + */ + return(EOF); + } + + if ((argv[optind][0] == '-') && (argv[optind][1] == '-')) { + /* -- indicates end of args */ + optind++; + return(EOF); + } + + if (!dash) { + assert((argv[optind][0] == '-') && argv[optind][1]); + dash = 1; + optchr = 1; + } + + /* Check if the guy tries to do a -: kind of flag */ + assert(dash); + if (argv[optind][optchr] == ':') { + dash = 0; + optind++; + return(optiserr(argc, argv, optind-1, optstr, optchr, OPTERRCOLON)); + } + + if (!(cp = strchr(optstr, argv[optind][optchr]))) { + int errind = optind; + int errchr = optchr; + + if (!argv[optind][optchr+1]) { + dash = 0; + optind++; + } + else + optchr++; + return(optiserr(argc, argv, errind, optstr, errchr, OPTERRNF)); + } + + if (cp[1] == ':') { + dash = 0; + optind++; + + if(optind == argc) + return(optiserr(argc, argv, optind-1, optstr, optchr, OPTERRARG)); + optarg = argv[optind++]; + return(*cp); + } else { + if (!argv[optind][optchr+1]) { + dash = 0; + optind++; + } + else + optchr++; + return(*cp); + } + assert(0); + return(0); +} + +#ifdef TESTGETOPT +int main(int argc, char **argv) +{ + int c; + extern char *optarg; + extern int optind; + int aflg = 0; + int bflg = 0; + int errflg = 0; + char *ofile = NULL; + + while ((c = getopt(argc, argv, "abo:")) != EOF) + switch (c) { + case 'a': + if (bflg) + errflg++; + else + aflg++; + break; + case 'b': + if (aflg) + errflg++; + else + bflg++; + break; + case 'o': + ofile = optarg; + (void)printf("ofile = %s\n", ofile); + break; + case '?': + errflg++; + } + + if (errflg) { + (void)fprintf(stderr, "usage: cmd [-a|-b] [-o <filename>] files...\n"); + exit(2); + } + + for ( ; optind < argc; optind++) + (void)printf("%s\n", argv[optind]); + + return 0; +} + +#endif /* TESTGETOPT */ |