⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 getopt.c

📁 Unix操作系统minix 2.0源码
💻 C
字号:
/*

 *  $Header$

 *

 *  Copyright (C) 1994 Arno Schaefer

 *

 *  AU: Auswertung der Kommandozeile, der POSIX-Version von getopt ()

 *	nachempfunden.

 *

 *  PO: ANSI C

 */



#include <stdio.h>

#include <string.h>



#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 () */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -