aboutsummaryrefslogtreecommitdiffstats
path: root/src/analyse.c
diff options
context:
space:
mode:
authorkatherine <k@airen-no-jikken.icu>2019-05-29 17:11:35 -0700
committerkatherine <k@airen-no-jikken.icu>2019-05-29 17:11:35 -0700
commit58e3054794cde4148267d81c80cc3109fbd19298 (patch)
tree9ff89bc2297dbea6e16773e35e09f62c7d53e735 /src/analyse.c
parentea615e59178d76f887bc8e36cb8063095da20731 (diff)
downloadconfconf-58e3054794cde4148267d81c80cc3109fbd19298.tar.gz
update usage checking
Diffstat (limited to 'src/analyse.c')
-rw-r--r--src/analyse.c151
1 files changed, 43 insertions, 108 deletions
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;