Main Page | Modules | Data Structures | File List | Data Fields | Globals | Related Pages

# utils.c

Go to the documentation of this file.

    00001 /*
    00002  * Copyright (c) 1987, 1993, 1994
    00003  *      The Regents of the University of California.  All rights reserved.
    00004  *
    00005  * Redistribution and use in source and binary forms, with or without
    00006  * modification, are permitted provided that the following conditions
    00007  * are met:
    00008  * 1. Redistributions of source code must retain the above copyright
    00009  *    notice, this list of conditions and the following disclaimer.
    00010  * 2. Redistributions in binary form must reproduce the above copyright
    00011  *    notice, this list of conditions and the following disclaimer in the
    00012  *    documentation and/or other materials provided with the distribution.
    00013  * 3. All advertising materials mentioning features or use of this software
    00014  *    must display the following acknowledgement:
    00015  *      This product includes software developed by the University of
    00016  *      California, Berkeley and its contributors.
    00017  * 4. Neither the name of the University nor the names of its contributors
    00018  *    may be used to endorse or promote products derived from this software
    00019  *    without specific prior written permission.
    00020  *
    00021  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
    00022  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    00023  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    00024  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
    00025  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    00026  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    00027  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    00028  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    00029  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    00030  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    00031  * SUCH DAMAGE.
    00032  */
    00033
    00034 // getopt() is not present in Win32
    00035
    00036 #ifdef WIN32
    00037 #include <stdio.h>
    00038 #include <string.h>             // for getc()
    00039
    00040 int     opterr = 1,             /* if error message should be printed */
    00041         optind = 1,             /* index into parent argv vector */
    00042         optopt,                 /* character checked for validity */
    00043         optreset;               /* reset getopt */
    00044 char    *optarg;                /* argument associated with option */
    00045
    00046 #define BADCH   (int)'?'
    00047 #define BADARG  (int)':'
    00048 #define EMSG    ""
    00049
    00050 #ifdef WIN32
    00051 char *__progname = "rpcapd";
    00052 #endif
    00053
    00054 /*
    00055  * getopt --
    00056  *      Parse argc/argv argument vector.
    00057  */
    00058 int
    00059 getopt(nargc, nargv, ostr)
    00060         int nargc;
    00061         char * const *nargv;
    00062         const char *ostr;
    00063 {
    00064 // WIN32        extern char *__progname;
    00065         static char *place = EMSG;              /* option letter processing */
    00066         char *oli;                              /* option letter list index */
    00067         int ret;
    00068
    00069         if (optreset || !*place) {              /* update scanning pointer */
    00070                 optreset = 0;
    00071                 if (optind >= nargc || *(place = nargv[optind]) != '-') {
    00072                         place = EMSG;
    00073                         return (-1);
    00074                 }
    00075                 if (place[1] && *++place == '-') {      /* found "--" */
    00076                         ++optind;
    00077                         place = EMSG;
    00078                         return (-1);
    00079                 }
    00080         }                                       /* option letter okay? */
    00081         if ((optopt = (int)*place++) == (int)':' ||
    00082             !(oli = strchr(ostr, optopt))) {
    00083                 /*
    00084                  * if the user didn't specify '-' as an option,
    00085                  * assume it means -1.
    00086                  */
    00087                 if (optopt == (int)'-')
    00088                         return (-1);
    00089                 if (!*place)
    00090                         ++optind;
    00091                 if (opterr && *ostr != ':' && optopt != BADCH)
    00092                         (void)fprintf(stderr,
    00093                             "%s: illegal option -- %c\n", __progname, optopt);
    00094                 return (BADCH);
    00095         }
    00096         if (*++oli != ':') {                    /* don't need argument */
    00097                 optarg = NULL;
    00098                 if (!*place)
    00099                         ++optind;
    00100         }
    00101         else {                                  /* need an argument */
    00102                 if (*place)                     /* no white space */
    00103                         optarg = place;
    00104                 else if (nargc <= ++optind) {   /* no arg */
    00105                         place = EMSG;
    00106                         if (*ostr == ':')
    00107                                 ret = BADARG;
    00108                         else
    00109                                 ret = BADCH;
    00110                         if (opterr)
    00111                                 (void)fprintf(stderr,
    00112                                     "%s: option requires an argument -- %c\n",
    00113                                     __progname, optopt);
    00114                         return (ret);
    00115                 }
    00116                 else                            /* white space */
    00117                         optarg = nargv[optind];
    00118                 place = EMSG;
    00119                 ++optind;
    00120         }
    00121         return (optopt);                        /* dump back option letter */
    00122 }
    00123
    00124 #endif
    00125

documentation. Copyright (c) 2002-2003 Politecnico di Torino. All rights reserved.