1205942Sdelphij/*	$OpenBSD: getoldopt.c,v 1.9 2009/10/27 23:59:22 deraadt Exp $	*/
276351Skris/*	$NetBSD: getoldopt.c,v 1.3 1995/03/21 09:07:28 cgd Exp $	*/
376351Skris
4139969Simp/*-
576351Skris * Plug-compatible replacement for getopt() for parsing tar-like
676351Skris * arguments.  If the first argument begins with "-", it uses getopt;
776351Skris * otherwise, it uses the old rules used by tar, dump, and ps.
876351Skris *
976351Skris * Written 25 August 1985 by John Gilmore (ihnp4!hoptoad!gnu) and placed
10205942Sdelphij * in the Public Domain for your edification and enjoyment.
1176351Skris */
1276351Skris
1399110Sobrien#include <sys/cdefs.h>
1499110Sobrien__FBSDID("$FreeBSD$");
1576351Skris
16114583Smarkm#include <sys/types.h>
17114583Smarkm#include <sys/stat.h>
1876351Skris#include <stdio.h>
1976351Skris#include <string.h>
2076351Skris#include <unistd.h>
2176351Skris
22283257Sdelphijint getoldopt(int, char **, const char *);
23114583Smarkm
2476351Skrisint
25114583Smarkmgetoldopt(int argc, char **argv, const char *optstring)
2676351Skris{
2776351Skris	static char	*key;		/* Points to next keyletter */
2876351Skris	static char	use_getopt;	/* !=0 if argv[1][0] was '-' */
2976351Skris	char		c;
3076351Skris	char		*place;
3176351Skris
3276351Skris	optarg = NULL;
3376351Skris
3476351Skris	if (key == NULL) {		/* First time */
35205942Sdelphij		if (argc < 2)
36205942Sdelphij			return (-1);
3776351Skris		key = argv[1];
3876351Skris		if (*key == '-')
3976351Skris			use_getopt++;
4076351Skris		else
4176351Skris			optind = 2;
4276351Skris	}
4376351Skris
4476351Skris	if (use_getopt)
45205942Sdelphij		return (getopt(argc, argv, optstring));
4676351Skris
4776351Skris	c = *key++;
4876351Skris	if (c == '\0') {
4976351Skris		key--;
50205942Sdelphij		return (-1);
5176351Skris	}
5276351Skris	place = strchr(optstring, c);
5376351Skris
5476351Skris	if (place == NULL || c == ':') {
5576351Skris		fprintf(stderr, "%s: unknown option %c\n", argv[0], c);
56205942Sdelphij		return ('?');
5776351Skris	}
5876351Skris
5976351Skris	place++;
6076351Skris	if (*place == ':') {
6176351Skris		if (optind < argc) {
6276351Skris			optarg = argv[optind];
6376351Skris			optind++;
6476351Skris		} else {
6576351Skris			fprintf(stderr, "%s: %c argument missing\n",
6676351Skris				argv[0], c);
67205942Sdelphij			return ('?');
6876351Skris		}
6976351Skris	}
7076351Skris
71205942Sdelphij	return (c);
7276351Skris}
73