diff --git a/tools/qfcc/include/expr.h b/tools/qfcc/include/expr.h index a271a51f2..565f2f822 100644 --- a/tools/qfcc/include/expr.h +++ b/tools/qfcc/include/expr.h @@ -65,6 +65,8 @@ expr_t *new_unary_expr (int op, expr_t *e1); expr_t *append_expr (expr_t *block, expr_t *e); void print_expr (expr_t *e); + +expr_t *test_expr (expr_t *e, int test); expr_t *binary_expr (int op, expr_t *e1, expr_t *e2); expr_t *unary_expr (int op, expr_t *e); expr_t *function_expr (expr_t *e1, expr_t *e2); diff --git a/tools/qfcc/source/expr.c b/tools/qfcc/source/expr.c index 9f0197dec..eb8bd7784 100644 --- a/tools/qfcc/source/expr.c +++ b/tools/qfcc/source/expr.c @@ -357,8 +357,8 @@ do_op_string (int op, expr_t *e1, expr_t *e2) char *buf; char *s1, *s2; - s1 = e1->e.string_val; - s2 = e2->e.string_val; + s1 = e1->e.string_val ? e1->e.string_val : ""; + s2 = e2->e.string_val ? e2->e.string_val : ""; switch (op) { case '+': @@ -619,7 +619,7 @@ field_expr (expr_t *e1, expr_t *e2) return e; } -static expr_t * +expr_t * test_expr (expr_t *e, int test) { expr_t *new = 0; @@ -669,7 +669,12 @@ test_expr (expr_t *e, int test) new->type = ex_quaternion; break; } - return binary_expr (NE, e, new); + new->line = e->line; + new->file = e->file; + new = binary_expr (NE, e, new); + new->line = e->line; + new->file = e->file; + return new; } void @@ -932,9 +937,9 @@ function_expr (expr_t *e1, expr_t *e2) if (err) return err; } else { - for (e = e2; e; e = e->next) - if (e->type == ex_integer) - warning (e, "passing integer consant into ... function"); + //for (e = e2; e; e = e->next) + // if (e->type == ex_integer) + // warning (e, "passing integer consant into ... function"); } e = new_binary_expr ('c', e1, e2); e->e.expr.type = ftype->aux_type; diff --git a/tools/qfcc/source/pr_imm.c b/tools/qfcc/source/pr_imm.c index ab34cdbab..96cd16965 100644 --- a/tools/qfcc/source/pr_imm.c +++ b/tools/qfcc/source/pr_imm.c @@ -178,6 +178,12 @@ PR_ReuseConstant (expr_t *expr, def_t *def) pointer_imm_defs = Hash_NewTable (16381, int_imm_get_key, 0, "pointer"); quaternion_imm_defs = Hash_NewTable (16381, quaternion_imm_get_key, 0, 0); integer_imm_defs = Hash_NewTable (16381, int_imm_get_key, 0, "integer"); + + Hash_Add (string_imm_defs, PR_NewDef (&type_string, ".imm", 0)); + Hash_Add (float_imm_defs, PR_NewDef (&type_float, ".imm", 0)); + Hash_Add (entity_imm_defs, PR_NewDef (&type_entity, ".imm", 0)); + Hash_Add (pointer_imm_defs, PR_NewDef (&type_pointer, ".imm", 0)); + Hash_Add (integer_imm_defs, PR_NewDef (&type_integer, ".imm", 0)); } switch (e.type) { case ex_entity: @@ -214,7 +220,7 @@ PR_ReuseConstant (expr_t *expr, def_t *def) type = &type_float; break; case ex_string: - r = e.e.string_val; + r = e.e.string_val ? e.e.string_val : ""; tab = string_imm_defs; type = &type_string; break; @@ -266,7 +272,7 @@ PR_ReuseConstant (expr_t *expr, def_t *def) cn->initialized = 1; // copy the immediate to the global area if (e.type == ex_string) - e.e.integer_val = CopyString (e.e.string_val); + e.e.integer_val = CopyString (r); memcpy (pr_globals + cn->ofs, &e.e, 4 * type_size[type->type]); diff --git a/tools/qfcc/source/qc-parse.y b/tools/qfcc/source/qc-parse.y index 49160bcc9..7e994d7d4 100644 --- a/tools/qfcc/source/qc-parse.y +++ b/tools/qfcc/source/qc-parse.y @@ -331,13 +331,13 @@ statement $$ = new_block_expr (); - e = new_binary_expr ('n', $3, l2); + e = new_binary_expr ('n', test_expr ($3, 1), l2); e->line = $3->line; e->file = $3->file; append_expr ($$, e); append_expr ($$, l1); append_expr ($$, $5); - e = new_binary_expr ('i', $3, l1); + e = new_binary_expr ('i', test_expr ($3, 1), l1); e->line = $3->line; e->file = $3->file; append_expr ($$, e); @@ -351,7 +351,7 @@ statement append_expr ($$, l1); append_expr ($$, $2); - append_expr ($$, new_binary_expr ('i', $5, l1)); + append_expr ($$, new_binary_expr ('i', test_expr ($5, 1), l1)); } | LOCAL type { @@ -370,7 +370,7 @@ statement $$ = new_block_expr (); - e = new_binary_expr ('n', $3, l1); + e = new_binary_expr ('n', test_expr ($3, 1), l1); e->line = $3->line; e->file = $3->file; append_expr ($$, e); @@ -385,7 +385,7 @@ statement $$ = new_block_expr (); - e = new_binary_expr ('n', $3, l1); + e = new_binary_expr ('n', test_expr ($3, 1), l1); e->line = $3->line; e->file = $3->file; append_expr ($$, e); @@ -407,11 +407,11 @@ statement $$ = new_block_expr (); append_expr ($$, $3); - append_expr ($$, new_binary_expr ('n', $5, l2)); + append_expr ($$, new_binary_expr ('n', test_expr ($5, 1), l2)); append_expr ($$, l1); append_expr ($$, $9); append_expr ($$, $7); - append_expr ($$, new_binary_expr ('i', $5, l1)); + append_expr ($$, new_binary_expr ('i', test_expr ($5, 1), l1)); append_expr ($$, l2); } | expr ';'