Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  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. /* last review : october 29th, 2002 */
  35.  
  36. #if defined(LIBC_SCCS) && !defined(lint)
  37. static char sccsid[] = "@(#)getopt.c    8.3 (Berkeley) 4/27/95";
  38. #endif                          /* LIBC_SCCS and not lint */
  39.  
  40. #include <stdio.h>
  41. #include <stdlib.h>
  42. #include <string.h>
  43.  
  44. int opterr = 1,                 /* if error message should be printed */
  45.  optind = 1,                    /* index into parent argv vector */
  46.  optopt,                                /* character checked for validity */
  47.  optreset;                              /* reset getopt */
  48. char *optarg;                   /* argument associated with option */
  49.  
  50. #define BADCH   (int)'?'
  51. #define BADARG  (int)':'
  52. #define EMSG    ""
  53.  
  54. /*
  55.  * getopt --
  56.  *      Parse argc/argv argument vector.
  57.  */
  58. int getopt(int nargc, char *const *nargv, const char *ostr) {
  59.        
  60.   #  define __progname nargv[0] /* program name */
  61.        
  62.   static char *place = EMSG;    /* option letter processing */
  63.   char *oli;                                    /* option letter list index */
  64.  
  65.   if (optreset || !*place) {    /* update scanning pointer */
  66.     optreset = 0;
  67.     if (optind >= nargc || *(place = nargv[optind]) != '-') {
  68.       place = EMSG;
  69.       return (-1);
  70.     }
  71.     if (place[1] && *++place == '-') {  /* found "--" */
  72.       ++optind;
  73.       place = EMSG;
  74.       return (-1);
  75.     }
  76.   }     /* option letter okay? */
  77.  
  78.   if ((optopt = (int) *place++) == (int) ':' || !(oli = strchr(ostr, optopt))) {
  79.     /* if the user didn't specify '-' as an option, assume it means -1. */
  80.     if (optopt == (int) '-')
  81.       return (-1);
  82.     if (!*place)
  83.       ++optind;
  84.     if (opterr && *ostr != ':')
  85.       (void) fprintf(stdout,"[ERROR] %s: illegal option -- %c\n", __progname, optopt);
  86.     return (BADCH);
  87.   }
  88.  
  89.   if (*++oli != ':') {          /* don't need argument */
  90.     optarg = NULL;
  91.     if (!*place)
  92.       ++optind;
  93.   } else {                                      /* need an argument */
  94.     if (*place)                                         /* no white space */
  95.       optarg = place;
  96.     else if (nargc <= ++optind) {       /* no arg */
  97.       place = EMSG;
  98.       if (*ostr == ':')
  99.                 return (BADARG);
  100.       if (opterr)
  101.                 (void) fprintf(stdout, "[ERROR] %s: option requires an argument -- %c\n", __progname, optopt);
  102.       return (BADCH);
  103.     } else                                                      /* white space */
  104.       optarg = nargv[optind];
  105.     place = EMSG;
  106.     ++optind;
  107.   }
  108.   return (optopt);              /* dump back option letter */
  109. }
  110.