Annotation of embedaddon/ntp/lib/isc/commandline.c, revision 1.1
1.1 ! misho 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.22 2008/09/25 04:02:39 tbox 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>