@@ -14,10 +14,18 @@ static char *file = NULL;
14
14
static int ambiguous ;
15
15
static struct string_list list ;
16
16
17
+ static struct {
18
+ int called ;
19
+ const char * arg ;
20
+ int unset ;
21
+ } length_cb ;
22
+
17
23
static int length_callback (const struct option * opt , const char * arg , int unset )
18
24
{
19
- printf ("Callback: \"%s\", %d\n" ,
20
- (arg ? arg : "not set" ), unset );
25
+ length_cb .called = 1 ;
26
+ length_cb .arg = arg ;
27
+ length_cb .unset = unset ;
28
+
21
29
if (unset )
22
30
return 1 ; /* do not support unset */
23
31
@@ -31,13 +39,69 @@ static int number_callback(const struct option *opt, const char *arg, int unset)
31
39
return 0 ;
32
40
}
33
41
42
+ static int collect_expect (const struct option * opt , const char * arg , int unset )
43
+ {
44
+ struct string_list * expect ;
45
+ struct string_list_item * item ;
46
+ struct strbuf label = STRBUF_INIT ;
47
+ const char * colon ;
48
+
49
+ if (!arg || unset )
50
+ die ("malformed --expect option" );
51
+
52
+ expect = (struct string_list * )opt -> value ;
53
+ colon = strchr (arg , ':' );
54
+ if (!colon )
55
+ die ("malformed --expect option, lacking a colon" );
56
+ strbuf_add (& label , arg , colon - arg );
57
+ item = string_list_insert (expect , strbuf_detach (& label , NULL ));
58
+ if (item -> util )
59
+ die ("malformed --expect option, duplicate %s" , label .buf );
60
+ item -> util = (void * )arg ;
61
+ return 0 ;
62
+ }
63
+
64
+ __attribute__((format (printf ,3 ,4 )))
65
+ static void show (struct string_list * expect , int * status , const char * fmt , ...)
66
+ {
67
+ struct string_list_item * item ;
68
+ struct strbuf buf = STRBUF_INIT ;
69
+ va_list args ;
70
+
71
+ va_start (args , fmt );
72
+ strbuf_vaddf (& buf , fmt , args );
73
+ va_end (args );
74
+
75
+ if (!expect -> nr )
76
+ printf ("%s\n" , buf .buf );
77
+ else {
78
+ char * colon = strchr (buf .buf , ':' );
79
+ if (!colon )
80
+ die ("malformed output format, output lacking colon: %s" , fmt );
81
+ * colon = '\0' ;
82
+ item = string_list_lookup (expect , buf .buf );
83
+ * colon = ':' ;
84
+ if (!item )
85
+ ; /* not among entries being checked */
86
+ else {
87
+ if (strcmp ((const char * )item -> util , buf .buf )) {
88
+ printf ("-%s\n" , (char * )item -> util );
89
+ printf ("+%s\n" , buf .buf );
90
+ * status = 1 ;
91
+ }
92
+ }
93
+ }
94
+ strbuf_release (& buf );
95
+ }
96
+
34
97
int main (int argc , char * * argv )
35
98
{
36
99
const char * prefix = "prefix/" ;
37
100
const char * usage [] = {
38
101
"test-parse-options <options>" ,
39
102
NULL
40
103
};
104
+ struct string_list expect = STRING_LIST_INIT_NODUP ;
41
105
struct option options [] = {
42
106
OPT_BOOL (0 , "yes" , & boolean , "get a boolean" ),
43
107
OPT_BOOL ('D' , "no-doubt" , & boolean , "begins with 'no-'" ),
@@ -78,28 +142,38 @@ int main(int argc, char **argv)
78
142
OPT__VERBOSE (& verbose , "be verbose" ),
79
143
OPT__DRY_RUN (& dry_run , "dry run" ),
80
144
OPT__QUIET (& quiet , "be quiet" ),
145
+ OPT_CALLBACK (0 , "expect" , & expect , "string" ,
146
+ "expected output in the variable dump" ,
147
+ collect_expect ),
81
148
OPT_END (),
82
149
};
83
150
int i ;
151
+ int ret = 0 ;
84
152
85
153
argc = parse_options (argc , (const char * * )argv , prefix , options , usage , 0 );
86
154
87
- printf ("boolean: %d\n" , boolean );
88
- printf ("integer: %d\n" , integer );
89
- printf ("magnitude: %lu\n" , magnitude );
90
- printf ("timestamp: %lu\n" , timestamp );
91
- printf ("string: %s\n" , string ? string : "(not set)" );
92
- printf ("abbrev: %d\n" , abbrev );
93
- printf ("verbose: %d\n" , verbose );
94
- printf ("quiet: %d\n" , quiet );
95
- printf ("dry run: %s\n" , dry_run ? "yes" : "no" );
96
- printf ("file: %s\n" , file ? file : "(not set)" );
155
+ if (length_cb .called ) {
156
+ const char * arg = length_cb .arg ;
157
+ int unset = length_cb .unset ;
158
+ show (& expect , & ret , "Callback: \"%s\", %d" ,
159
+ (arg ? arg : "not set" ), unset );
160
+ }
161
+ show (& expect , & ret , "boolean: %d" , boolean );
162
+ show (& expect , & ret , "integer: %d" , integer );
163
+ show (& expect , & ret , "magnitude: %lu" , magnitude );
164
+ show (& expect , & ret , "timestamp: %lu" , timestamp );
165
+ show (& expect , & ret , "string: %s" , string ? string : "(not set)" );
166
+ show (& expect , & ret , "abbrev: %d" , abbrev );
167
+ show (& expect , & ret , "verbose: %d" , verbose );
168
+ show (& expect , & ret , "quiet: %d" , quiet );
169
+ show (& expect , & ret , "dry run: %s" , dry_run ? "yes" : "no" );
170
+ show (& expect , & ret , "file: %s" , file ? file : "(not set)" );
97
171
98
172
for (i = 0 ; i < list .nr ; i ++ )
99
- printf ( "list: %s\n " , list .items [i ].string );
173
+ show ( & expect , & ret , "list: %s" , list .items [i ].string );
100
174
101
175
for (i = 0 ; i < argc ; i ++ )
102
- printf ( "arg %02d: %s\n " , i , argv [i ]);
176
+ show ( & expect , & ret , "arg %02d: %s" , i , argv [i ]);
103
177
104
- return 0 ;
178
+ return ret ;
105
179
}
0 commit comments