1
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
50
51
52
53
54
55
56
57
58
59
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
129
130
/* ... */
/* ... */
#include "argtable3.h"
#ifndef ARG_AMALGAMATION
#include "argtable3_private.h"
#endif
#include <stdlib.h>
static void arg_end_resetfn(struct arg_end* parent) {
ARG_TRACE(("%s:resetfn(%p)\n", __FILE__, parent));
parent->count = 0;
}{ ... }
static void arg_end_errorfn(void* parent, arg_dstr_t ds, int error, const char* argval, const char* progname) {
(void)parent;
progname = progname ? progname : "";
argval = argval ? argval : "";
arg_dstr_catf(ds, "%s: ", progname);
switch (error) {
case ARG_ELIMIT:
arg_dstr_cat(ds, "too many errors to display");
break;...
case ARG_EMALLOC:
arg_dstr_cat(ds, "insufficient memory");
break;...
case ARG_ENOMATCH:
arg_dstr_catf(ds, "unexpected argument \"%s\"", argval);
break;...
case ARG_EMISSARG:
arg_dstr_catf(ds, "option \"%s\" requires an argument", argval);
break;...
case ARG_ELONGOPT:
arg_dstr_catf(ds, "invalid option \"%s\"", argval);
break;...
default:
arg_dstr_catf(ds, "invalid option \"-%c\"", error);
break;...
}{...}
arg_dstr_cat(ds, "\n");
}{ ... }
struct arg_end* arg_end(int maxcount) {
size_t nbytes;
struct arg_end* result;
nbytes = sizeof(struct arg_end) + (size_t)maxcount * sizeof(int)
+ (size_t)maxcount * sizeof(void*)
+ (size_t)maxcount * sizeof(char*);
result = (struct arg_end*)xmalloc(nbytes);
result->hdr.flag = ARG_TERMINATOR;
result->hdr.shortopts = NULL;
result->hdr.longopts = NULL;
result->hdr.datatype = NULL;
result->hdr.glossary = NULL;
result->hdr.mincount = 1;
result->hdr.maxcount = maxcount;
result->hdr.parent = result;
result->hdr.resetfn = (arg_resetfn*)arg_end_resetfn;
result->hdr.scanfn = NULL;
result->hdr.checkfn = NULL;
result->hdr.errorfn = (arg_errorfn*)arg_end_errorfn;
result->error = (int*)(result + 1);
result->parent = (void**)(result->error + maxcount);
result->argval = (const char**)(result->parent + maxcount);
ARG_TRACE(("arg_end(%d) returns %p\n", maxcount, result));
return result;
}{ ... }
void arg_print_errors_ds(arg_dstr_t ds, struct arg_end* end, const char* progname) {
int i;
ARG_TRACE(("arg_errors()\n"));
for (i = 0; i < end->count; i++) {
struct arg_hdr* errorparent = (struct arg_hdr*)(end->parent[i]);
if (errorparent->errorfn)
errorparent->errorfn(end->parent[i], ds, end->error[i], end->argval[i], progname);
}{...}
}{ ... }
void arg_print_errors(FILE* fp, struct arg_end* end, const char* progname) {
arg_dstr_t ds = arg_dstr_create();
arg_print_errors_ds(ds, end, progname);
fputs(arg_dstr_cstr(ds), fp);
arg_dstr_destroy(ds);
}{ ... }