⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 getopt.c

📁 apache 安装教程 apache 安装教程
💻 C
字号:
/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements.  See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */#include <stdio.h>#include <string.h>#include <assert.h>#include <stdlib.h>#define OPTERRCOLON (1)#define OPTERRNF (2)#define OPTERRARG (3)char *optarg;int optind = 1;int opterr = 1;int optopt;static intoptiserr(int argc, char * const *argv, int oint, const char *optstr,         int optchr, int err){    if (opterr) {        fprintf(stderr, "Error in argument %d, char %d: ", oint, optchr + 1);        switch (err) {        case OPTERRCOLON:            fprintf(stderr, ": in flags\n");            break;        case OPTERRNF:            fprintf(stderr, "option not found %c\n", argv[oint][optchr]);            break;        case OPTERRARG:            fprintf(stderr, "no argument for option %c\n", argv[oint][optchr]);            break;        default:            fprintf(stderr, "unknown\n");            break;        }    }    optopt = argv[oint][optchr];    return('?');}    intgetopt(int argc, char* const *argv, const char *optstr){    static int optchr = 0;    static int dash = 0; /* have already seen the - */    char *cp;    if (optind >= argc)        return(EOF);    if (!dash && (argv[optind][0] !=  '-'))        return(EOF);    if (!dash && (argv[optind][0] ==  '-') && !argv[optind][1]) {        /*         * use to specify stdin. Need to let pgm process this and         * the following args         */        return(EOF);    }    if ((argv[optind][0] == '-') && (argv[optind][1] == '-')) {        /* -- indicates end of args */        optind++;        return(EOF);    }    if (!dash) {        assert((argv[optind][0] == '-') && argv[optind][1]);        dash = 1;        optchr = 1;    }    /* Check if the guy tries to do a -: kind of flag */    assert(dash);    if (argv[optind][optchr] == ':') {        dash = 0;        optind++;        return(optiserr(argc, argv, optind-1, optstr, optchr, OPTERRCOLON));    }    if (!(cp = strchr(optstr, argv[optind][optchr]))) {        int errind = optind;        int errchr = optchr;        if (!argv[optind][optchr+1]) {            dash = 0;            optind++;        }        else            optchr++;        return(optiserr(argc, argv, errind, optstr, errchr, OPTERRNF));    }    if (cp[1] == ':') {        dash = 0;        optind++;        if(optind == argc)            return(optiserr(argc, argv, optind-1, optstr, optchr, OPTERRARG));        optarg = argv[optind++];        return(*cp);    } else {        if (!argv[optind][optchr+1]) {            dash = 0;            optind++;        }        else            optchr++;        return(*cp);    }    assert(0);    return(0);}#ifdef TESTGETOPTint main(int argc, char **argv){    int c;    extern char *optarg;    extern int optind;    int aflg = 0;    int bflg = 0;    int errflg = 0;    char *ofile = NULL;    while ((c = getopt(argc, argv, "abo:")) != EOF)        switch (c) {        case 'a':            if (bflg)                errflg++;            else                aflg++;            break;        case 'b':            if (aflg)                errflg++;            else                bflg++;            break;        case 'o':            ofile = optarg;            (void)printf("ofile = %s\n", ofile);            break;        case '?':            errflg++;        }    if (errflg) {        (void)fprintf(stderr, "usage: cmd [-a|-b] [-o <filename>] files...\n");        exit(2);    }    for ( ; optind < argc; optind++)        (void)printf("%s\n", argv[optind]);    return 0;}#endif /* TESTGETOPT */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -