File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / ntp / libntp / getopt.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue May 29 12:08:38 2012 UTC (12 years, 1 month ago) by misho
Branches: ntp, MAIN
CVS tags: v4_2_6p5p0, v4_2_6p5, HEAD
ntp 4.2.6p5

    1: /*
    2:  * getopt - get option letter from argv
    3:  *
    4:  * This is a version of the public domain getopt() implementation by
    5:  * Henry Spencer, changed for 4.3BSD compatibility (in addition to System V).
    6:  * It allows rescanning of an option list by setting optind to 0 before
    7:  * calling, which is why we use it even if the system has its own (in fact,
    8:  * this one has a unique name so as not to conflict with the system's).
    9:  * Thanks to Dennis Ferguson for the appropriate modifications.
   10:  *
   11:  * This file is in the Public Domain.
   12:  */
   13: 
   14: /*LINTLIBRARY*/
   15: 
   16: #include <stdio.h>
   17: 
   18: #include "ntp_stdlib.h"
   19: 
   20: #ifdef	lint
   21: #undef	putc
   22: #define	putc	fputc
   23: #endif	/* lint */
   24: 
   25: char	*ntp_optarg;	/* Global argument pointer. */
   26: int	ntp_optind = 0;	/* Global argv index. */
   27: int	ntp_opterr = 1;	/* for compatibility, should error be printed? */
   28: int	ntp_optopt;	/* for compatibility, option character checked */
   29: 
   30: static char	*scan = NULL;	/* Private scan pointer. */
   31: static const char	*prog = "amnesia";
   32: 
   33: /*
   34:  * Print message about a bad option.
   35:  */
   36: static int
   37: badopt(
   38: 	const char *mess,
   39: 	int ch
   40: 	)
   41: {
   42: 	if (ntp_opterr) {
   43: 		fputs(prog, stderr);
   44: 		fputs(mess, stderr);
   45: 		(void) putc(ch, stderr);
   46: 		(void) putc('\n', stderr);
   47: 	}
   48: 	return ('?');
   49: }
   50: 
   51: int
   52: ntp_getopt(
   53: 	int argc,
   54: 	char *argv[],
   55: 	const char *optstring
   56: 	)
   57: {
   58: 	register char c;
   59: 	register const char *place;
   60: 
   61: 	prog = argv[0];
   62: 	ntp_optarg = NULL;
   63: 
   64: 	if (ntp_optind == 0) {
   65: 		scan = NULL;
   66: 		ntp_optind++;
   67: 	}
   68: 	
   69: 	if (scan == NULL || *scan == '\0') {
   70: 		if (ntp_optind >= argc
   71: 		    || argv[ntp_optind][0] != '-'
   72: 		    || argv[ntp_optind][1] == '\0') {
   73: 			return (EOF);
   74: 		}
   75: 		if (argv[ntp_optind][1] == '-'
   76: 		    && argv[ntp_optind][2] == '\0') {
   77: 			ntp_optind++;
   78: 			return (EOF);
   79: 		}
   80: 	
   81: 		scan = argv[ntp_optind++]+1;
   82: 	}
   83: 
   84: 	c = *scan++;
   85: 	ntp_optopt = c & 0377;
   86: 	for (place = optstring; place != NULL && *place != '\0'; ++place)
   87: 	    if (*place == c)
   88: 		break;
   89: 
   90: 	if (place == NULL || *place == '\0' || c == ':' || c == '?') {
   91: 		return (badopt(": unknown option -", c));
   92: 	}
   93: 
   94: 	place++;
   95: 	if (*place == ':') {
   96: 		if (*scan != '\0') {
   97: 			ntp_optarg = scan;
   98: 			scan = NULL;
   99: 		} else if (ntp_optind >= argc) {
  100: 			return (badopt(": option requires argument -", c));
  101: 		} else {
  102: 			ntp_optarg = argv[ntp_optind++];
  103: 		}
  104: 	}
  105: 
  106: 	return (c & 0377);
  107: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>