From 101d5ad1f3e864f3b6442b6063151ffb47178099 Mon Sep 17 00:00:00 2001 From: katherine Date: Thu, 23 May 2019 03:23:59 -0700 Subject: add basetype-use-checks to analyse --- src/analyse.c | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 110 insertions(+), 1 deletion(-) (limited to 'src/analyse.c') diff --git a/src/analyse.c b/src/analyse.c index 9510f5a..e454f6c 100644 --- a/src/analyse.c +++ b/src/analyse.c @@ -6,7 +6,20 @@ struct analyse_result_s analyse(struct parse_result_s pr) { - struct analyse_result_s ar; + struct analyse_result_s ar = { + .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, + }; struct parse_deftype_s *dtp, *tmp_dtp; struct parse_var_s *vtp, *tmp_vtp; struct analyse_tree_s *cur; @@ -70,6 +83,102 @@ struct analyse_result_s analyse(struct parse_result_s pr) } } + HASH_ITER(hh, pr.vars, vtp, tmp_vtp) { + switch (vtp->type + - (PARSE_TYPE_ARRAY_BOOL * (vtp->type >= PARSE_TYPE_ARRAY_BOOL)) + - (PARSE_TYPE_ARRAY_BOOL * (vtp->type >= 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: + HASH_FIND_STR(pr.deftypes, vtp->deftype_name, dtp); + assert(dtp != NULL); + for (i = 0; i < dtp->member_list_len; i++) { + switch (dtp->member_type_list[i] + - (PARSE_TYPE_ARRAY_BOOL * + (dtp->member_type_list[i] >= PARSE_TYPE_ARRAY_BOOL) + ) + - (PARSE_TYPE_ARRAY_BOOL * + (dtp->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); + } + } + } + } + return ar; } -- cgit v1.2.3