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