1*9a0e4156SSadaf Ebrahimi /* Capstone testing regression */
2*9a0e4156SSadaf Ebrahimi /* By Do Minh Tuan <[email protected]>, 02-2019 */
3*9a0e4156SSadaf Ebrahimi
4*9a0e4156SSadaf Ebrahimi
5*9a0e4156SSadaf Ebrahimi #include "helper.h"
6*9a0e4156SSadaf Ebrahimi #include "capstone_test.h"
7*9a0e4156SSadaf Ebrahimi #include <unistd.h>
8*9a0e4156SSadaf Ebrahimi
9*9a0e4156SSadaf Ebrahimi static int counter;
10*9a0e4156SSadaf Ebrahimi static char **list_lines;
11*9a0e4156SSadaf Ebrahimi static int failed_setup;
12*9a0e4156SSadaf Ebrahimi static int size_lines;
13*9a0e4156SSadaf Ebrahimi static cs_mode issue_mode;
14*9a0e4156SSadaf Ebrahimi static int getDetail;
15*9a0e4156SSadaf Ebrahimi static int mc_mode;
16*9a0e4156SSadaf Ebrahimi static int e_flag;
17*9a0e4156SSadaf Ebrahimi
setup_MC(void ** state)18*9a0e4156SSadaf Ebrahimi static int setup_MC(void **state)
19*9a0e4156SSadaf Ebrahimi {
20*9a0e4156SSadaf Ebrahimi csh *handle;
21*9a0e4156SSadaf Ebrahimi char **list_params;
22*9a0e4156SSadaf Ebrahimi int size_params;
23*9a0e4156SSadaf Ebrahimi int arch, mode;
24*9a0e4156SSadaf Ebrahimi int i, index, tmp_counter;
25*9a0e4156SSadaf Ebrahimi
26*9a0e4156SSadaf Ebrahimi if (failed_setup) {
27*9a0e4156SSadaf Ebrahimi fprintf(stderr, "[ ERROR ] --- Invalid file to setup\n");
28*9a0e4156SSadaf Ebrahimi return -1;
29*9a0e4156SSadaf Ebrahimi }
30*9a0e4156SSadaf Ebrahimi
31*9a0e4156SSadaf Ebrahimi tmp_counter = 0;
32*9a0e4156SSadaf Ebrahimi while (tmp_counter < size_lines && list_lines[tmp_counter][0] != '#')
33*9a0e4156SSadaf Ebrahimi tmp_counter++;
34*9a0e4156SSadaf Ebrahimi
35*9a0e4156SSadaf Ebrahimi list_params = split(list_lines[tmp_counter] + 2, ", ", &size_params);
36*9a0e4156SSadaf Ebrahimi if (size_params != 3) {
37*9a0e4156SSadaf Ebrahimi fprintf(stderr, "[ ERROR ] --- Invalid options ( arch, mode, option )\n");
38*9a0e4156SSadaf Ebrahimi failed_setup = 1;
39*9a0e4156SSadaf Ebrahimi return -1;
40*9a0e4156SSadaf Ebrahimi }
41*9a0e4156SSadaf Ebrahimi
42*9a0e4156SSadaf Ebrahimi arch = get_value(arches, NUMARCH, list_params[0]);
43*9a0e4156SSadaf Ebrahimi if (!strcmp(list_params[0], "CS_ARCH_ARM64"))
44*9a0e4156SSadaf Ebrahimi mc_mode = 2;
45*9a0e4156SSadaf Ebrahimi else
46*9a0e4156SSadaf Ebrahimi mc_mode = 1;
47*9a0e4156SSadaf Ebrahimi
48*9a0e4156SSadaf Ebrahimi mode = 0;
49*9a0e4156SSadaf Ebrahimi for (i = 0; i < NUMMODE; ++i) {
50*9a0e4156SSadaf Ebrahimi if (strstr(list_params[1], modes[i].str)) {
51*9a0e4156SSadaf Ebrahimi mode += modes[i].value;
52*9a0e4156SSadaf Ebrahimi switch (modes[i].value) {
53*9a0e4156SSadaf Ebrahimi case CS_MODE_16:
54*9a0e4156SSadaf Ebrahimi mc_mode = 0;
55*9a0e4156SSadaf Ebrahimi break;
56*9a0e4156SSadaf Ebrahimi case CS_MODE_64:
57*9a0e4156SSadaf Ebrahimi mc_mode = 2;
58*9a0e4156SSadaf Ebrahimi break;
59*9a0e4156SSadaf Ebrahimi case CS_MODE_THUMB:
60*9a0e4156SSadaf Ebrahimi mc_mode = 1;
61*9a0e4156SSadaf Ebrahimi break;
62*9a0e4156SSadaf Ebrahimi default:
63*9a0e4156SSadaf Ebrahimi break;
64*9a0e4156SSadaf Ebrahimi }
65*9a0e4156SSadaf Ebrahimi }
66*9a0e4156SSadaf Ebrahimi }
67*9a0e4156SSadaf Ebrahimi
68*9a0e4156SSadaf Ebrahimi if (arch == -1) {
69*9a0e4156SSadaf Ebrahimi fprintf(stderr, "[ ERROR ] --- Arch is not supported!\n");
70*9a0e4156SSadaf Ebrahimi failed_setup = 1;
71*9a0e4156SSadaf Ebrahimi return -1;
72*9a0e4156SSadaf Ebrahimi }
73*9a0e4156SSadaf Ebrahimi
74*9a0e4156SSadaf Ebrahimi handle = (csh *)malloc(sizeof(csh));
75*9a0e4156SSadaf Ebrahimi if(cs_open(arch, mode, handle) != CS_ERR_OK) {
76*9a0e4156SSadaf Ebrahimi fprintf(stderr, "[ ERROR ] --- Cannot initialize capstone\n");
77*9a0e4156SSadaf Ebrahimi failed_setup = 1;
78*9a0e4156SSadaf Ebrahimi return -1;
79*9a0e4156SSadaf Ebrahimi }
80*9a0e4156SSadaf Ebrahimi
81*9a0e4156SSadaf Ebrahimi for (i = 0; i < NUMOPTION; ++i) {
82*9a0e4156SSadaf Ebrahimi if (strstr(list_params[2], options[i].str)) {
83*9a0e4156SSadaf Ebrahimi if (cs_option(*handle, options[i].first_value, options[i].second_value) != CS_ERR_OK) {
84*9a0e4156SSadaf Ebrahimi fprintf(stderr, "[ ERROR ] --- Option is not supported for this arch/mode\n");
85*9a0e4156SSadaf Ebrahimi failed_setup = 1;
86*9a0e4156SSadaf Ebrahimi return -1;
87*9a0e4156SSadaf Ebrahimi }
88*9a0e4156SSadaf Ebrahimi }
89*9a0e4156SSadaf Ebrahimi }
90*9a0e4156SSadaf Ebrahimi
91*9a0e4156SSadaf Ebrahimi *state = (void *)handle;
92*9a0e4156SSadaf Ebrahimi counter++;
93*9a0e4156SSadaf Ebrahimi if (e_flag == 0)
94*9a0e4156SSadaf Ebrahimi while (counter < size_lines && strncmp(list_lines[counter], "0x", 2))
95*9a0e4156SSadaf Ebrahimi counter++;
96*9a0e4156SSadaf Ebrahimi else
97*9a0e4156SSadaf Ebrahimi while (counter < size_lines && strncmp(list_lines[counter], "// 0x", 5))
98*9a0e4156SSadaf Ebrahimi counter++;
99*9a0e4156SSadaf Ebrahimi
100*9a0e4156SSadaf Ebrahimi free_strs(list_params, size_params);
101*9a0e4156SSadaf Ebrahimi return 0;
102*9a0e4156SSadaf Ebrahimi }
103*9a0e4156SSadaf Ebrahimi
test_MC(void ** state)104*9a0e4156SSadaf Ebrahimi static void test_MC(void **state)
105*9a0e4156SSadaf Ebrahimi {
106*9a0e4156SSadaf Ebrahimi if (e_flag == 1)
107*9a0e4156SSadaf Ebrahimi test_single_MC((csh *)*state, mc_mode, list_lines[counter] + 3);
108*9a0e4156SSadaf Ebrahimi else
109*9a0e4156SSadaf Ebrahimi test_single_MC((csh *)*state, mc_mode, list_lines[counter]);
110*9a0e4156SSadaf Ebrahimi }
111*9a0e4156SSadaf Ebrahimi
teardown_MC(void ** state)112*9a0e4156SSadaf Ebrahimi static int teardown_MC(void **state)
113*9a0e4156SSadaf Ebrahimi {
114*9a0e4156SSadaf Ebrahimi cs_close(*state);
115*9a0e4156SSadaf Ebrahimi free(*state);
116*9a0e4156SSadaf Ebrahimi return 0;
117*9a0e4156SSadaf Ebrahimi }
118*9a0e4156SSadaf Ebrahimi
setup_issue(void ** state)119*9a0e4156SSadaf Ebrahimi static int setup_issue(void **state)
120*9a0e4156SSadaf Ebrahimi {
121*9a0e4156SSadaf Ebrahimi csh *handle;
122*9a0e4156SSadaf Ebrahimi char **list_params;
123*9a0e4156SSadaf Ebrahimi int size_params;
124*9a0e4156SSadaf Ebrahimi int arch, mode;
125*9a0e4156SSadaf Ebrahimi int i, index, result;
126*9a0e4156SSadaf Ebrahimi char *(*function)(csh *, cs_mode, cs_insn*);
127*9a0e4156SSadaf Ebrahimi
128*9a0e4156SSadaf Ebrahimi getDetail = 0;
129*9a0e4156SSadaf Ebrahimi failed_setup = 0;
130*9a0e4156SSadaf Ebrahimi
131*9a0e4156SSadaf Ebrahimi if (e_flag == 0)
132*9a0e4156SSadaf Ebrahimi while (counter < size_lines && strncmp(list_lines[counter], "!# ", 3))
133*9a0e4156SSadaf Ebrahimi counter++; // get issue line
134*9a0e4156SSadaf Ebrahimi else
135*9a0e4156SSadaf Ebrahimi while (counter < size_lines && strncmp(list_lines[counter], "// !# ", 6))
136*9a0e4156SSadaf Ebrahimi counter++;
137*9a0e4156SSadaf Ebrahimi
138*9a0e4156SSadaf Ebrahimi counter++;
139*9a0e4156SSadaf Ebrahimi if (e_flag == 0)
140*9a0e4156SSadaf Ebrahimi while (counter < size_lines && strncmp(list_lines[counter], "!#", 2))
141*9a0e4156SSadaf Ebrahimi counter++; // get arch line
142*9a0e4156SSadaf Ebrahimi else
143*9a0e4156SSadaf Ebrahimi while (counter < size_lines && strncmp(list_lines[counter], "// !# ", 6))
144*9a0e4156SSadaf Ebrahimi counter++;
145*9a0e4156SSadaf Ebrahimi
146*9a0e4156SSadaf Ebrahimi if (e_flag == 0)
147*9a0e4156SSadaf Ebrahimi list_params = split(list_lines[counter] + 3, ", ", &size_params);
148*9a0e4156SSadaf Ebrahimi else
149*9a0e4156SSadaf Ebrahimi list_params = split(list_lines[counter] + 6, ", ", &size_params);
150*9a0e4156SSadaf Ebrahimi
151*9a0e4156SSadaf Ebrahimi arch = get_value(arches, NUMARCH, list_params[0]);
152*9a0e4156SSadaf Ebrahimi
153*9a0e4156SSadaf Ebrahimi if (!strcmp(list_params[0], "CS_ARCH_ARM64"))
154*9a0e4156SSadaf Ebrahimi mc_mode = 2;
155*9a0e4156SSadaf Ebrahimi else
156*9a0e4156SSadaf Ebrahimi mc_mode = 1;
157*9a0e4156SSadaf Ebrahimi
158*9a0e4156SSadaf Ebrahimi mode = 0;
159*9a0e4156SSadaf Ebrahimi for (i = 0; i < NUMMODE; ++i) {
160*9a0e4156SSadaf Ebrahimi if (strstr(list_params[1], modes[i].str)) {
161*9a0e4156SSadaf Ebrahimi mode += modes[i].value;
162*9a0e4156SSadaf Ebrahimi switch (modes[i].value) {
163*9a0e4156SSadaf Ebrahimi case CS_MODE_16:
164*9a0e4156SSadaf Ebrahimi mc_mode = 0;
165*9a0e4156SSadaf Ebrahimi break;
166*9a0e4156SSadaf Ebrahimi case CS_MODE_64:
167*9a0e4156SSadaf Ebrahimi mc_mode = 2;
168*9a0e4156SSadaf Ebrahimi break;
169*9a0e4156SSadaf Ebrahimi case CS_MODE_THUMB:
170*9a0e4156SSadaf Ebrahimi mc_mode = 1;
171*9a0e4156SSadaf Ebrahimi break;
172*9a0e4156SSadaf Ebrahimi default:
173*9a0e4156SSadaf Ebrahimi break;
174*9a0e4156SSadaf Ebrahimi }
175*9a0e4156SSadaf Ebrahimi }
176*9a0e4156SSadaf Ebrahimi }
177*9a0e4156SSadaf Ebrahimi
178*9a0e4156SSadaf Ebrahimi if (arch == -1) {
179*9a0e4156SSadaf Ebrahimi fprintf(stderr, "[ ERROR ] --- Arch is not supported!\n");
180*9a0e4156SSadaf Ebrahimi failed_setup = 1;
181*9a0e4156SSadaf Ebrahimi return -1;
182*9a0e4156SSadaf Ebrahimi }
183*9a0e4156SSadaf Ebrahimi
184*9a0e4156SSadaf Ebrahimi handle = (csh *)calloc(1, sizeof(csh));
185*9a0e4156SSadaf Ebrahimi if(cs_open(arch, mode, handle) != CS_ERR_OK) {
186*9a0e4156SSadaf Ebrahimi fprintf(stderr, "[ ERROR ] --- Cannot initialize capstone\n");
187*9a0e4156SSadaf Ebrahimi failed_setup = 1;
188*9a0e4156SSadaf Ebrahimi return -1;
189*9a0e4156SSadaf Ebrahimi }
190*9a0e4156SSadaf Ebrahimi
191*9a0e4156SSadaf Ebrahimi for (i = 0; i < NUMOPTION; ++i) {
192*9a0e4156SSadaf Ebrahimi if (strstr(list_params[2], options[i].str)) {
193*9a0e4156SSadaf Ebrahimi if (cs_option(*handle, options[i].first_value, options[i].second_value) != CS_ERR_OK) {
194*9a0e4156SSadaf Ebrahimi fprintf(stderr, "[ ERROR ] --- Option is not supported for this arch/mode\n");
195*9a0e4156SSadaf Ebrahimi failed_setup = 1;
196*9a0e4156SSadaf Ebrahimi return -1;
197*9a0e4156SSadaf Ebrahimi }
198*9a0e4156SSadaf Ebrahimi
199*9a0e4156SSadaf Ebrahimi if (i == 0) {
200*9a0e4156SSadaf Ebrahimi result = set_function(arch);
201*9a0e4156SSadaf Ebrahimi if (result == -1) {
202*9a0e4156SSadaf Ebrahimi fprintf(stderr, "[ ERROR ] --- Cannot get details\n");
203*9a0e4156SSadaf Ebrahimi failed_setup = 1;
204*9a0e4156SSadaf Ebrahimi return -1;
205*9a0e4156SSadaf Ebrahimi }
206*9a0e4156SSadaf Ebrahimi
207*9a0e4156SSadaf Ebrahimi getDetail = 1;
208*9a0e4156SSadaf Ebrahimi }
209*9a0e4156SSadaf Ebrahimi }
210*9a0e4156SSadaf Ebrahimi }
211*9a0e4156SSadaf Ebrahimi
212*9a0e4156SSadaf Ebrahimi *state = (void *)handle;
213*9a0e4156SSadaf Ebrahimi issue_mode = mode;
214*9a0e4156SSadaf Ebrahimi
215*9a0e4156SSadaf Ebrahimi if (e_flag == 0)
216*9a0e4156SSadaf Ebrahimi while (counter < size_lines && strncmp(list_lines[counter], "0x", 2))
217*9a0e4156SSadaf Ebrahimi counter++;
218*9a0e4156SSadaf Ebrahimi else
219*9a0e4156SSadaf Ebrahimi while (counter < size_lines && strncmp(list_lines[counter], "// 0x", 5))
220*9a0e4156SSadaf Ebrahimi counter++;
221*9a0e4156SSadaf Ebrahimi
222*9a0e4156SSadaf Ebrahimi free_strs(list_params, size_params);
223*9a0e4156SSadaf Ebrahimi return 0;
224*9a0e4156SSadaf Ebrahimi }
225*9a0e4156SSadaf Ebrahimi
test_issue(void ** state)226*9a0e4156SSadaf Ebrahimi static void test_issue(void **state)
227*9a0e4156SSadaf Ebrahimi {
228*9a0e4156SSadaf Ebrahimi if (e_flag == 0)
229*9a0e4156SSadaf Ebrahimi test_single_issue((csh *)*state, issue_mode, list_lines[counter], getDetail);
230*9a0e4156SSadaf Ebrahimi else
231*9a0e4156SSadaf Ebrahimi test_single_issue((csh *)*state, issue_mode, list_lines[counter] + 3, getDetail);
232*9a0e4156SSadaf Ebrahimi
233*9a0e4156SSadaf Ebrahimi return;
234*9a0e4156SSadaf Ebrahimi }
235*9a0e4156SSadaf Ebrahimi
teardown_issue(void ** state)236*9a0e4156SSadaf Ebrahimi static int teardown_issue(void **state)
237*9a0e4156SSadaf Ebrahimi {
238*9a0e4156SSadaf Ebrahimi if (e_flag == 0)
239*9a0e4156SSadaf Ebrahimi while (counter < size_lines && strncmp(list_lines[counter], "!# ", 3))
240*9a0e4156SSadaf Ebrahimi counter++;
241*9a0e4156SSadaf Ebrahimi else
242*9a0e4156SSadaf Ebrahimi while (counter < size_lines && strncmp(list_lines[counter], "// !# ", 6))
243*9a0e4156SSadaf Ebrahimi counter++;
244*9a0e4156SSadaf Ebrahimi
245*9a0e4156SSadaf Ebrahimi cs_close(*state);
246*9a0e4156SSadaf Ebrahimi free(*state);
247*9a0e4156SSadaf Ebrahimi function = NULL;
248*9a0e4156SSadaf Ebrahimi return 0;
249*9a0e4156SSadaf Ebrahimi }
250*9a0e4156SSadaf Ebrahimi
test_file(const char * filename)251*9a0e4156SSadaf Ebrahimi static void test_file(const char *filename)
252*9a0e4156SSadaf Ebrahimi {
253*9a0e4156SSadaf Ebrahimi int size, i;
254*9a0e4156SSadaf Ebrahimi char **list_str;
255*9a0e4156SSadaf Ebrahimi char *content, *tmp;
256*9a0e4156SSadaf Ebrahimi struct CMUnitTest *tests;
257*9a0e4156SSadaf Ebrahimi int issue_num, number_of_tests;
258*9a0e4156SSadaf Ebrahimi
259*9a0e4156SSadaf Ebrahimi printf("[+] TARGET: %s\n", filename);
260*9a0e4156SSadaf Ebrahimi content = readfile(filename);
261*9a0e4156SSadaf Ebrahimi counter = 0;
262*9a0e4156SSadaf Ebrahimi failed_setup = 0;
263*9a0e4156SSadaf Ebrahimi function = NULL;
264*9a0e4156SSadaf Ebrahimi
265*9a0e4156SSadaf Ebrahimi if (strstr(filename, "issue")) {
266*9a0e4156SSadaf Ebrahimi number_of_tests = 0;
267*9a0e4156SSadaf Ebrahimi list_lines = split(content, "\n", &size_lines);
268*9a0e4156SSadaf Ebrahimi tests = NULL;
269*9a0e4156SSadaf Ebrahimi for (i = 0; i < size_lines; ++i) {
270*9a0e4156SSadaf Ebrahimi if ((!strncmp(list_lines[i], "// !# issue", 11) && e_flag == 1) ||
271*9a0e4156SSadaf Ebrahimi (!strncmp(list_lines[i], "!# issue", 8) && e_flag == 0)) {
272*9a0e4156SSadaf Ebrahimi tests = (struct CMUnitTest *)realloc(tests, sizeof(struct CMUnitTest) * (number_of_tests + 1));
273*9a0e4156SSadaf Ebrahimi tests[number_of_tests] = (struct CMUnitTest)cmocka_unit_test_setup_teardown(test_issue, setup_issue, teardown_issue);
274*9a0e4156SSadaf Ebrahimi tests[number_of_tests].name = strdup(list_lines[i]);
275*9a0e4156SSadaf Ebrahimi number_of_tests ++;
276*9a0e4156SSadaf Ebrahimi }
277*9a0e4156SSadaf Ebrahimi }
278*9a0e4156SSadaf Ebrahimi
279*9a0e4156SSadaf Ebrahimi _cmocka_run_group_tests("Testing issues", tests, number_of_tests, NULL, NULL);
280*9a0e4156SSadaf Ebrahimi } else {
281*9a0e4156SSadaf Ebrahimi list_lines = split(content, "\n", &size_lines);
282*9a0e4156SSadaf Ebrahimi number_of_tests = 0;
283*9a0e4156SSadaf Ebrahimi
284*9a0e4156SSadaf Ebrahimi tests = NULL;
285*9a0e4156SSadaf Ebrahimi for (i = 1; i < size_lines; ++i) {
286*9a0e4156SSadaf Ebrahimi if ((!strncmp(list_lines[i], "// 0x", 5) && e_flag == 1) || (!strncmp(list_lines[i], "0x", 2) && e_flag == 0)) {
287*9a0e4156SSadaf Ebrahimi tmp = (char *)malloc(sizeof(char) * 100);
288*9a0e4156SSadaf Ebrahimi sprintf(tmp, "Line %d", i+1);
289*9a0e4156SSadaf Ebrahimi tests = (struct CMUnitTest *)realloc(tests, sizeof(struct CMUnitTest) * (number_of_tests + 1));
290*9a0e4156SSadaf Ebrahimi tests[number_of_tests] = (struct CMUnitTest)cmocka_unit_test_setup_teardown(test_MC, setup_MC, teardown_MC);
291*9a0e4156SSadaf Ebrahimi tests[number_of_tests].name = tmp;
292*9a0e4156SSadaf Ebrahimi number_of_tests ++;
293*9a0e4156SSadaf Ebrahimi }
294*9a0e4156SSadaf Ebrahimi }
295*9a0e4156SSadaf Ebrahimi
296*9a0e4156SSadaf Ebrahimi _cmocka_run_group_tests("Testing MC", tests, number_of_tests, NULL, NULL);
297*9a0e4156SSadaf Ebrahimi }
298*9a0e4156SSadaf Ebrahimi
299*9a0e4156SSadaf Ebrahimi printf("[+] DONE: %s\n", filename);
300*9a0e4156SSadaf Ebrahimi printf("[!] Noted:\n[ ERROR ] --- \"<capstone result>\" != \"<user result>\"\n");
301*9a0e4156SSadaf Ebrahimi printf("\n\n");
302*9a0e4156SSadaf Ebrahimi free_strs(list_lines, size_lines);
303*9a0e4156SSadaf Ebrahimi }
304*9a0e4156SSadaf Ebrahimi
test_folder(const char * folder)305*9a0e4156SSadaf Ebrahimi static void test_folder(const char *folder)
306*9a0e4156SSadaf Ebrahimi {
307*9a0e4156SSadaf Ebrahimi char **files;
308*9a0e4156SSadaf Ebrahimi int num_files, i;
309*9a0e4156SSadaf Ebrahimi
310*9a0e4156SSadaf Ebrahimi files = NULL;
311*9a0e4156SSadaf Ebrahimi num_files = 0;
312*9a0e4156SSadaf Ebrahimi listdir(folder, &files, &num_files);
313*9a0e4156SSadaf Ebrahimi for (i = 0; i < num_files; ++i) {
314*9a0e4156SSadaf Ebrahimi if (strcmp("cs", get_filename_ext(files[i])))
315*9a0e4156SSadaf Ebrahimi continue;
316*9a0e4156SSadaf Ebrahimi test_file(files[i]);
317*9a0e4156SSadaf Ebrahimi }
318*9a0e4156SSadaf Ebrahimi }
319*9a0e4156SSadaf Ebrahimi
main(int argc,char * argv[])320*9a0e4156SSadaf Ebrahimi int main(int argc, char *argv[])
321*9a0e4156SSadaf Ebrahimi {
322*9a0e4156SSadaf Ebrahimi int opt, flag;
323*9a0e4156SSadaf Ebrahimi
324*9a0e4156SSadaf Ebrahimi flag = 0;
325*9a0e4156SSadaf Ebrahimi e_flag = 0;
326*9a0e4156SSadaf Ebrahimi
327*9a0e4156SSadaf Ebrahimi while ((opt = getopt(argc, argv, "ef:d:")) > 0) {
328*9a0e4156SSadaf Ebrahimi switch (opt) {
329*9a0e4156SSadaf Ebrahimi case 'f':
330*9a0e4156SSadaf Ebrahimi test_file(optarg);
331*9a0e4156SSadaf Ebrahimi flag = 1;
332*9a0e4156SSadaf Ebrahimi break;
333*9a0e4156SSadaf Ebrahimi case 'd':
334*9a0e4156SSadaf Ebrahimi test_folder(optarg);
335*9a0e4156SSadaf Ebrahimi flag = 1;
336*9a0e4156SSadaf Ebrahimi break;
337*9a0e4156SSadaf Ebrahimi case 'e':
338*9a0e4156SSadaf Ebrahimi e_flag = 1;
339*9a0e4156SSadaf Ebrahimi break;
340*9a0e4156SSadaf Ebrahimi default:
341*9a0e4156SSadaf Ebrahimi printf("Usage: %s [-e] [-f <file_name.cs>] [-d <directory>]\n", argv[0]);
342*9a0e4156SSadaf Ebrahimi exit(-1);
343*9a0e4156SSadaf Ebrahimi }
344*9a0e4156SSadaf Ebrahimi }
345*9a0e4156SSadaf Ebrahimi
346*9a0e4156SSadaf Ebrahimi if (flag == 0) {
347*9a0e4156SSadaf Ebrahimi printf("Usage: %s [-e] [-f <file_name.cs>] [-d <directory>]\n", argv[0]);
348*9a0e4156SSadaf Ebrahimi exit(-1);
349*9a0e4156SSadaf Ebrahimi }
350*9a0e4156SSadaf Ebrahimi
351*9a0e4156SSadaf Ebrahimi return 0;
352*9a0e4156SSadaf Ebrahimi }
353