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

📄 getoptsl.c

📁 国外网站上的一些精典的C程序
💻 C
字号:
/***  GETOPTS.C - Universal command line options parser****  Original Copyright 1993 by Bob Stout as part of**  the MicroFirm Function Library (MFL)****  This subset version is hereby donated to the public domain.*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include "dirport.h"#include "getoptsl.h"#define NUL '\0'#define MAX_XARGS 512int   xargc;char *xargv[MAX_XARGS];/***  getopts()****  Parameters: 1 - argc from main()**              2 - argv from main()**              3 - your program's options[] array****  Returns: Number of options specified or -1 if error****  Note: Your program should declare the global options[] array which**        specifies all options recognized by getopts().*/int getopts_lite(int argc, char *argv[]){      int i, count, argidx = 0;      char *argp;      struct Option_Tag *ptr;      xargc = argc;      xargv[argidx++] = argv[0];      for (i = 1, count = 0; i < argc; ++i)      {            if (strchr("-/", argv[i][0]) && !strchr("-/", argv[i][1]))            {                  Boolean_T found_it = False_;                  /*                  ** Found a switch - If the 2nd character is also a switch                  ** character. If so, then it's a literal and is skipped                  */                  if (strchr("-/", argv[i][1]))                        continue;                  for (ptr = options; ptr->buf; ++ptr)                  {                        if ((int)argv[i][1] == ptr->letter) switch (ptr->type)                        {                        case Boolean_Tag:                              if ('-' == argv[i][2])                                    *((Boolean_T *)(ptr->buf)) = False_;                              else  *((Boolean_T *)(ptr->buf)) = True_;                              ++count;                              --xargc;                              found_it = True_;                              break;                        case Word_Tag:                              sscanf(&argv[i][2], "%hd", (short *)(ptr->buf));                              ++count;                              --xargc;                              found_it = True_;                              break;                        case DWord_Tag:                              sscanf(&argv[i][2], "%ld", (long *)(ptr->buf));                              ++count;                              --xargc;                              found_it = True_;                              break;                        case Double_Tag:                              sscanf(&argv[i][2], "%lg",(double *)(ptr->buf));                              ++count;                              --xargc;                              found_it = True_;                              break;                        case String_Tag:                              strncpy(ptr->buf, &argv[i][2], ptr->siz - 1);                              ++count;                              --xargc;                              found_it = True_;                              break;                        default:                              return Error_;                        }                  }                  if (!found_it)                        return Error_;            }            else                          /* It must be a file name     */            {                  DOSFileData ffblk;                  /* Set argp to point to the filename                  */                  if (strchr("-/", argv[i][0]))                        argp = &argv[i][1];                  else  argp =  argv[i];                  /* If no wildcards, just copy it */                  if (!strchr(argp, '*') && !strchr(argp, '?'))                  {                        xargv[argidx++] = argp;                        continue;                  }                  /* Expand wildcards, if possible                      */                  if (0 == FIND_FIRST(argp, _A_ANY, &ffblk))                  {                        char path[FILENAME_MAX], *p;                        /* Save the path for re-attachment              */                        if (NULL == (p = strrchr(argp, '\\')))                              p = strrchr(argp, '/');                        if (p)                        {                              char ch = *p;                              *p = NUL;                              strcat(strcpy(path, argp), "\\");                              *p = ch;                        }                        else  *path = NUL;                        --xargc;                        do                        {                                                           xargv[argidx] = malloc(strlen(ff_name(&ffblk))                                    + strlen(path) + 2);                              strcat(strcpy(xargv[argidx], path),                                    ff_name(&ffblk));                              ++argidx;                              ++xargc;                                                } while (0 == FIND_NEXT(&ffblk));                  }            }      }      return count;}#ifdef TEST#include <stdlib.h>#include <conio.h>Boolean_T test1 = True_, test2 = False_;short test3     = -37;long  test4     = 100000L;char  test5[81] = "Default string";struct Option_Tag options[] = {      {'A',  Boolean_Tag, &test1, 0  },         /* Valid options        */      {'B',  Boolean_Tag, &test2, 0  },      {'C',  Word_Tag,    &test3, 0  },      {'D',  DWord_Tag,   &test4, 0  },      {'E',  String_Tag,   test5, 81 },      {'\0', Error_Tag,     NULL, 0  }          /* Terminating record   */};#define TFprint(v) ((v) ? "TRUE" : "FALSE")int main(int argc, char *argv[]){      int i;      printf("Defaults:\ntest1 = %s\ntest2 = %s\ntest3 = %d\ntest4 = %ld\n"            "test5 = \"%s\"\n\n", TFprint(test1), TFprint(test2), test3,            test4, test5);      printf("getopts() returned %d\n", getopts_lite(argc, argv));      printf("Options are now:\ntest1 = %s\ntest2 = %s\ntest3 = %d\n"            "test4 = %ld\ntest5 = \"%s\"\n\n", TFprint(test1),            TFprint(test2), test3, test4, test5);      puts("Hit any key to continue");      getch();      for (i = 0; i < xargc; ++i)            printf("xargv[%d] = \"%s\"\n", i, xargv[i]);      printf("\nxargc = %d\n", xargc);      return 0;}#endif /* TEST */

⌨️ 快捷键说明

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