xref: /aosp_15_r20/external/capstone/suite/cstest/src/main.c (revision 9a0e4156d50a75a99ec4f1653a0e9602a5d45c18)
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