📄 genargs.c
字号:
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 + -