Annotation of embedaddon/ntp/libntp/getopt.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * getopt - get option letter from argv
                      3:  *
                      4:  * This is a version of the public domain getopt() implementation by
                      5:  * Henry Spencer, changed for 4.3BSD compatibility (in addition to System V).
                      6:  * It allows rescanning of an option list by setting optind to 0 before
                      7:  * calling, which is why we use it even if the system has its own (in fact,
                      8:  * this one has a unique name so as not to conflict with the system's).
                      9:  * Thanks to Dennis Ferguson for the appropriate modifications.
                     10:  *
                     11:  * This file is in the Public Domain.
                     12:  */
                     13: 
                     14: /*LINTLIBRARY*/
                     15: 
                     16: #include <stdio.h>
                     17: 
                     18: #include "ntp_stdlib.h"
                     19: 
                     20: #ifdef lint
                     21: #undef putc
                     22: #define        putc    fputc
                     23: #endif /* lint */
                     24: 
                     25: char   *ntp_optarg;    /* Global argument pointer. */
                     26: int    ntp_optind = 0; /* Global argv index. */
                     27: int    ntp_opterr = 1; /* for compatibility, should error be printed? */
                     28: int    ntp_optopt;     /* for compatibility, option character checked */
                     29: 
                     30: static char    *scan = NULL;   /* Private scan pointer. */
                     31: static const char      *prog = "amnesia";
                     32: 
                     33: /*
                     34:  * Print message about a bad option.
                     35:  */
                     36: static int
                     37: badopt(
                     38:        const char *mess,
                     39:        int ch
                     40:        )
                     41: {
                     42:        if (ntp_opterr) {
                     43:                fputs(prog, stderr);
                     44:                fputs(mess, stderr);
                     45:                (void) putc(ch, stderr);
                     46:                (void) putc('\n', stderr);
                     47:        }
                     48:        return ('?');
                     49: }
                     50: 
                     51: int
                     52: ntp_getopt(
                     53:        int argc,
                     54:        char *argv[],
                     55:        const char *optstring
                     56:        )
                     57: {
                     58:        register char c;
                     59:        register const char *place;
                     60: 
                     61:        prog = argv[0];
                     62:        ntp_optarg = NULL;
                     63: 
                     64:        if (ntp_optind == 0) {
                     65:                scan = NULL;
                     66:                ntp_optind++;
                     67:        }
                     68:        
                     69:        if (scan == NULL || *scan == '\0') {
                     70:                if (ntp_optind >= argc
                     71:                    || argv[ntp_optind][0] != '-'
                     72:                    || argv[ntp_optind][1] == '\0') {
                     73:                        return (EOF);
                     74:                }
                     75:                if (argv[ntp_optind][1] == '-'
                     76:                    && argv[ntp_optind][2] == '\0') {
                     77:                        ntp_optind++;
                     78:                        return (EOF);
                     79:                }
                     80:        
                     81:                scan = argv[ntp_optind++]+1;
                     82:        }
                     83: 
                     84:        c = *scan++;
                     85:        ntp_optopt = c & 0377;
                     86:        for (place = optstring; place != NULL && *place != '\0'; ++place)
                     87:            if (*place == c)
                     88:                break;
                     89: 
                     90:        if (place == NULL || *place == '\0' || c == ':' || c == '?') {
                     91:                return (badopt(": unknown option -", c));
                     92:        }
                     93: 
                     94:        place++;
                     95:        if (*place == ':') {
                     96:                if (*scan != '\0') {
                     97:                        ntp_optarg = scan;
                     98:                        scan = NULL;
                     99:                } else if (ntp_optind >= argc) {
                    100:                        return (badopt(": option requires argument -", c));
                    101:                } else {
                    102:                        ntp_optarg = argv[ntp_optind++];
                    103:                }
                    104:        }
                    105: 
                    106:        return (c & 0377);
                    107: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>