aboutsummaryrefslogtreecommitdiffstats
path: root/src/analyse.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/analyse.c')
-rw-r--r--src/analyse.c111
1 files changed, 110 insertions, 1 deletions
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;
}