root/sapi/isapi/stresstest/getopt.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ap_optiserr
  2. ap_getopt
  3. main

   1 /* Borrowed from Apache NT Port */
   2 
   3 #include <stdio.h>
   4 #include <string.h>
   5 #include <assert.h>
   6 #include <stdlib.h>
   7 #include "getopt.h"
   8 #define OPTERRCOLON (1)
   9 #define OPTERRNF (2)
  10 #define OPTERRARG (3)
  11 
  12 
  13 char *ap_optarg;
  14 int ap_optind = 1;
  15 static int ap_opterr = 1;
  16 static int ap_optopt;
  17 
  18 static int
  19 ap_optiserr(int argc, char * const *argv, int oint, const char *optstr,
  20          int optchr, int err)
  21 {
  22     if (ap_opterr)
  23     {
  24         fprintf(stderr, "Error in argument %d, char %d: ", oint, optchr+1);
  25         switch(err)
  26         {
  27         case OPTERRCOLON:
  28             fprintf(stderr, ": in flags\n");
  29             break;
  30         case OPTERRNF:
  31             fprintf(stderr, "option not found %c\n", argv[oint][optchr]);
  32             break;
  33         case OPTERRARG:
  34             fprintf(stderr, "no argument for option %c\n", argv[oint][optchr]);
  35             break;
  36         default:
  37             fprintf(stderr, "unknown\n");
  38             break;
  39         }
  40     }
  41     ap_optopt = argv[oint][optchr];
  42     return('?');
  43 }
  44     
  45 int ap_getopt(int argc, char* const *argv, const char *optstr)
  46 {
  47     static int optchr = 0;
  48     static int dash = 0; /* have already seen the - */
  49 
  50     char *cp;
  51 
  52     if (ap_optind >= argc)
  53         return(EOF);
  54     if (!dash && (argv[ap_optind][0] !=  '-'))
  55         return(EOF);
  56     if (!dash && (argv[ap_optind][0] ==  '-') && !argv[ap_optind][1])
  57     {
  58         /*
  59          * use to specify stdin. Need to let pgm process this and
  60          * the following args
  61          */
  62         return(EOF);
  63     }
  64     if ((argv[ap_optind][0] == '-') && (argv[ap_optind][1] == '-'))
  65     {
  66         /* -- indicates end of args */
  67         ap_optind++;
  68         return(EOF);
  69     }
  70     if (!dash)
  71     {
  72         assert((argv[ap_optind][0] == '-') && argv[ap_optind][1]);
  73         dash = 1;
  74         optchr = 1;
  75     }
  76 
  77     /* Check if the guy tries to do a -: kind of flag */
  78     assert(dash);
  79     if (argv[ap_optind][optchr] == ':')
  80     {
  81         dash = 0;
  82         ap_optind++;
  83         return(ap_optiserr(argc, argv, ap_optind-1, optstr, optchr, OPTERRCOLON));
  84     }
  85     if (!(cp = strchr(optstr, argv[ap_optind][optchr])))
  86     {
  87         int errind = ap_optind;
  88         int errchr = optchr;
  89 
  90         if (!argv[ap_optind][optchr+1])
  91         {
  92             dash = 0;
  93             ap_optind++;
  94         }
  95         else
  96             optchr++;
  97         return(ap_optiserr(argc, argv, errind, optstr, errchr, OPTERRNF));
  98     }
  99     if (cp[1] == ':')
 100     {
 101         /* Check for cases where the value of the argument 
 102            is in the form -<arg> <val> or in the form -<arg><val> */
 103         dash = 0;
 104         if(!argv[ap_optind][2]) {
 105             ap_optind++;
 106             if (ap_optind == argc)
 107                 return(ap_optiserr(argc, argv, ap_optind-1, optstr, optchr, OPTERRARG));
 108             ap_optarg = argv[ap_optind++];
 109         }
 110         else
 111         {
 112             ap_optarg = &argv[ap_optind][2];
 113             ap_optind++;
 114         }
 115         return(*cp);
 116     }
 117     else
 118     {
 119         if (!argv[ap_optind][optchr+1])
 120         {
 121             dash = 0;
 122             ap_optind++;
 123         }
 124         else
 125             optchr++;
 126         return(*cp);
 127     }
 128     assert(0);
 129     return(0);
 130 }
 131 
 132 #ifdef TESTGETOPT
 133 int
 134  main (int argc, char **argv)
 135  {
 136       int c;
 137       extern char *ap_optarg;
 138       extern int ap_optind;
 139       int aflg = 0;
 140       int bflg = 0;
 141       int errflg = 0;
 142       char *ofile = NULL;
 143 
 144       while ((c = ap_getopt(argc, argv, "abo:")) != EOF)
 145            switch (c) {
 146            case 'a':
 147                 if (bflg)
 148                      errflg++;
 149                 else
 150                      aflg++;
 151                 break;
 152            case 'b':
 153                 if (aflg)
 154                      errflg++;
 155                 else
 156                      bflg++;
 157                 break;
 158            case 'o':
 159                 ofile = ap_optarg;
 160                 (void)printf("ofile = %s\n", ofile);
 161                 break;
 162            case '?':
 163                 errflg++;
 164            }
 165       if (errflg) {
 166            (void)fprintf(stderr,
 167                 "usage: cmd [-a|-b] [-o <filename>] files...\n");
 168            exit (2);
 169       }
 170       for ( ; ap_optind < argc; ap_optind++)
 171            (void)printf("%s\n", argv[ap_optind]);
 172       return 0;
 173  }
 174 
 175 #endif /* TESTGETOPT */

/* [<][>][^][v][top][bottom][index][help] */