/* * Copyright (c) 2003-2007 Jim Paris * * This is free software; you can redistribute it and/or modify it and * it is provided under the terms of version 2 of the GNU General Public * License as published by the Free Software Foundation; see COPYING. */ #include #include #include #include "opt.h" void opt_init(int *optind) { *optind = 0; } char opt_parse(int argc, char **argv, int *optind, char **optarg, struct options *opt) { char c; int i; (*optind)++; if (*optind >= argc) return 0; if (argv[*optind][0] == '-' && argv[*optind][1] != '-' && argv[*optind][1] != 0) { /* Short option (or a bunch of 'em) */ /* Save this and shift others over */ c = argv[*optind][1]; for (i = 2; argv[*optind][i] != 0; i++) argv[*optind][i - 1] = argv[*optind][i]; argv[*optind][i - 1] = 0; if (argv[*optind][1] != 0) (*optind)--; /* Now find it */ for (i = 0; opt[i].shortopt != 0; i++) if (opt[i].shortopt == c) break; if (opt[i].shortopt == 0) { fprintf(stderr, "Error: unknown option '-%c'\n", c); return '?'; } if (opt[i].arg == NULL) return c; (*optind)++; if (*optind >= argc || (argv[*optind][0] == '-' && argv[*optind][1] != 0)) { fprintf(stderr, "Error: option '-%c' requires an " "argument\n", c); return '?'; } (*optarg) = argv[*optind]; return c; } else if (argv[*optind][0] == '-' && argv[*optind][1] == '-' && argv[*optind][2] != 0) { /* Long option */ for (i = 0; (c = opt[i].shortopt) != 0; i++) if (strcmp(opt[i].longopt, argv[*optind] + 2) == 0) break; if (opt[i].shortopt == 0) { fprintf(stderr, "Error: unknown option '%s'\n", argv[*optind]); return '?'; } if (opt[i].arg == NULL) return c; (*optind)++; if (*optind >= argc || (argv[*optind][0] == '-' && argv[*optind][1] != 0)) { fprintf(stderr, "Error: option '%s' requires an " "argument\n", argv[*optind - 1]); return '?'; } (*optarg) = argv[*optind]; return c; } else { /* End of options */ return 0; } } void opt_help(struct options *opt, FILE * out) { int i; int printed; for (i = 0; opt[i].shortopt != 0; i++) { fprintf(out, " -%c, --%s%n", opt[i].shortopt, opt[i].longopt, &printed); fprintf(out, " %-*s%s\n", 30 - printed, opt[i].arg ? opt[i].arg : "", opt[i].help); } }