00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include <stdlib.h>
00027 #include <stdio.h>
00028 #include <argp.h>
00029
00030 const char *argp_program_version =
00031 "argp-ex4 1.0";
00032 const char *argp_program_bug_address =
00033 "<bug-gnu-utils@prep.ai.mit.edu>";
00034
00035
00036 static char doc[] =
00037 "Argp example #4 -- a program with somewhat more complicated\
00038 options\
00039 \vThis part of the documentation comes *after* the options;\
00040 note that the text is automatically filled, but it's possible\
00041 to force a line-break, e.g.\n<-- here.";
00042
00043
00044 static char args_doc[] = "ARG1 [STRING...]";
00045
00046
00047 #define OPT_ABORT 1
00048
00049
00050 static struct argp_option options[] = {
00051 {"verbose", 'v', 0, 0, "Produce verbose output", 0},
00052 {"quiet", 'q', 0, 0, "Don't produce any output", 0},
00053 {"silent", 's', 0, OPTION_ALIAS, 0, 0},
00054 {"output", 'o', "FILE", 0,
00055 "Output to FILE instead of standard output", 0},
00056
00057 {0,0,0,0, "The following options should be grouped together:", 0},
00058 {"repeat", 'r', "COUNT", OPTION_ARG_OPTIONAL,
00059 "Repeat the output COUNT (default 10) times", 0},
00060 {"abort", OPT_ABORT, 0, 0, "Abort before showing any output", 0},
00061
00062 {0, 0, 0, 0, 0, 0}
00063 };
00064
00065
00066 struct arguments
00067 {
00068 char *arg1;
00069 char **strings;
00070 int silent, verbose, abort;
00071 char *output_file;
00072 int repeat_count;
00073 };
00074
00075
00076 static error_t
00077 parse_opt (int key, char *arg, struct argp_state *state)
00078 {
00079
00080
00081 struct arguments *arguments = state->input;
00082
00083 switch (key)
00084 {
00085 case 'q': case 's':
00086 arguments->silent = 1;
00087 break;
00088 case 'v':
00089 arguments->verbose = 1;
00090 break;
00091 case 'o':
00092 arguments->output_file = arg;
00093 break;
00094 case 'r':
00095 arguments->repeat_count = arg ? atoi (arg) : 10;
00096 break;
00097 case OPT_ABORT:
00098 arguments->abort = 1;
00099 break;
00100
00101 case ARGP_KEY_NO_ARGS:
00102 argp_usage (state);
00103
00104 case ARGP_KEY_ARG:
00105
00106
00107
00108 arguments->arg1 = arg;
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120 arguments->strings = &state->argv[state->next];
00121 state->next = state->argc;
00122
00123 break;
00124
00125 default:
00126 return ARGP_ERR_UNKNOWN;
00127 }
00128 return 0;
00129 }
00130
00131
00132 static struct argp argp = { options, parse_opt, args_doc, doc, 0, 0, 0};
00133
00134 int main (int argc, char **argv)
00135 {
00136 int i, j;
00137 struct arguments arguments;
00138
00139
00140 arguments.silent = 0;
00141 arguments.verbose = 0;
00142 arguments.output_file = "-";
00143 arguments.repeat_count = 1;
00144 arguments.abort = 0;
00145
00146
00147
00148 argp_parse (&argp, argc, argv, 0, 0, &arguments);
00149
00150 if (arguments.abort)
00151 {
00152
00153
00154 fprintf(stderr, "ex4: ABORTED\n");
00155 exit(10);
00156 }
00157
00158 for (i = 0; i < arguments.repeat_count; i++)
00159 {
00160 printf ("ARG1 = %s\n", arguments.arg1);
00161 printf ("STRINGS = ");
00162 for (j = 0; arguments.strings[j]; j++)
00163 printf (j == 0 ? "%s" : ", %s", arguments.strings[j]);
00164 printf ("\n");
00165 printf ("OUTPUT_FILE = %s\nVERBOSE = %s\nSILENT = %s\n",
00166 arguments.output_file,
00167 arguments.verbose ? "yes" : "no",
00168 arguments.silent ? "yes" : "no");
00169 }
00170
00171 exit (0);
00172 }