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

📄 genargs.c

📁 稀疏矩阵、链表、图、队列、二叉树、多叉树、排序、遗传算法等的实现
💻 C
📖 第 1 页 / 共 2 页
字号:
  CompArgs = DLCount(ArgList) - OptArgs;

  Start = DLGetFirst(ArgList);

  fprintf(OutStream,
          "int GetArgs(int argc,"
          " char **argv, ARG *argp)\n");
  fprintf(OutStream, "{\n");
  fprintf(OutStream, "  int ThisArg;\n");
  fprintf(OutStream, "  int CompArg;\n");

  fprintf(OutStream, "\n");
  fprintf(OutStream, "  if(argc <= %d)\n", CompArgs);
  fprintf(OutStream, "  {\n");
  fprintf(OutStream, "    return -1;\n");
  fprintf(OutStream, "  }\n");
  fprintf(OutStream, "  if(argc > %d)\n", CompArgs +
                                          OptArgs + 1);
  fprintf(OutStream, "  {\n");
  fprintf(OutStream, "    return -2;\n");
  fprintf(OutStream, "  }\n");

  fprintf(OutStream, "  for(ThisArg = 1, CompArg = 0;"
         " ThisArg < argc; ThisArg++)\n");
  fprintf(OutStream, "  {\n");


  if(OptArgs > 0)
  {
    fprintf(OutStream, "    if(argv[ThisArg][0] == "
                       "SWITCH_CHAR)\n");
    fprintf(OutStream, "    {\n      ");

    do
    {
      Arg = DLGetData(ArgList, NULL, NULL);
      if(Arg->Type == BOOL)
      {
        fprintf(OutStream,
                "if(strcmp(\"%c%s\","
                " argv[ThisArg]) == 0)\n",
                SWITCH_CHAR,
                Arg->Name);

        fprintf(OutStream, "      {\n");

        fprintf(OutStream,
                "        argp->%s = 1;\n",
                Arg->Name);

        fprintf(OutStream, "      }\n");
        fprintf(OutStream, "      else ");
      }

      ArgList = DLGetNext(ArgList);
    } while(ArgList != NULL);

    fprintf(OutStream, "\n");
    fprintf(OutStream, "      {\n");

    fprintf(OutStream,
           "        printf(\"Unknown switch "
           "%%s\\n\", argv[ThisArg]);\n");

    fprintf(OutStream, "        return ThisArg;\n");
    fprintf(OutStream, "      }\n");

    ArgList = Start;

    fprintf(OutStream, "    }\n");
    fprintf(OutStream, "    else\n");
    fprintf(OutStream, "    {\n");

    Indent = INDENT_4;
  }

  fprintf(OutStream, "%s  switch(CompArg)\n", Indent);
  fprintf(OutStream, "%s  {\n", Indent);

  for(ThisArg = 0, ThisCompArg = 0;
      ThisCompArg < CompArgs;
      ThisArg++)
  {
    Arg = DLGetData(ArgList, NULL, NULL);

    if(Arg->Type != BOOL)
    {
      fprintf(OutStream,
              "%s    case %d:\n",
              Indent,
              ThisCompArg);

      fprintf(OutStream,
              "%s    {\n",
              Indent);

      switch(Arg->Type)
      {
        case LONG:
          fprintf(OutStream,
                  "%s        char *EndPtr;\n",
                  Indent);

          fprintf(OutStream,
                  "%s        argp->%s = "
                  "strtol(argv[ThisArg]"
                  ", &EndPtr, 10);\n",
                  Indent,
                  Arg->Name);

          fprintf(OutStream,
                  "%s        if(EndPtr =="
                  " argv[ThisArg])\n",
                  Indent);

          fprintf(OutStream,
                  "%s        {\n",
                  Indent);

          fprintf(OutStream,
                  "%s          return ThisArg;\n",
                  Indent);

          fprintf(OutStream,
                  "%s        }\n",
                  Indent);
          break;
        case DOUBLE:
          fprintf(OutStream,
                  "%s        char *EndPtr;\n",
                  Indent);

          fprintf(OutStream,
                  "%s        argp->%s = strtod"
                  "(argv[ThisArg], &EndPtr);\n",
                  Indent,
                  Arg->Name);

          fprintf(OutStream,
                  "%s        if(EndPtr "
                  "== argv[ThisArg])\n",
                 Indent);

          fprintf(OutStream,
                  "%s        {\n",
                  Indent);

          fprintf(OutStream,
                  "%s          return ThisArg;\n",
                  Indent);

          fprintf(OutStream,
                  "%s        }\n",
                  Indent);
          break;
        case STRING:
          fprintf(OutStream,
                  "%s        if(strlen(argv"
                  "[ThisArg]) > %d)\n",
                  Indent,
                  Arg->Len);
          fprintf(OutStream,
                  "%s        {\n",
                  Indent);
          fprintf(OutStream,
                  "%s          return ThisArg;\n",
                  Indent);

          fprintf(OutStream,
                  "%s        }\n",
                  Indent);

          fprintf(OutStream,
                  "%s        strcpy(argp->%s, "
                  "argv[ThisArg]);\n",
                  Indent,
                  Arg->Name);
          break;
        default:
          /* Unsupported type, already validated. */
          assert(0);
          break;
      }
      fprintf(OutStream,
              "%s        break;\n",
              Indent);

      fprintf(OutStream,
              "%s    }\n",
              Indent);

      ++ThisCompArg;
    }

    ArgList = DLGetNext(ArgList);
  }

  fprintf(OutStream, "%s  }\n", Indent);
  fprintf(OutStream, "\n");
  fprintf(OutStream, "%s  ++CompArg;\n", Indent);

  if(OptArgs > 0)
  {
    fprintf(OutStream, "    }\n");
  }

  fprintf(OutStream, "  }\n");

  fprintf(OutStream, "  return 0;\n");
  fprintf(OutStream, "}\n\n");

  return EXIT_SUCCESS;
}

int WriteMain(FILE *OutStream,
              FILE *HelpStream,
              DLLIST *ArgList,
              int InternalApp)
{
  DLLIST *Arg;
  ARGUMENT *Data;

  char *MainText[] =
  {
    "",
    "%", /* write prototype for ApplicationMain() */
    "",
    "void Help(void);",
    "",
    "int main(int argc, char **argv)",
    "{",
    "  int Status;",
    "  int ArgResult;",
    "  ARG ArgList = {0};",
    "",
    "  ArgResult = GetArgs(argc, argv, &ArgList);",
    "  if(ArgResult != 0)",
    "  {",
    "    Help();",
    "    Status = EXIT_FAILURE;",
    "  }",
    "  else",
    "  {",
    "    /* Calling your program... */",
    "^", /* Write function call for ApplicationMain() */
    "  }",
    "",
    "  return Status;",
    "}",
    "",
    "void Help(void)",
    "{",
    "!",
    "}",
    "",
    "&", /* Write function body for ApplicationMain() */
    NULL
  };

  int i;
  int j;
  char buffer[MAX_STR_LEN];
  char *p;

  for(i = 0; MainText[i] != NULL; i++)
  {
    switch(MainText[i][0])
    {
      case '!':
        /* Generate the Help() function */
        fprintf(OutStream, "  char buffer[8];\n\n");

        j = 0;

        while(fgets(buffer, sizeof buffer, HelpStream))
        {
          p = strchr(buffer, '\n');
          if(p != NULL)
          {
            *p = '\0';
          }
          fprintf(OutStream,
                  "  printf(\"%s\\n\");\n",
                  buffer);

          ++j;

          if(j == LINES_PER_SCREEN)
          {
            fprintf(OutStream,
                    "  fprintf(stderr, \"Press ENTER to"
                    " continue...\\n\");\n");
            fprintf(OutStream,
                    "  fgets(buffer, sizeof buffer, "
                    "stdin);\n");
            j = 0;
          }
        }
        break;
      case '%':
      case '&':
        if(MainText[i][0] == '&')
        {
          if(!InternalApp)
          {
            break;
          }
          fprintf(OutStream,
                  "/* Write, or call, your"
                  " application here.\n");
          fprintf(OutStream,
                  " * ApplicationMain must"
                  " return int. 0 indicates\n");
          fprintf(OutStream,
                  " * success. Any other value "
                  "indicates failure.\n");
          fprintf(OutStream,
                  " */\n\n");
        }

        /* Generate the prototype */
        fprintf(OutStream, "int ApplicationMain(");

        j = 0;

        for(Arg = ArgList;
            Arg != NULL;
            Arg = DLGetNext(Arg))
        {
          Data = DLGetData(Arg, NULL, NULL);
          switch(Data->Type)
          {
            case BOOL:
              fprintf(OutStream,
                      "%sint    ",
                      j == 0 ?
                           "" :
                           ", \n        "
                           "            ");
              break;
            case LONG:
              fprintf(OutStream,
                      "%slong   ",
                      j == 0 ?
                           "" :
                           ", \n        "
                           "            ");
              break;
            case DOUBLE:
              fprintf(OutStream,
                      "%sdouble ",
                      j == 0 ?
                           "" :
                           ", \n        "
                           "            ");
              break;
            case STRING:
              fprintf(OutStream,
                      "%schar * ",
                      j == 0  ?
                           "" :
                           ", \n        "
                           "            ");
              break;
            default:
              fprintf(stderr,
                      "program error in fun"
                      "ction WriteMain()\n");
              assert(0);
              break;
          }

          ++j;

          fprintf(OutStream, "%s", Data->Name);
        }

        fprintf(OutStream,
                ")%s\n",
                MainText[i][0] == '%' ? ";" : "");

        if(MainText[i][0] == '&')
        {
          fprintf(OutStream, "{\n  return 0;\n}\n\n");
        }

        break;
      case '^':
        /* Generate the call */
        fprintf(OutStream,
                "    Status = (ApplicationMain(");

        j = 0;

        for(Arg = ArgList;
            Arg != NULL;
            Arg = DLGetNext(Arg))
        {
          Data = DLGetData(Arg, NULL, NULL);

          fprintf(OutStream, "%sArgList.%s",
                  j == 0 ?
                  "" :
                  ",\n                              ",
                  Data->Name);
          ++j;
        }

        fprintf(OutStream,
                ") == 0) ?\n     EXIT_SUCCESS "
                ":\n     EXIT_FAILURE;\n");

        break;
      default:
        fprintf(OutStream, "%s\n", MainText[i]);
        break;
    }
  }

  return EXIT_SUCCESS;
}

int ApplicationMain(int internal, 
                    char * InFile, 
                    char * OutFile, 
                    char * LogFile, 
                    char * HelpFile)
{
  int Status;

  DLLIST *ArgList = NULL;

  FILE *fpIn, *fpOut, *fpLog, *fpHelp;

  fpLog = fopen(LogFile, "w");
  if(fpLog == NULL)
  {
    fprintf(stderr,
            "Can't open file %s for logging.\n",
            LogFile);
    fprintf(stderr, "Using stderr.\n");
    fpLog = stderr;
  }
  fpIn = fopen(InFile, "r");
  if(fpIn == NULL)
  {
    fprintf(stderr,
            "Can't open file %s for reading.\n",
            InFile);
    fprintf(stderr, "Using stdin.\n");
    fpIn = stdin;
  }
  fpOut = fopen(OutFile, "w");
  if(fpOut == NULL)
  {
    fprintf(fpLog,
            "Can't open file %s for writing.\n",
            OutFile);

    fprintf(fpLog, "Using stdout.\n");
    fpOut = stdout;
  }
  fpHelp = fopen(HelpFile, "r");
  if(fpHelp == NULL)
  {
    fprintf(stderr,
            "Can't open file %s for reading.\n",
            HelpFile);
    fprintf(stderr, "Using stdin.\n");
    fpHelp = stdin;
  }

  Status = ParseInput(&ArgList, fpIn, fpLog);

  if(EXIT_SUCCESS == Status)
  {
    DLWalk(ArgList, WalkArgs, fpLog);

    Status = WriteHeaders(fpOut, OutFile);
  }

  if(EXIT_SUCCESS == Status)
  {
    Status = WriteTypedef(fpOut, ArgList);
  }
  if(EXIT_SUCCESS == Status)
  {
    Status = WriteFunction(fpOut, ArgList);
  }
  if(EXIT_SUCCESS == Status)
  {
    Status = WriteMain(fpOut, fpHelp, ArgList, internal);
  }

  if(fpLog != stderr)
  {
    fclose(fpLog);
  }
  if(fpIn != stdin)
  {
    fclose(fpIn);
  }
  if(fpOut != stdout)
  {
    fclose(fpOut);
  }
  if(fpHelp != stdin)
  {
    fclose(fpHelp);
  }

  DLDestroy(&ArgList);

  return Status;
}

⌨️ 快捷键说明

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