15bb525f4SRobert Mustacchi /*
25bb525f4SRobert Mustacchi  * This file and its contents are supplied under the terms of the
35bb525f4SRobert Mustacchi  * Common Development and Distribution License ("CDDL"), version 1.0.
45bb525f4SRobert Mustacchi  * You may only use this file in accordance with the terms of version
55bb525f4SRobert Mustacchi  * 1.0 of the CDDL.
65bb525f4SRobert Mustacchi  *
75bb525f4SRobert Mustacchi  * A full copy of the text of the CDDL should have accompanied this
85bb525f4SRobert Mustacchi  * source.  A copy of the CDDL is also available via the Internet at
95bb525f4SRobert Mustacchi  * http://www.illumos.org/license/CDDL.
105bb525f4SRobert Mustacchi  */
115bb525f4SRobert Mustacchi 
125bb525f4SRobert Mustacchi /*
13*fe2dc8bdSJohn Levon  * Copyright 2020 Joyent, Inc.
145bb525f4SRobert Mustacchi  */
155bb525f4SRobert Mustacchi 
165bb525f4SRobert Mustacchi /*
175bb525f4SRobert Mustacchi  * Check that we properly handle enums.
185bb525f4SRobert Mustacchi  */
195bb525f4SRobert Mustacchi 
205bb525f4SRobert Mustacchi #include "check-common.h"
215bb525f4SRobert Mustacchi 
225bb525f4SRobert Mustacchi static check_symbol_t check_syms[] = {
235bb525f4SRobert Mustacchi 	{ "ff6", "enum ff6" },
245bb525f4SRobert Mustacchi 	{ "ff10", "ff10_t" },
255bb525f4SRobert Mustacchi 	{ NULL }
265bb525f4SRobert Mustacchi };
275bb525f4SRobert Mustacchi 
285bb525f4SRobert Mustacchi static check_descent_t check_descent_ff6[] = {
295bb525f4SRobert Mustacchi 	{ "enum ff6", CTF_K_ENUM },
305bb525f4SRobert Mustacchi 	{ NULL }
315bb525f4SRobert Mustacchi };
325bb525f4SRobert Mustacchi 
335bb525f4SRobert Mustacchi static check_descent_t check_descent_ff10[] = {
345bb525f4SRobert Mustacchi 	{ "ff10_t", CTF_K_TYPEDEF },
355bb525f4SRobert Mustacchi 	{ "enum ff10", CTF_K_ENUM },
365bb525f4SRobert Mustacchi 	{ NULL }
375bb525f4SRobert Mustacchi };
385bb525f4SRobert Mustacchi 
395bb525f4SRobert Mustacchi static check_descent_t check_descent_chrono[] = {
405bb525f4SRobert Mustacchi 	{ "chrono_t", CTF_K_TYPEDEF },
415bb525f4SRobert Mustacchi 	{ "enum chrono", CTF_K_ENUM },
425bb525f4SRobert Mustacchi 	{ NULL }
435bb525f4SRobert Mustacchi };
445bb525f4SRobert Mustacchi 
455bb525f4SRobert Mustacchi static check_descent_test_t descents[] = {
465bb525f4SRobert Mustacchi 	{ "ff10", check_descent_ff10 },
475bb525f4SRobert Mustacchi 	{ "ff6", check_descent_ff6 },
485bb525f4SRobert Mustacchi 	{ "trigger", check_descent_chrono },
495bb525f4SRobert Mustacchi 	{ NULL }
505bb525f4SRobert Mustacchi };
515bb525f4SRobert Mustacchi 
525bb525f4SRobert Mustacchi static check_enum_t check_enum_ff6[] = {
535bb525f4SRobert Mustacchi 	{ "TERRA", 0 },
545bb525f4SRobert Mustacchi 	{ "LOCKE", 1 },
555bb525f4SRobert Mustacchi 	{ "EDGAR", 2 },
565bb525f4SRobert Mustacchi 	{ "SABIN", 3 },
575bb525f4SRobert Mustacchi 	{ "CELES", 4 },
585bb525f4SRobert Mustacchi 	{ "CYAN", 5 },
595bb525f4SRobert Mustacchi 	{ "SHADOW", 6 },
605bb525f4SRobert Mustacchi 	{ "GAU", 7 },
615bb525f4SRobert Mustacchi 	{ "SETZER", 8 },
625bb525f4SRobert Mustacchi 	{ "STRAGO", 9 },
635bb525f4SRobert Mustacchi 	{ "RELM", 10 },
645bb525f4SRobert Mustacchi 	{ "MOG", 11 },
655bb525f4SRobert Mustacchi 	{ "GOGO", 12 },
665bb525f4SRobert Mustacchi 	{ "UMARO", 13 },
675bb525f4SRobert Mustacchi 	{ "LEO", 14 },
685bb525f4SRobert Mustacchi 	{ "KEFKA", 15 },
695bb525f4SRobert Mustacchi 	{ NULL }
705bb525f4SRobert Mustacchi };
715bb525f4SRobert Mustacchi 
725bb525f4SRobert Mustacchi static check_enum_t check_enum_ff10[] = {
735bb525f4SRobert Mustacchi 	{ "TIDUS", -10 },
745bb525f4SRobert Mustacchi 	{ "YUNA", 23 },
755bb525f4SRobert Mustacchi 	{ "AURON", -34 },
765bb525f4SRobert Mustacchi 	{ "WAKA", 52 },
775bb525f4SRobert Mustacchi 	{ "LULU", INT32_MAX },
785bb525f4SRobert Mustacchi 	{ "RIKKU", INT32_MIN },
795bb525f4SRobert Mustacchi 	{ "KHIMARI", 0 },
805bb525f4SRobert Mustacchi 	{ NULL }
815bb525f4SRobert Mustacchi };
825bb525f4SRobert Mustacchi 
835bb525f4SRobert Mustacchi static check_enum_t check_enum_chrono[] = {
845bb525f4SRobert Mustacchi 	{ "CRONO", 0x1000 },
855bb525f4SRobert Mustacchi 	{ "LUCCA", 0x2000 },
865bb525f4SRobert Mustacchi 	{ "MARLE", 0x3000 },
875bb525f4SRobert Mustacchi 	{ "FROG", 0x4000 },
885bb525f4SRobert Mustacchi 	{ "ROBO", 0x5000 },
895bb525f4SRobert Mustacchi 	{ "AYLA", 0x6000 },
905bb525f4SRobert Mustacchi 	{ "MAGUS", 0x7000 },
915bb525f4SRobert Mustacchi 	{ "SCHALA", 0x8000 },
925bb525f4SRobert Mustacchi 	{ "LAVOS", 0x9000 },
935bb525f4SRobert Mustacchi 	{ "BALTHAZAR", 0xa000 },
945bb525f4SRobert Mustacchi 	{ NULL }
955bb525f4SRobert Mustacchi };
965bb525f4SRobert Mustacchi 
975bb525f4SRobert Mustacchi static check_enum_test_t enums[] = {
985bb525f4SRobert Mustacchi 	{ "enum ff6", check_enum_ff6 },
995bb525f4SRobert Mustacchi 	{ "enum ff10", check_enum_ff10 },
1005bb525f4SRobert Mustacchi 	{ "enum chrono", check_enum_chrono },
1015bb525f4SRobert Mustacchi 	{ NULL }
1025bb525f4SRobert Mustacchi };
1035bb525f4SRobert Mustacchi 
104*fe2dc8bdSJohn Levon static check_size_test_t size_enums[] = {
105*fe2dc8bdSJohn Levon 	{ "enum char_enum", 1 },
106*fe2dc8bdSJohn Levon 	{ "enum short_enum", 2 },
107*fe2dc8bdSJohn Levon 	{ "enum int_enum", 4 },
108*fe2dc8bdSJohn Levon 	{ "enum ll_enum", 8 },
109*fe2dc8bdSJohn Levon 	{ NULL }
110*fe2dc8bdSJohn Levon };
111*fe2dc8bdSJohn Levon 
1125bb525f4SRobert Mustacchi int
main(int argc,char * argv[])1135bb525f4SRobert Mustacchi main(int argc, char *argv[])
1145bb525f4SRobert Mustacchi {
1155bb525f4SRobert Mustacchi 	int i, ret = 0;
1165bb525f4SRobert Mustacchi 
1175bb525f4SRobert Mustacchi 	if (argc < 2) {
1185bb525f4SRobert Mustacchi 		errx(EXIT_FAILURE, "missing test files");
1195bb525f4SRobert Mustacchi 	}
1205bb525f4SRobert Mustacchi 
1215bb525f4SRobert Mustacchi 	for (i = 1; i < argc; i++) {
1225bb525f4SRobert Mustacchi 		ctf_file_t *fp;
1235bb525f4SRobert Mustacchi 		uint_t d;
1245bb525f4SRobert Mustacchi 
1255bb525f4SRobert Mustacchi 		if ((fp = ctf_open(argv[i], &ret)) == NULL) {
1265bb525f4SRobert Mustacchi 			warnx("failed to open %s: %s", argv[i],
1275bb525f4SRobert Mustacchi 			    ctf_errmsg(ret));
1285bb525f4SRobert Mustacchi 			ret = EXIT_FAILURE;
1295bb525f4SRobert Mustacchi 			continue;
1305bb525f4SRobert Mustacchi 		}
1315bb525f4SRobert Mustacchi 		if (!ctftest_check_symbols(fp, check_syms))
1325bb525f4SRobert Mustacchi 			ret = EXIT_FAILURE;
1335bb525f4SRobert Mustacchi 		for (d = 0; descents[d].cdt_sym != NULL; d++) {
1345bb525f4SRobert Mustacchi 			if (!ctftest_check_descent(descents[d].cdt_sym, fp,
1356ef284f1SJohn Levon 			    descents[d].cdt_tests, B_FALSE)) {
1365bb525f4SRobert Mustacchi 				ret = EXIT_FAILURE;
1375bb525f4SRobert Mustacchi 			}
1385bb525f4SRobert Mustacchi 		}
1395bb525f4SRobert Mustacchi 
1405bb525f4SRobert Mustacchi 		for (d = 0; enums[d].cet_type != NULL; d++) {
1415bb525f4SRobert Mustacchi 			if (!ctftest_check_enum(enums[d].cet_type, fp,
1425bb525f4SRobert Mustacchi 			    enums[d].cet_tests)) {
1435bb525f4SRobert Mustacchi 				ret = EXIT_FAILURE;
1445bb525f4SRobert Mustacchi 			}
1455bb525f4SRobert Mustacchi 		}
146*fe2dc8bdSJohn Levon 
147*fe2dc8bdSJohn Levon 		for (d = 0; size_enums[d].cst_name != NULL; d++) {
148*fe2dc8bdSJohn Levon 			if (!ctftest_check_size(size_enums[d].cst_name,
149*fe2dc8bdSJohn Levon 			    fp, size_enums[d].cst_size)) {
150*fe2dc8bdSJohn Levon 				ret = EXIT_FAILURE;
151*fe2dc8bdSJohn Levon 			}
152*fe2dc8bdSJohn Levon 		}
153*fe2dc8bdSJohn Levon 
1545bb525f4SRobert Mustacchi 		ctf_close(fp);
1555bb525f4SRobert Mustacchi 	}
1565bb525f4SRobert Mustacchi 
1575bb525f4SRobert Mustacchi 	return (ret);
1585bb525f4SRobert Mustacchi 
1595bb525f4SRobert Mustacchi }
160