File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / sapi / isapi / stresstest / getopt.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 23:48:06 2012 UTC (12 years, 4 months ago) by misho
Branches: php, MAIN
CVS tags: v5_4_3elwix, v5_4_29p0, v5_4_29, v5_4_20p0, v5_4_20, v5_4_17p0, v5_4_17, v5_3_10, HEAD
php

    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 */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>