/bin/pax/getoldopt.c
https://bitbucket.org/freebsd/freebsd-head/ · C · 73 lines · 51 code · 12 blank · 10 comment · 16 complexity · 5fcd6f0dd0d95d7d505c225f42c51ac4 MD5 · raw file
- /* $OpenBSD: getoldopt.c,v 1.9 2009/10/27 23:59:22 deraadt Exp $ */
- /* $NetBSD: getoldopt.c,v 1.3 1995/03/21 09:07:28 cgd Exp $ */
- /*-
- * Plug-compatible replacement for getopt() for parsing tar-like
- * arguments. If the first argument begins with "-", it uses getopt;
- * otherwise, it uses the old rules used by tar, dump, and ps.
- *
- * Written 25 August 1985 by John Gilmore (ihnp4!hoptoad!gnu) and placed
- * in the Public Domain for your edification and enjoyment.
- */
- #include <sys/cdefs.h>
- __FBSDID("$FreeBSD$");
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <stdio.h>
- #include <string.h>
- #include <unistd.h>
- #include "pax.h"
- #include "extern.h"
- int
- getoldopt(int argc, char **argv, const char *optstring)
- {
- static char *key; /* Points to next keyletter */
- static char use_getopt; /* !=0 if argv[1][0] was '-' */
- char c;
- char *place;
- optarg = NULL;
- if (key == NULL) { /* First time */
- if (argc < 2)
- return (-1);
- key = argv[1];
- if (*key == '-')
- use_getopt++;
- else
- optind = 2;
- }
- if (use_getopt)
- return (getopt(argc, argv, optstring));
- c = *key++;
- if (c == '\0') {
- key--;
- return (-1);
- }
- place = strchr(optstring, c);
- if (place == NULL || c == ':') {
- fprintf(stderr, "%s: unknown option %c\n", argv[0], c);
- return ('?');
- }
- place++;
- if (*place == ':') {
- if (optind < argc) {
- optarg = argv[optind];
- optind++;
- } else {
- fprintf(stderr, "%s: %c argument missing\n",
- argv[0], c);
- return ('?');
- }
- }
- return (c);
- }