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

📄 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. */#ifdef WIN32#include <stdio.h>#include <string.h>#include <assert.h>#include <stdlib.h>#define OPTERRCOLON (1)#define OPTERRNF (2)#define OPTERRARG (3)char *optarg;int optreset = 0;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 (optreset)        optreset = optchr = dash = 0;    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 */#endif /* WIN32 */

⌨️ 快捷键说明

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