/* * getopt -- * Parse argc/argv argument vector. */ int getopt_internal(int nargc, char * const * nargv, const char *ostr) { static char *place = EMSG; /* option letter processing */ const char *oli; /* option letter list index */ _DIAGASSERT(nargv != NULL); _DIAGASSERT(ostr != NULL); if (optreset || !*place) { /* update scanning pointer */ optreset = 0; if (optind >= nargc || *(place = nargv[optind]) != '-') { place = EMSG; return (-1); } if (place[1] && *++place == '-') { /* found "--" */ /* ++optind; */ place = EMSG; return (-2); } } /* option letter okay? */ if ((optopt = (int)*place++) == (int)':' || !(oli = strchr(ostr, optopt))) { /* * if the user didn't specify '-' as an option, * assume it means -1. */ if (optopt == (int)'-') return (-1); if (!*place) ++optind; if (opterr && *ostr != ':') (void)fprintf(stderr, "%s: illegal option -- %c\n", __progname(nargv[0]), optopt); return (BADCH); } if (*++oli != ':') { /* don't need argument */ optarg = NULL; if (!*place) ++optind; } else { /* need an argument */ if (*place) /* no white space */ optarg = place; else if (nargc <= ++optind) { /* no arg */ place = EMSG; if ((opterr) && (*ostr != ':')) (void)fprintf(stderr, "%s: option requires an argument -- %c\n", __progname(nargv[0]), optopt); return (BADARG); } else /* white space */ optarg = nargv[optind]; place = EMSG; ++optind; } return (optopt); /* dump back option letter */ }
/* * getopt_long -- * Parse argc/argv argument vector. */ int getopt_long(int nargc, char * const * nargv, const char * options, const struct option * long_options, int * index) // int nargc; // char * const * nargv; // const char * options; // const struct option * long_options; // int * index; { int retval; if ((retval = getopt_internal(nargc, nargv, options)) == -2) { char *current_argv = nargv[optind++] + 2, *has_equal; int i, match = -1; size_t current_argv_len; if (*current_argv == '\0') { return(-1); } if ((has_equal = strchr(current_argv, '='))) { current_argv_len = has_equal - current_argv; has_equal++; } else current_argv_len = strlen(current_argv); for (i = 0; long_options[i].name; i++) { if (strncmp(current_argv, long_options[i].name, current_argv_len)) continue; if (strlen(long_options[i].name) == current_argv_len) { match = i; break; } if (match == -1) match = i; } if (match != -1) { if (long_options[match].has_arg) { if (has_equal) optarg = has_equal; else optarg = nargv[optind++]; } if ((long_options[match].has_arg == 1) && (optarg == NULL)) { /* Missing option, leading : indecates no error */ if ((opterr) && (*options != ':')) fprintf(stderr, "%s: option requires an argument -- %s\n", __progname(nargv[0]), current_argv); return (BADARG); } } else { /* No matching argument */ if ((opterr) && (*options != ':')) fprintf(stderr, "%s: illegal option -- %s\n", __progname(nargv[0]), current_argv); return (BADCH); } if (long_options[match].flag) { *long_options[match].flag = long_options[match].val; retval = 0; } else retval = long_options[match].val; if (index) *index = match; } return(retval); }
int cdo_getopt_long(int argc, char * const *argv, const char *optstring, const struct cdo_option *longopts, int *longindex) { int retval; assert(argv != NULL); assert(optstring != NULL); assert(longopts != NULL); /* index may be NULL */ if ( (retval = cdo_getopt_internal(argc, argv, optstring)) == -2 ) { char *current_argv = argv[CDO_optind++] + 2, *has_equal; int i, current_argv_len, match = -1; if ( *current_argv == '\0' ) return(-1); if ( (has_equal = strchr(current_argv, '=')) != NULL ) { current_argv_len = has_equal - current_argv; has_equal++; } else current_argv_len = strlen(current_argv); for ( i = 0; longopts[i].name; i++ ) { if ( strncmp(current_argv, longopts[i].name, current_argv_len) ) continue; if ( strlen(longopts[i].name) == (unsigned)current_argv_len ) { match = i; break; } if ( match == -1 ) match = i; } if ( match != -1 ) { if ( longopts[match].has_arg == required_argument || longopts[match].has_arg == optional_argument ) { if ( has_equal ) CDO_optarg = has_equal; else CDO_optarg = argv[CDO_optind++]; } if ( (longopts[match].has_arg == required_argument) && (CDO_optarg == NULL) ) { /* Missing argument, leading: indicates no error should be generated */ if ( (CDO_opterr) && (*optstring != ':') ) fprintf(stderr, "%s: option requires an argument -- %s\n", __progname(argv[0]), current_argv); return (BADARG); } } else { /* No matching argument */ if ( (CDO_opterr) && (*optstring != ':') ) fprintf(stderr, "%s: illegal option -- %s\n", __progname(argv[0]), current_argv); return (BADCH); } if ( longopts[match].flag ) { *longopts[match].flag = longopts[match].val; retval = 0; } else retval = longopts[match].val; if ( longindex ) *longindex = match; } return (retval); }
/* * getopt_long -- * Parse argc/argv argument vector. */ extern "C" int getopt_long(int nargc, char ** nargv, char * options, struct option * long_options, int * index) { int retval; _DIAGASSERT(nargv != NULL); _DIAGASSERT(options != NULL); _DIAGASSERT(long_options != NULL); /* index may be NULL */ if ((retval = getopt_internal(nargc, nargv, options)) == -2) { char *current_argv = nargv[optind++] + 2, *has_equal; int i, current_argv_len, match = -1; if (*current_argv == '\0') { return(-1); } if ((has_equal = strchr(current_argv, '=')) != NULL) { current_argv_len = has_equal - current_argv; has_equal++; } else current_argv_len = strlen(current_argv); for (i = 0; long_options[i].name; i++) { if (strncmp(current_argv, long_options[i].name, current_argv_len)) continue; if (strlen(long_options[i].name) == (unsigned)current_argv_len) { match = i; break; } if (match == -1) match = i; } if (match != -1) { if (long_options[match].has_arg == required_argument || long_options[match].has_arg == optional_argument) { if (has_equal) optarg = has_equal; else optarg = nargv[optind++]; } if ((long_options[match].has_arg == required_argument) && (optarg == NULL)) { /* * Missing argument, leading : * indicates no error should be generated */ if ((opterr) && (*options != ':')) (void)fprintf(stderr, "%s: option requires an argument -- %s\n", __progname(nargv[0]), current_argv); return (BADARG); } } else { /* No matching argument */ if ((opterr) && (*options != ':')) (void)fprintf(stderr, "%s: illegal option -- %s\n", __progname(nargv[0]), current_argv); return (BADCH); } if (long_options[match].flag) { *long_options[match].flag = long_options[match].val; retval = 0; } else retval = long_options[match].val; if (index) *index = match; } return(retval); }
int xgetopt(int argc, const char* argv[], const struct xoption* options, int* optind, const char **optarg) { int i, val, match, name_len; const char *cur_argv, *embed_arg; if(argc < 1 || argv == NULL || options == NULL || optind == NULL || optarg == NULL) return -1; if(*optind < 1) *optind = 1; *optarg = NULL; if(*optind >= argc) return -1; match = -1; embed_arg = NULL; cur_argv = argv[(*optind)++]; if(*cur_argv == '-') { if(*(++cur_argv) != '-') { if(*(cur_argv + 1) != '\0') embed_arg = cur_argv + 1; for(i = 0; options[i].opt != 0 || options[i].name; ++i) { if(options[i].opt == 0) continue; if(*cur_argv == options[i].opt) { match = i; break; } } } else { ++cur_argv; if ((embed_arg = strchr(cur_argv, '=')) == NULL) name_len = strlen(cur_argv); else { name_len = embed_arg - cur_argv; ++embed_arg; } for(i = 0; options[i].opt != 0 || options[i].name; ++i) { if(strncmp(cur_argv, options[i].name, name_len)) continue; if(strlen(options[i].name) == name_len) { match = i; break; } } } } if(match == -1) { (void)fprintf(stderr, "%s: illegal option -- %s\n", __progname(argv[0]), cur_argv); return BADCH; } if(options[match].has_arg == xargument_optional || options[match].has_arg == xargument_required) { if(embed_arg) *optarg = embed_arg; else if(*optind < argc && argv[*optind][0] != '-') *optarg = argv[(*optind)++]; else if(options[match].has_arg == xargument_required) { (void)fprintf(stderr, "%s: option requires an argument -- %s\n", __progname(argv[0]), cur_argv); return BADARG; } } if(options[match].val == -1) val = (int)options[i].opt; else val = options[match].val; if(options[match].flag) { *options[match].flag = val; return 0; } return val; }