getoldopt.c revision 139969
176351Skris/*	$OpenBSD: getoldopt.c,v 1.4 2000/01/22 20:24:51 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
1076351Skris * in the Pubic Domain for your edification and enjoyment.
1176351Skris */
1276351Skris
1399110Sobrien#include <sys/cdefs.h>
1499110Sobrien__FBSDID("$FreeBSD: head/bin/pax/getoldopt.c 139969 2005-01-10 08:39:26Z imp $");
1576351Skris
16114583Smarkm#include <sys/types.h>
17114583Smarkm#include <sys/stat.h>
1876351Skris#include <stdio.h>
1976351Skris#include <string.h>
2076351Skris#include <unistd.h>
2176351Skris
22114583Smarkm#include "pax.h"
23114583Smarkm#include "extern.h"
24114583Smarkm
2576351Skrisint
26114583Smarkmgetoldopt(int argc, char **argv, const char *optstring)
2776351Skris{
2876351Skris	static char	*key;		/* Points to next keyletter */
2976351Skris	static char	use_getopt;	/* !=0 if argv[1][0] was '-' */
3076351Skris	char		c;
3176351Skris	char		*place;
3276351Skris
3376351Skris	optarg = NULL;
3476351Skris
3576351Skris	if (key == NULL) {		/* First time */
3676351Skris		if (argc < 2) return EOF;
3776351Skris		key = argv[1];
3876351Skris		if (*key == '-')
3976351Skris			use_getopt++;
4076351Skris		else
4176351Skris			optind = 2;
4276351Skris	}
4376351Skris
4476351Skris	if (use_getopt)
4576351Skris		return getopt(argc, argv, optstring);
4676351Skris
4776351Skris	c = *key++;
4876351Skris	if (c == '\0') {
4976351Skris		key--;
5076351Skris		return EOF;
5176351Skris	}
5276351Skris	place = strchr(optstring, c);
5376351Skris
5476351Skris	if (place == NULL || c == ':') {
5576351Skris		fprintf(stderr, "%s: unknown option %c\n", argv[0], c);
5676351Skris		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);
6776351Skris			return('?');
6876351Skris		}
6976351Skris	}
7076351Skris
7176351Skris	return(c);
7276351Skris}
73