getoldopt.c revision 90110
1156066Sharti/*	$OpenBSD: getoldopt.c,v 1.4 2000/01/22 20:24:51 deraadt Exp $	*/
2156066Sharti/*	$NetBSD: getoldopt.c,v 1.3 1995/03/21 09:07:28 cgd Exp $	*/
3156066Sharti
4156066Sharti/*
5156066Sharti * Plug-compatible replacement for getopt() for parsing tar-like
6156066Sharti * arguments.  If the first argument begins with "-", it uses getopt;
7310903Sngie * otherwise, it uses the old rules used by tar, dump, and ps.
8156066Sharti *
9156066Sharti * Written 25 August 1985 by John Gilmore (ihnp4!hoptoad!gnu) and placed
10156066Sharti * in the Pubic Domain for your edification and enjoyment.
11156066Sharti */
12156066Sharti
13156066Sharti#ifndef lint
14156066Shartistatic const char rcsid[] = "$FreeBSD: head/bin/pax/getoldopt.c 90110 2002-02-02 06:48:10Z imp $";
15156066Sharti#endif /* not lint */
16310903Sngie
17156066Sharti#include <stdio.h>
18156066Sharti#include <string.h>
19156066Sharti#include <unistd.h>
20156066Sharti
21156066Shartiint
22156066Shartigetoldopt(int argc, char **argv, char *optstring)
23156066Sharti{
24156066Sharti	static char	*key;		/* Points to next keyletter */
25156066Sharti	static char	use_getopt;	/* !=0 if argv[1][0] was '-' */
26156066Sharti	char		c;
27156066Sharti	char		*place;
28156066Sharti
29156066Sharti	optarg = NULL;
30156066Sharti
31156066Sharti	if (key == NULL) {		/* First time */
32156066Sharti		if (argc < 2) return EOF;
33156066Sharti		key = argv[1];
34156066Sharti		if (*key == '-')
35156066Sharti			use_getopt++;
36156066Sharti		else
37156066Sharti			optind = 2;
38156066Sharti	}
39156066Sharti
40311725Sngie	if (use_getopt)
41156066Sharti		return getopt(argc, argv, optstring);
42156066Sharti
43156066Sharti	c = *key++;
44156066Sharti	if (c == '\0') {
45156066Sharti		key--;
46156066Sharti		return EOF;
47156066Sharti	}
48156066Sharti	place = strchr(optstring, c);
49156066Sharti
50156066Sharti	if (place == NULL || c == ':') {
51156066Sharti		fprintf(stderr, "%s: unknown option %c\n", argv[0], c);
52156066Sharti		return('?');
53156066Sharti	}
54156066Sharti
55156066Sharti	place++;
56156066Sharti	if (*place == ':') {
57156066Sharti		if (optind < argc) {
58156066Sharti			optarg = argv[optind];
59156066Sharti			optind++;
60156066Sharti		} else {
61156066Sharti			fprintf(stderr, "%s: %c argument missing\n",
62200063Ssyrinx				argv[0], c);
63200063Ssyrinx			return('?');
64200063Ssyrinx		}
65200063Ssyrinx	}
66200063Ssyrinx
67156066Sharti	return(c);
68156066Sharti}
69156066Sharti