Annotation of embedaddon/php/main/getopt.c, revision 1.1
1.1 ! misho 1: /*
! 2: +----------------------------------------------------------------------+
! 3: | PHP Version 5 |
! 4: +----------------------------------------------------------------------+
! 5: | Copyright (c) 1997-2012 The PHP Group |
! 6: +----------------------------------------------------------------------+
! 7: | This source file is subject to version 3.01 of the PHP license, |
! 8: | that is bundled with this package in the file LICENSE, and is |
! 9: | available through the world-wide-web at the following url: |
! 10: | http://www.php.net/license/3_01.txt |
! 11: | If you did not receive a copy of the PHP license and are unable to |
! 12: | obtain it through the world-wide-web, please send a note to |
! 13: | license@php.net so we can mail you a copy immediately. |
! 14: +----------------------------------------------------------------------+
! 15: | Author: Marcus Boerger <helly@php.net> |
! 16: +----------------------------------------------------------------------+
! 17: */
! 18:
! 19: /* $Id: getopt.c 321634 2012-01-01 13:15:04Z felipe $ */
! 20:
! 21: #include <stdio.h>
! 22: #include <string.h>
! 23: #include <assert.h>
! 24: #include <stdlib.h>
! 25: #include "php_getopt.h"
! 26:
! 27: #define OPTERRCOLON (1)
! 28: #define OPTERRNF (2)
! 29: #define OPTERRARG (3)
! 30:
! 31: static int php_opt_error(int argc, char * const *argv, int oint, int optchr, int err, int show_err) /* {{{ */
! 32: {
! 33: if (show_err)
! 34: {
! 35: fprintf(stderr, "Error in argument %d, char %d: ", oint, optchr+1);
! 36: switch(err)
! 37: {
! 38: case OPTERRCOLON:
! 39: fprintf(stderr, ": in flags\n");
! 40: break;
! 41: case OPTERRNF:
! 42: fprintf(stderr, "option not found %c\n", argv[oint][optchr]);
! 43: break;
! 44: case OPTERRARG:
! 45: fprintf(stderr, "no argument for option %c\n", argv[oint][optchr]);
! 46: break;
! 47: default:
! 48: fprintf(stderr, "unknown\n");
! 49: break;
! 50: }
! 51: }
! 52: return('?');
! 53: }
! 54: /* }}} */
! 55:
! 56: PHPAPI int php_optidx = -1;
! 57:
! 58: PHPAPI int php_getopt(int argc, char* const *argv, const opt_struct opts[], char **optarg, int *optind, int show_err, int arg_start) /* {{{ */
! 59: {
! 60: static int optchr = 0;
! 61: static int dash = 0; /* have already seen the - */
! 62:
! 63: php_optidx = -1;
! 64:
! 65: if (*optind >= argc) {
! 66: return(EOF);
! 67: }
! 68: if (!dash) {
! 69: if ((argv[*optind][0] != '-')) {
! 70: return(EOF);
! 71: } else {
! 72: if (!argv[*optind][1])
! 73: {
! 74: /*
! 75: * use to specify stdin. Need to let pgm process this and
! 76: * the following args
! 77: */
! 78: return(EOF);
! 79: }
! 80: }
! 81: }
! 82: if ((argv[*optind][0] == '-') && (argv[*optind][1] == '-')) {
! 83: char *pos;
! 84: int arg_end = strlen(argv[*optind])-1;
! 85:
! 86: /* '--' indicates end of args if not followed by a known long option name */
! 87: if (argv[*optind][2] == '\0') {
! 88: (*optind)++;
! 89: return(EOF);
! 90: }
! 91:
! 92: arg_start = 2;
! 93:
! 94: /* Check for <arg>=<val> */
! 95: if ((pos = php_memnstr(&argv[*optind][arg_start], "=", 1, argv[*optind]+arg_end)) != NULL) {
! 96: arg_end = pos-&argv[*optind][arg_start];
! 97: arg_start++;
! 98: } else {
! 99: arg_end--;
! 100: }
! 101:
! 102: while (1) {
! 103: php_optidx++;
! 104: if (opts[php_optidx].opt_char == '-') {
! 105: (*optind)++;
! 106: return(php_opt_error(argc, argv, *optind-1, optchr, OPTERRARG, show_err));
! 107: } else if (opts[php_optidx].opt_name && !strncmp(&argv[*optind][2], opts[php_optidx].opt_name, arg_end) && arg_end == strlen(opts[php_optidx].opt_name)) {
! 108: break;
! 109: }
! 110: }
! 111:
! 112: optchr = 0;
! 113: dash = 0;
! 114: arg_start += strlen(opts[php_optidx].opt_name);
! 115: } else {
! 116: if (!dash) {
! 117: dash = 1;
! 118: optchr = 1;
! 119: }
! 120: /* Check if the guy tries to do a -: kind of flag */
! 121: if (argv[*optind][optchr] == ':') {
! 122: dash = 0;
! 123: (*optind)++;
! 124: return (php_opt_error(argc, argv, *optind-1, optchr, OPTERRCOLON, show_err));
! 125: }
! 126: arg_start = 1 + optchr;
! 127: }
! 128: if (php_optidx < 0) {
! 129: while (1) {
! 130: php_optidx++;
! 131: if (opts[php_optidx].opt_char == '-') {
! 132: int errind = *optind;
! 133: int errchr = optchr;
! 134:
! 135: if (!argv[*optind][optchr+1]) {
! 136: dash = 0;
! 137: (*optind)++;
! 138: } else {
! 139: optchr++;
! 140: arg_start++;
! 141: }
! 142: return(php_opt_error(argc, argv, errind, errchr, OPTERRNF, show_err));
! 143: } else if (argv[*optind][optchr] == opts[php_optidx].opt_char) {
! 144: break;
! 145: }
! 146: }
! 147: }
! 148: if (opts[php_optidx].need_param) {
! 149: /* Check for cases where the value of the argument
! 150: is in the form -<arg> <val>, -<arg>=<varl> or -<arg><val> */
! 151: dash = 0;
! 152: if (!argv[*optind][arg_start]) {
! 153: (*optind)++;
! 154: if (*optind == argc) {
! 155: /* Was the value required or is it optional? */
! 156: if (opts[php_optidx].need_param == 1) {
! 157: return(php_opt_error(argc, argv, *optind-1, optchr, OPTERRARG, show_err));
! 158: }
! 159: /* Optional value is not supported with -<arg> <val> style */
! 160: } else if (opts[php_optidx].need_param == 1) {
! 161: *optarg = argv[(*optind)++];
! 162: }
! 163: } else if (argv[*optind][arg_start] == '=') {
! 164: arg_start++;
! 165: *optarg = &argv[*optind][arg_start];
! 166: (*optind)++;
! 167: } else {
! 168: *optarg = &argv[*optind][arg_start];
! 169: (*optind)++;
! 170: }
! 171: return opts[php_optidx].opt_char;
! 172: } else {
! 173: /* multiple options specified as one (exclude long opts) */
! 174: if (arg_start >= 2 && !((argv[*optind][0] == '-') && (argv[*optind][1] == '-'))) {
! 175: if (!argv[*optind][optchr+1])
! 176: {
! 177: dash = 0;
! 178: (*optind)++;
! 179: } else {
! 180: optchr++;
! 181: }
! 182: } else {
! 183: (*optind)++;
! 184: }
! 185: return opts[php_optidx].opt_char;
! 186: }
! 187: assert(0);
! 188: return(0); /* never reached */
! 189: }
! 190: /* }}} */
! 191:
! 192: /*
! 193: * Local variables:
! 194: * tab-width: 4
! 195: * c-basic-offset: 4
! 196: * End:
! 197: * vim600: sw=4 ts=4 fdm=marker
! 198: * vim<600: sw=4 ts=4
! 199: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>