~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Open Mash Cross Reference
mash/compat/getopt.c

Component: ~ [ mash ] ~ [ apps ] ~ [ gsm ] ~ [ lib ] ~ [ otcl ] ~ [ srm ] ~ [ tcl8.3 ] ~ [ tclcl ] ~ [ tk8.3 ] ~ [ tutorials ] ~

  1 /*
  2  * getopt.c --
  3  *
  4  *      Standard UNIX getopt function.  Code is from BSD.
  5  *
  6  * Copyright (c) 1987-2002 The Regents of the University of California.
  7  * All rights reserved.
  8  *
  9  * Redistribution and use in source and binary forms, with or without
 10  * modification, are permitted provided that the following conditions are met:
 11  *
 12  * A. Redistributions of source code must retain the above copyright notice,
 13  *    this list of conditions and the following disclaimer.
 14  * B. Redistributions in binary form must reproduce the above copyright notice,
 15  *    this list of conditions and the following disclaimer in the documentation
 16  *    and/or other materials provided with the distribution.
 17  * C. Neither the names of the copyright holders nor the names of its
 18  *    contributors may be used to endorse or promote products derived from this
 19  *    software without specific prior written permission.
 20  *
 21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
 22  * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 23  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 24  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
 25  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 31  * POSSIBILITY OF SUCH DAMAGE.
 32  */
 33 
 34 /* #if !defined(lint)
 35  * static char sccsid[] = "@(#)getopt.c 8.2 (Berkeley) 4/2/94";
 36  * #endif
 37  */
 38 
 39 #include <stdio.h>
 40 #include <stdlib.h>
 41 #include <string.h>
 42 
 43 /* declarations to provide consistent linkage */
 44 extern char *optarg;
 45 extern int optind;
 46 extern int opterr;
 47 
 48 int     opterr = 1,             /* if error message should be printed */
 49         optind = 1,             /* index into parent argv vector */
 50         optopt,                 /* character checked for validity */
 51         optreset;               /* reset getopt */
 52 char    *optarg;                /* argument associated with option */
 53 
 54 #define BADCH   (int)'?'
 55 #define BADARG  (int)':'
 56 #define EMSG    ""
 57 
 58 /*
 59  * getopt --
 60  *      Parse argc/argv argument vector.
 61  */
 62 int
 63 getopt(nargc, nargv, ostr)
 64         int nargc;
 65         char * const *nargv;
 66         const char *ostr;
 67 {
 68         static char *place = EMSG;              /* option letter processing */
 69         char *oli;                              /* option letter list index */
 70 
 71         if (optreset || !*place) {              /* update scanning pointer */
 72                 optreset = 0;
 73                 if (optind >= nargc || *(place = nargv[optind]) != '-') {
 74                         place = EMSG;
 75                         return (EOF);
 76                 }
 77                 if (place[1] && *++place == '-') {      /* found "--" */
 78                         ++optind;
 79                         place = EMSG;
 80                         return (EOF);
 81                 }
 82         }                                       /* option letter okay? */
 83         if ((optopt = (int)*place++) == (int)':' ||
 84             !(oli = strchr(ostr, optopt))) {
 85                 /*
 86                  * if the user didn't specify '-' as an option,
 87                  * assume it means EOF.
 88                  */
 89                 if (optopt == (int)'-')
 90                         return (EOF);
 91                 if (!*place)
 92                         ++optind;
 93                 if (opterr && *ostr != ':')
 94                         (void)fprintf(stderr,
 95                             "%s: illegal option -- %c\n", __FILE__, optopt);
 96                 return (BADCH);
 97         }
 98         if (*++oli != ':') {                    /* don't need argument */
 99                 optarg = NULL;
100                 if (!*place)
101                         ++optind;
102         }
103         else {                                  /* need an argument */
104                 if (*place)                     /* no white space */
105                         optarg = place;
106                 else if (nargc <= ++optind) {   /* no arg */
107                         place = EMSG;
108                         if (*ostr == ':')
109                                 return (BADARG);
110                         if (opterr)
111                                 (void)fprintf(stderr,
112                                     "%s: option requires an argument -- %c\n",
113                                     __FILE__, optopt);
114                         return (BADCH);
115                 }
116                 else                            /* white space */
117                         optarg = nargv[optind];
118                 place = EMSG;
119                 ++optind;
120         }
121         return (optopt);                        /* dump back option letter */
122 }
123 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.