Return to getopt.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / sapi / milter |
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 */