Annotation of embedaddon/ntp/libntp/getopt.c, revision 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>