From c3f04384d565653f05f65fe6fd72815a71df7a7e Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Tue, 17 Mar 2020 11:07:50 +0900 Subject: [PATCH] [qfcc] Make a general integral value extractor All too often I just want the value. --- tools/qfcc/include/expr.h | 4 +++ tools/qfcc/source/expr.c | 54 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/tools/qfcc/include/expr.h b/tools/qfcc/include/expr.h index dc3a84f63..a181f7205 100644 --- a/tools/qfcc/include/expr.h +++ b/tools/qfcc/include/expr.h @@ -567,6 +567,8 @@ unsigned expr_uinteger (expr_t *e) __attribute__((pure)); expr_t *new_short_expr (short short_val); short expr_short (expr_t *e) __attribute__((pure)); +int expr_integral (expr_t *e) __attribute__((pure)); + /** Check of the expression refers to a constant value. \param e The expression to check. @@ -613,7 +615,9 @@ int is_float_val (expr_t *e) __attribute__((pure)); int is_vector_val (expr_t *e) __attribute__((pure)); int is_quaternion_val (expr_t *e) __attribute__((pure)); int is_integer_val (expr_t *e) __attribute__((pure)); +int is_uinteger_val (expr_t *e) __attribute__((pure)); int is_short_val (expr_t *e) __attribute__((pure)); +int is_integral_val (expr_t *e) __attribute__((pure)); /** Create a reference to the global .self entity variable. diff --git a/tools/qfcc/source/expr.c b/tools/qfcc/source/expr.c index 638af8e12..c8c9207fc 100644 --- a/tools/qfcc/source/expr.c +++ b/tools/qfcc/source/expr.c @@ -1082,6 +1082,26 @@ expr_integer (expr_t *e) internal_error (e, "not an integer constant"); } +int +is_uinteger_val (expr_t *e) +{ + if (e->type == ex_nil) { + return 1; + } + if (e->type == ex_value && e->e.value->lltype == ev_uinteger) { + return 1; + } + if (e->type == ex_symbol && e->e.symbol->sy_type == sy_const + && is_integral (e->e.symbol->type)) { + return 1; + } + if (e->type == ex_def && e->e.def->constant + && is_integral (e->e.def->type)) { + return 1; + } + return 0; +} + unsigned expr_uinteger (expr_t *e) { @@ -1139,6 +1159,40 @@ expr_short (expr_t *e) internal_error (e, "not a short constant"); } +int +is_integral_val (expr_t *e) +{ + if (is_constant (e)) { + if (is_integer_val (e)) { + return 1; + } + if (is_uinteger_val (e)) { + return 1; + } + if (is_short_val (e)) { + return 1; + } + } + return 0; +} + +int +expr_integral (expr_t *e) +{ + if (is_constant (e)) { + if (is_integer_val (e)) { + return expr_integer (e); + } + if (is_uinteger_val (e)) { + return expr_uinteger (e); + } + if (is_short_val (e)) { + return expr_short (e); + } + } + internal_error (e, "not an integral constant"); +} + expr_t * new_alias_expr (type_t *type, expr_t *expr) {