From 58e3054794cde4148267d81c80cc3109fbd19298 Mon Sep 17 00:00:00 2001 From: katherine Date: Wed, 29 May 2019 17:11:35 -0700 Subject: update usage checking --- src/analyse.c | 151 +++++++++++++++++----------------------------------------- 1 file changed, 43 insertions(+), 108 deletions(-) (limited to 'src/analyse.c') diff --git a/src/analyse.c b/src/analyse.c index e0e5fa6..416b10a 100644 --- a/src/analyse.c +++ b/src/analyse.c @@ -7,31 +7,27 @@ struct analyse_result_s analyse(struct parse_result_s pr) { struct analyse_result_s ar = { - .uses_array = false, .uses_hash = false, - .uses_bool = false, - .uses_string = false, - .uses_id = false, - .uses_int = false, - .uses_intl = false, - .uses_intll = false, - .uses_uint = false, - .uses_uintl = false, - .uses_uintll = false, - .uses_float = false, - .uses_double = false, - .uses_doublel = false, + .uses_array = false, }; struct parse_deftype_s *dcur, *dtmp; struct parse_var_s *vcur, *vtmp; struct analyse_tree_s *cur; unsigned i; + + /*************** + * BUILD TREES * + ***************/ + ar.deftype_tree.branch_count = 0; ar.deftype_tree.is_terminal = false; if (pr.deftypes != NULL) { HASH_ITER(hh, pr.deftypes, dcur, dtmp) { + if (!dcur->is_used) + continue; + cur = &(ar.deftype_tree); /* walk down the tree, creating nodes when necessary */ @@ -85,111 +81,50 @@ struct analyse_result_s analyse(struct parse_result_s pr) } } - for (i = 0; i < PARSE_TYPE_ARRAY_BOOL; i++) - ar.hash_types[i] = false; + + /************************ + * CALCULATE USED TYPES * + ************************/ + + for (i = PARSE_TYPE_BOOL; i < PARSE_TYPE_HASH_DEFTYPE; i++) + ar.uses_type[i] = false; + + HASH_ITER(hh, pr.deftypes, dcur, dtmp) { + if (!dcur->is_used) + continue; + + for (i = 0; i < dcur->member_list_len; i++) { + if (dcur->member_type_list[i] >= PARSE_TYPE_HASH_BOOL) { + ar.uses_hash = true; + ar.uses_type[dcur->member_type_list[i] + - PARSE_TYPE_HASH_BOOL] = true; + } else if (dcur->member_type_list[i] >= PARSE_TYPE_ARRAY_BOOL) { + ar.uses_array = true; + ar.uses_type[dcur->member_type_list[i] + - PARSE_TYPE_ARRAY_BOOL] = true; + } + + ar.uses_type[dcur->member_type_list[i]] = true; + } + } HASH_ITER(hh, pr.vars, vcur, vtmp) { if (vcur->type >= PARSE_TYPE_HASH_BOOL) { ar.uses_hash = true; - ar.uses_id = true; - ar.hash_types[vcur->type - PARSE_TYPE_HASH_BOOL] = true; + ar.uses_type[vcur->type - PARSE_TYPE_HASH_BOOL] = true; } else if (vcur->type >= PARSE_TYPE_ARRAY_BOOL) { ar.uses_array = true; + ar.uses_type[vcur->type - PARSE_TYPE_ARRAY_BOOL] = true; } - switch (vcur->type - - (PARSE_TYPE_ARRAY_BOOL * (vcur->type >= PARSE_TYPE_ARRAY_BOOL)) - - (PARSE_TYPE_ARRAY_BOOL * (vcur->type >= PARSE_TYPE_HASH_BOOL)) + if (vcur->type == PARSE_TYPE_DEFTYPE + || vcur->type == PARSE_TYPE_ARRAY_DEFTYPE + || vcur->type == PARSE_TYPE_HASH_DEFTYPE ) { - case PARSE_TYPE_BOOL: - ar.uses_bool = true; - break; - case PARSE_TYPE_STRING: - ar.uses_string = true; - break; - case PARSE_TYPE_ID: - ar.uses_id = true; - break; - case PARSE_TYPE_INT: - ar.uses_int = true; - break; - case PARSE_TYPE_INTL: - ar.uses_intl = true; - break; - case PARSE_TYPE_INTLL: - ar.uses_intll = true; - break; - case PARSE_TYPE_UINT: - ar.uses_uint = true; - break; - case PARSE_TYPE_UINTL: - ar.uses_uintl = true; - break; - case PARSE_TYPE_UINTLL: - ar.uses_uintll = true; - break; - case PARSE_TYPE_FLOAT: - ar.uses_float = true; - break; - case PARSE_TYPE_DOUBLE: - ar.uses_double = true; - break; - case PARSE_TYPE_DOUBLEL: - ar.uses_doublel = true; - break; - default: - HASH_FIND_STR(pr.deftypes, vcur->deftype_name, dcur); - assert(dcur != NULL); - for (i = 0; i < dcur->member_list_len; i++) { - switch (dcur->member_type_list[i] - - (PARSE_TYPE_ARRAY_BOOL * - (dcur->member_type_list[i] >= PARSE_TYPE_ARRAY_BOOL) - ) - - (PARSE_TYPE_ARRAY_BOOL * - (dcur->member_type_list[i] >= PARSE_TYPE_HASH_BOOL) - ) - ) { - case PARSE_TYPE_BOOL: - ar.uses_bool = true; - break; - case PARSE_TYPE_STRING: - ar.uses_string = true; - break; - case PARSE_TYPE_ID: - ar.uses_id = true; - break; - case PARSE_TYPE_INT: - ar.uses_int = true; - break; - case PARSE_TYPE_INTL: - ar.uses_intl = true; - break; - case PARSE_TYPE_INTLL: - ar.uses_intll = true; - break; - case PARSE_TYPE_UINT: - ar.uses_uint = true; - break; - case PARSE_TYPE_UINTL: - ar.uses_uintl = true; - break; - case PARSE_TYPE_UINTLL: - ar.uses_uintll = true; - break; - case PARSE_TYPE_FLOAT: - ar.uses_float = true; - break; - case PARSE_TYPE_DOUBLE: - ar.uses_double = true; - break; - case PARSE_TYPE_DOUBLEL: - ar.uses_doublel = true; - break; - default: - assert(false); - } - } + continue; } + + ar.uses_type[vcur->type] = true; } return ar; -- cgit v1.2.3