Annotation of embedaddon/php/sapi/milter/getopt.c, revision 1.1.1.1

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

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