1 | /* 2 | * Copyright (c) 1987, 1993, 1994 3 | * The Regents of the University of California. All rights reserved. 4 | * 5 | * Redistribution and use in source and binary forms, with or without 6 | * modification, are permitted provided that the following conditions 7 | * are met: 8 | * 1. Redistributions of source code must retain the above copyright 9 | * notice, this list of conditions and the following disclaimer. 10 | * 2. Redistributions in binary form must reproduce the above copyright 11 | * notice, this list of conditions and the following disclaimer in the 12 | * documentation and/or other materials provided with the distribution. 13 | * 3. All advertising materials mentioning features or use of this software 14 | * must display the following acknowledgement: 15 | * This product includes software developed by the University of 16 | * California, Berkeley and its contributors. 17 | * 4. Neither the name of the University nor the names of its contributors 18 | * may be used to endorse or promote products derived from this software 19 | * without specific prior written permission. 20 | * 21 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 | * SUCH DAMAGE. 32 | */ 33 | 34 | /* This code has been modified from the original UC version by 35 | Marek Bukowy, RIPE NCC 36 | to be thread-safe 37 | */ 38 | 39 | #include <stdio.h> 40 | #include <stdlib.h> 41 | #include <string.h> 42 | 43 | #include "getopt.h" 44 | 45 | getopt_state_t * 46 | mg_new(int optind) 47 | { 48 | getopt_state_t *state; 49 | 50 | if( (state=calloc(1, sizeof(getopt_state_t))) != NULL ) { 51 | state->place = EMSG; 52 | state->optind = optind; 53 | state->optreset = 1; 54 | } 55 | return state; 56 | } 57 | 58 | 59 | /* 60 | * getopt -- 61 | * Parse argc/argv argument vector. 62 | */ 63 | int 64 | mg_getopt( int nargc, 65 | char * const *nargv, 66 | const char *ostr, 67 | getopt_state_t *state) 68 | { 69 | char *oli; /* option letter list index */ 70 | 71 | if (state->optreset || !*state->place) { /* update scanning pointer */ 72 | state->optreset = 0; 73 | if (state->optind >= nargc || *(state->place = nargv[state->optind]) != '-') { 74 | state->place = EMSG; 75 | return (-1); 76 | } 77 | if (state->place[1] && *++(state->place) == '-') { /* found "--" */ 78 | ++state->optind; 79 | state->place = EMSG; 80 | return (-1); 81 | } 82 | } /* option letter okay? */ 83 | if ((optopt = (int)*state->place++) == (int)':' || 84 | !(oli = strchr(ostr, optopt))) { 85 | /* 86 | * if the user didn't specify '-' as an option, 87 | * assume it means -1. 88 | */ 89 | if (optopt == (int)'-') 90 | return (-1); 91 | if (!*state->place) 92 | ++state->optind; 93 | return (BADCH); 94 | } 95 | if (*++oli != ':') { /* don't need argument */ 96 | state->optarg = NULL; 97 | if (!*state->place) 98 | ++state->optind; 99 | } 100 | else { /* need an argument */ 101 | if (*state->place) /* no white space */ 102 | state->optarg = state->place; 103 | else if (nargc <= ++state->optind) { /* no arg */ 104 | state->place = EMSG; 105 | if (*ostr == ':') 106 | return (BADARG); 107 | 108 | return (BADCH); 109 | } 110 | else /* white space */ 111 | state->optarg = nargv[state->optind]; 112 | state->place = EMSG; 113 | ++state->optind; 114 | } 115 | return (optopt); /* dump back option letter */ 116 | }