diff options
Diffstat (limited to 'src/library/getopt.c')
-rw-r--r-- | src/library/getopt.c | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/src/library/getopt.c b/src/library/getopt.c new file mode 100644 index 0000000..fb8410e --- /dev/null +++ b/src/library/getopt.c @@ -0,0 +1,115 @@ +/* + * Small reimplementation of getopt(). + * + * Copyright 2012 Andrew Wood, distributed under the Artistic License 2.0. + */ + +#include "config.h" +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#ifndef HAVE_GETOPT + +char *minioptarg = NULL; +int minioptind = 0; +int miniopterr = 1; +int minioptopt = 0; + + +/* + * Minimalist getopt() clone, which handles short options only and doesn't + * permute argv[]. + */ +int minigetopt(int argc, char **argv, char *optstring) +{ + static int nextchar = 0; + int optchar; + int i; + + if ((minioptind == 0) && (argc > 0)) + minioptind++; + + if ((nextchar > 0) && (argv[minioptind][nextchar] == 0)) { + minioptind++; + nextchar = 0; + } + + if (minioptind >= argc) + return -1; + + /* + * End of options if arg doesn't start with "-" + */ + if (argv[minioptind][0] != '-') + return -1; + + /* + * End of options if arg is just "-" + */ + if (argv[minioptind][1] == 0) + return -1; + + /* + * End of options if arg is "--", but don't include the "--" in the + * non-option arguments + */ + if ((argv[minioptind][1] == '-') && (argv[minioptind][2] == 0)) { + minioptind++; + return -1; + } + + if (nextchar == 0) + nextchar = 1; + + optchar = argv[minioptind][nextchar++]; + + for (i = 0; optstring[i] != 0 && optstring[i] != optchar; i++) { + } + + if (optstring[i] == 0) { + minioptopt = optchar; + if (miniopterr) + fprintf(stderr, "%s: invalid option -- %c\n", + argv[0], optchar); + return '?'; + } + + if (optstring[i + 1] != ':') { + minioptarg = NULL; + return optchar; + } + + /* + * At this point we've got an option that takes an argument. + */ + + /* + * Next character isn't 0, so the argument is within this array + * element (i.e. "-dFOO"). + */ + if (argv[minioptind][nextchar] != 0) { + minioptarg = &(argv[minioptind][nextchar]); + nextchar = 0; + minioptind++; + return optchar; + } + + /* + * Argument is in the next array element (i.e. "-d FOO"). + */ + nextchar = 0; + minioptind++; + if (minioptind >= argc) { + fprintf(stderr, "%s: option `-%c' requires an argument\n", + argv[0], optchar); + return ':'; + } + minioptarg = argv[minioptind++]; + + return optchar; +} + +#endif /* HAVE_GETOPT */ + +/* EOF */ |