File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / ntp / lib / isc / commandline.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, 7 months ago) by misho
Branches: ntp, MAIN
CVS tags: v4_2_6p5p0, v4_2_6p5, HEAD
ntp 4.2.6p5

    1: /*
    2:  * Portions Copyright (C) 2004, 2005, 2007, 2008  Internet Systems Consortium, Inc. ("ISC")
    3:  * Portions Copyright (C) 1999-2001  Internet Software Consortium.
    4:  *
    5:  * Permission to use, copy, modify, and/or distribute this software for any
    6:  * purpose with or without fee is hereby granted, provided that the above
    7:  * copyright notice and this permission notice appear in all copies.
    8:  *
    9:  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
   10:  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
   11:  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
   12:  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
   13:  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
   14:  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
   15:  * PERFORMANCE OF THIS SOFTWARE.
   16:  */
   17: 
   18: /*
   19:  * Copyright (c) 1987, 1993, 1994
   20:  *	The Regents of the University of California.  All rights reserved.
   21:  *
   22:  * Redistribution and use in source and binary forms, with or without
   23:  * modification, are permitted provided that the following conditions
   24:  * are met:
   25:  * 1. Redistributions of source code must retain the above copyright
   26:  *    notice, this list of conditions and the following disclaimer.
   27:  * 2. Redistributions in binary form must reproduce the above copyright
   28:  *    notice, this list of conditions and the following disclaimer in the
   29:  *    documentation and/or other materials provided with the distribution.
   30:  * 3. All advertising materials mentioning features or use of this software
   31:  *    must display the following acknowledgement:
   32:  *	This product includes software developed by the University of
   33:  *	California, Berkeley and its contributors.
   34:  * 4. Neither the name of the University nor the names of its contributors
   35:  *    may be used to endorse or promote products derived from this software
   36:  *    without specific prior written permission.
   37:  *
   38:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   39:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   40:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   41:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   42:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   43:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   44:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   45:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   46:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   47:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   48:  * SUCH DAMAGE.
   49:  */
   50: 
   51: /* $Id: commandline.c,v 1.1.1.1 2012/05/29 12:08:38 misho Exp $ */
   52: 
   53: /*! \file
   54:  * This file was adapted from the NetBSD project's source tree, RCS ID:
   55:  *    NetBSD: getopt.c,v 1.15 1999/09/20 04:39:37 lukem Exp
   56:  *
   57:  * The primary change has been to rename items to the ISC namespace
   58:  * and format in the ISC coding style.
   59:  */
   60: 
   61: /*
   62:  * \author Principal Authors: Computer Systems Research Group at UC Berkeley
   63:  * \author Principal ISC caretaker: DCL
   64:  */
   65: 
   66: #include <config.h>
   67: 
   68: #include <stdio.h>
   69: 
   70: #include <isc/commandline.h>
   71: #include <isc/msgs.h>
   72: #include <isc/string.h>
   73: #include <isc/util.h>
   74: 
   75: /*% Index into parent argv vector. */
   76: LIBISC_EXTERNAL_DATA int isc_commandline_index = 1;
   77: /*% Character checked for validity. */
   78: LIBISC_EXTERNAL_DATA int isc_commandline_option;
   79: /*% Argument associated with option. */
   80: LIBISC_EXTERNAL_DATA char *isc_commandline_argument;
   81: /*% For printing error messages. */
   82: LIBISC_EXTERNAL_DATA char *isc_commandline_progname;
   83: /*% Print error messages. */
   84: LIBISC_EXTERNAL_DATA isc_boolean_t isc_commandline_errprint = ISC_TRUE;
   85: /*% Reset processing. */
   86: LIBISC_EXTERNAL_DATA isc_boolean_t isc_commandline_reset = ISC_TRUE;
   87: 
   88: static char endopt = '\0';
   89: 
   90: #define	BADOPT	'?'
   91: #define	BADARG	':'
   92: #define ENDOPT  &endopt
   93: 
   94: /*!
   95:  * getopt --
   96:  *	Parse argc/argv argument vector.
   97:  */
   98: int
   99: isc_commandline_parse(int argc, char * const *argv, const char *options) {
  100: 	static char *place = ENDOPT;
  101: 	char *option;			/* Index into *options of option. */
  102: 
  103: 	REQUIRE(argc >= 0 && argv != NULL && options != NULL);
  104: 
  105: 	/*
  106: 	 * Update scanning pointer, either because a reset was requested or
  107: 	 * the previous argv was finished.
  108: 	 */
  109: 	if (isc_commandline_reset || *place == '\0') {
  110: 		if (isc_commandline_reset) {
  111: 			isc_commandline_index = 1;
  112: 			isc_commandline_reset = ISC_FALSE;
  113: 		}
  114: 
  115: 		if (isc_commandline_progname == NULL)
  116: 			isc_commandline_progname = argv[0];
  117: 
  118: 		if (isc_commandline_index >= argc ||
  119: 		    *(place = argv[isc_commandline_index]) != '-') {
  120: 			/*
  121: 			 * Index out of range or points to non-option.
  122: 			 */
  123: 			place = ENDOPT;
  124: 			return (-1);
  125: 		}
  126: 
  127: 		if (place[1] != '\0' && *++place == '-' && place[1] == '\0') {
  128: 			/*
  129: 			 * Found '--' to signal end of options.  Advance
  130: 			 * index to next argv, the first non-option.
  131: 			 */
  132: 			isc_commandline_index++;
  133: 			place = ENDOPT;
  134: 			return (-1);
  135: 		}
  136: 	}
  137: 
  138: 	isc_commandline_option = *place++;
  139: 	option = strchr(options, isc_commandline_option);
  140: 
  141: 	/*
  142: 	 * Ensure valid option has been passed as specified by options string.
  143: 	 * '-:' is never a valid command line option because it could not
  144: 	 * distinguish ':' from the argument specifier in the options string.
  145: 	 */
  146: 	if (isc_commandline_option == ':' || option == NULL) {
  147: 		if (*place == '\0')
  148: 			isc_commandline_index++;
  149: 
  150: 		if (isc_commandline_errprint && *options != ':')
  151: 			fprintf(stderr, "%s: %s -- %c\n",
  152: 				isc_commandline_progname,
  153: 				isc_msgcat_get(isc_msgcat,
  154: 					       ISC_MSGSET_COMMANDLINE,
  155: 					       ISC_MSG_ILLEGALOPT,
  156: 					       "illegal option"),
  157: 				isc_commandline_option);
  158: 
  159: 		return (BADOPT);
  160: 	}
  161: 
  162: 	if (*++option != ':') {
  163: 		/*
  164: 		 * Option does not take an argument.
  165: 		 */
  166: 		isc_commandline_argument = NULL;
  167: 
  168: 		/*
  169: 		 * Skip to next argv if at the end of the current argv.
  170: 		 */
  171: 		if (*place == '\0')
  172: 			++isc_commandline_index;
  173: 
  174: 	} else {
  175: 		/*
  176: 		 * Option needs an argument.
  177: 		 */
  178: 		if (*place != '\0')
  179: 			/*
  180: 			 * Option is in this argv, -D1 style.
  181: 			 */
  182: 			isc_commandline_argument = place;
  183: 
  184: 		else if (argc > ++isc_commandline_index)
  185: 			/*
  186: 			 * Option is next argv, -D 1 style.
  187: 			 */
  188: 			isc_commandline_argument = argv[isc_commandline_index];
  189: 
  190: 		else {
  191: 			/*
  192: 			 * Argument needed, but no more argv.
  193: 			 */
  194: 			place = ENDOPT;
  195: 
  196: 			/*
  197: 			 * Silent failure with "missing argument" return
  198: 			 * when ':' starts options string, per historical spec.
  199: 			 */
  200: 			if (*options == ':')
  201: 				return (BADARG);
  202: 
  203: 			if (isc_commandline_errprint)
  204: 				fprintf(stderr, "%s: %s -- %c\n",
  205: 					isc_commandline_progname,
  206: 					isc_msgcat_get(isc_msgcat,
  207: 						       ISC_MSGSET_COMMANDLINE,
  208: 						       ISC_MSG_OPTNEEDARG,
  209: 						       "option requires "
  210: 						       "an argument"),
  211: 					isc_commandline_option);
  212: 
  213: 			return (BADOPT);
  214: 		}
  215: 
  216: 		place = ENDOPT;
  217: 
  218: 		/*
  219: 		 * Point to argv that follows argument.
  220: 		 */
  221: 		isc_commandline_index++;
  222: 	}
  223: 
  224: 	return (isc_commandline_option);
  225: }

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