www.pudn.com > minix.instalation.cd-rom-2.0.rar > GETOPT.C


/*  
 *  $Header$  
 *  
 *  Copyright (C) 1994 Arno Schaefer  
 *  
 *  AU: Auswertung der Kommandozeile, der POSIX-Version von getopt ()  
 *	nachempfunden.  
 *  
 *  PO: ANSI C  
 */  
  
#include   
#include   
  
#include "getopt.h"  
  
  
/* Globale Variablen */  
  
char *optarg;  
int optind = 1;  
int opterr = 1;  
int optopt;  
  
static char *nextarg = NULL;  
  
  
/* Funktion */  
  
int getopt (int argc, char *argv[], char *optstring)  
  
/*  
 *  AU: Auswertung der Kommandozeile  
 *  
 *  VB: argc und argv sind die Parameter, die an main () uebergeben werden.  
 *	optstring ist ein String, der die Zeichen enthaelt, die als  
 *	Optionen erkannt werden. Wenn ein Zeichen von einem Doppelpunkt  
 *	gefolgt wird, hat die Option ein Argument, das direkt auf das Zeichen  
 *	folgt oder durch Space davon getrennt ist. Gueltige Optionszeichen  
 *	sind alle druckbaren Zeichen ausser '?', ' ' und ':'.  
 *  
 *	optind ist der Index auf das naechste Element von argv[], das  
 *	bearbeitet wird.  
 *  
 *	opterr ist ein Flag, das festlegt, ob bei Fehlern Fehlermeldungen  
 *	ausgegeben werden.  
 *  
 *	optarg ist ein Zeiger auf das Argument, wenn eine Option ein  
 *	Argument hat.  
 *  
 *	optopt enthaelt bei Fehlern das Optionszeichen, das den Fehler aus-  
 *	geloest hat.  
 *  
 *  NB: Rueckgabewert ist das jeweils naechste Optionszeichen, oder -1 am  
 *	Ende der Optionsliste.  
 *  
 *	Die Optionsliste ist zu Ende, wenn argv[optind] NULL ist, oder  
 *	argv[optind] nicht mit '-' (oder '/') beginnt, oder argv[optind]  
 *	ein einzelnes "-" ist. In diesem Fall wird optind nicht erhoeht.  
 *	Das Ende der Optionsliste kann mit "--" erzwungen werden, dann ist  
 *	argv[optind] das erste Argument nach "--".  
 *  
 *  FB: Ein '?' wird zurueckgegeben, wenn ein Optionszeichen nicht in  
 *	optstring enthalten war oder ein ungueltiges Optionszeichen  
 *	uebergeben wurde ('?' oder ':'). Ausserdem bei einem fehlenden  
 *	Argument, wenn das erste Zeichen von optstring kein ':' ist.  
 *  
 *	Ein ':' wird zurueckgegeben bei einem fehlenden Argument, wenn  
 *	das erste Zeichen von optstring ein ':' ist.  
 */  
  
{  
	char *search;  
  
	optarg = NULL;  
	  
	if (nextarg == NULL)  
	{  
		nextarg = argv[optind];  
  
		if (nextarg == NULL)  
		{  
			return (-1);  
		}  
  
#ifdef __MSDOS__  
		if (*nextarg != '-' && *nextarg != '/')  
#else  
		if (*nextarg != '-')  
#endif  
		{  
			return (-1);  
		}  
  
		nextarg++;  
  
	} /* if */  
  
	optopt = *nextarg++;  
  
	if (optopt == 0)  
	{  
		return (-1);  
	}  
  
	optind++;  
  
	if (optopt == '-' && *nextarg == 0)  
	{  
		return (-1);  
	}  
  
	if (optopt == ':' || optopt == '?')  
	{  
		if (opterr)  
		{  
			fprintf  
			(  
				stderr,  
				"%s: illegal option -- %c\n",  
				argv[0],  
				optopt  
			);  
		}  
  
		return ('?');  
  
	} /* if */  
  
	search = strchr (optstring, optopt);  
  
	if (search == NULL)  
	{  
		if (opterr)  
		{  
			fprintf  
			(  
				stderr,  
				"%s: illegal option -- %c\n",  
				argv[0],  
				optopt  
			);  
		}  
  
		return ('?');  
  
	} /* if */  
  
	if (*nextarg == 0)  
	{  
		nextarg = NULL;  
	}  
  
	if (search[1] != ':')  
	{  
		if (nextarg != NULL)  
		{  
			optind--;  
		}  
  
		return (optopt);  
	}  
  
	if (nextarg != NULL)  
	{  
		optarg = nextarg;  
		nextarg = NULL;  
		return (optopt);  
	}  
  
	optarg = argv[optind];  
  
	if (optind == argc)  
	{  
		if (opterr)  
		{  
			fprintf  
			(  
				stderr,  
				"%s: option requires an argument -- %c\n",  
				argv[0],  
				optopt  
			);  
  
		} /* if */  
  
		if (optstring[0] == ':')  
		{  
			return (':');  
		}  
		else  
		{  
			return ('?');  
		}  
  
	} /* if */  
  
	else  
	{  
		optind++;  
	}  
  
	return (optopt);  
  
} /* getopt () */