mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-03-21 18:01:15 +00:00
[qfcc] Make a general integral value extractor
All too often I just want the value.
This commit is contained in:
parent
80967e1471
commit
c3f04384d5
2 changed files with 58 additions and 0 deletions
|
@ -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 <code>.self</code> entity variable.
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue