mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-01-18 15:01:41 +00:00
get array initialisation worrking
This commit is contained in:
parent
e3b2bfb81a
commit
cef918df83
8 changed files with 128 additions and 5 deletions
|
@ -1,2 +1,7 @@
|
||||||
|
all: menu.dat
|
||||||
|
|
||||||
menu.dat: menu.src menu.qc
|
menu.dat: menu.src menu.qc
|
||||||
qfcc -gP menu.src
|
qfcc -gP menu.src
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.dat *.h *.sym
|
||||||
|
|
|
@ -13,14 +13,14 @@ entity self;
|
||||||
.float frame;
|
.float frame;
|
||||||
.void () think;
|
.void () think;
|
||||||
|
|
||||||
string [6] dot;/* = {
|
string [6] dot = {
|
||||||
"gfx/menudot0.lpm",
|
"gfx/menudot0.lpm",
|
||||||
"gfx/menudot1.lpm",
|
"gfx/menudot1.lpm",
|
||||||
"gfx/menudot2.lpm",
|
"gfx/menudot2.lpm",
|
||||||
"gfx/menudot3.lpm",
|
"gfx/menudot3.lpm",
|
||||||
"gfx/menudot4.lpm",
|
"gfx/menudot4.lpm",
|
||||||
"gfx/menudot5.lpm",
|
"gfx/menudot5.lpm",
|
||||||
};*/
|
};
|
||||||
|
|
||||||
void (integer x, integer y) spinner =
|
void (integer x, integer y) spinner =
|
||||||
{
|
{
|
||||||
|
|
|
@ -117,8 +117,8 @@ extern etype_t qc_types[];
|
||||||
extern struct type_s *types[];
|
extern struct type_s *types[];
|
||||||
extern expr_type expr_types[];
|
extern expr_type expr_types[];
|
||||||
|
|
||||||
type_t *get_type (expr_t *e);
|
type_t *get_type (expr_t *e) __attribute__ ((const));
|
||||||
etype_t extract_type (expr_t *e);
|
etype_t extract_type (expr_t *e) __attribute__ ((const));
|
||||||
|
|
||||||
expr_t *new_expr (void);
|
expr_t *new_expr (void);
|
||||||
const char *new_label_name (void);
|
const char *new_label_name (void);
|
||||||
|
@ -150,6 +150,8 @@ expr_t *address_expr (expr_t *e1, expr_t *e2, type_t *t);
|
||||||
expr_t *assign_expr (expr_t *e1, expr_t *e2);
|
expr_t *assign_expr (expr_t *e1, expr_t *e2);
|
||||||
expr_t *cast_expr (type_t *t, expr_t *e);
|
expr_t *cast_expr (type_t *t, expr_t *e);
|
||||||
|
|
||||||
|
void init_elements (def_t *def, expr_t *eles);
|
||||||
|
|
||||||
def_t *emit_statement (int line, opcode_t *op, def_t *var_a, def_t *var_b, def_t *var_c);
|
def_t *emit_statement (int line, opcode_t *op, def_t *var_a, def_t *var_b, def_t *var_c);
|
||||||
void emit_expr (expr_t *e);
|
void emit_expr (expr_t *e);
|
||||||
|
|
||||||
|
|
|
@ -1766,3 +1766,37 @@ cast_expr (type_t *t, expr_t *e)
|
||||||
c->e.expr.type = t;
|
c->e.expr.type = t;
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
init_elements (def_t *def, expr_t *eles)
|
||||||
|
{
|
||||||
|
expr_t *e;
|
||||||
|
int count, i;
|
||||||
|
float *g = &G_FLOAT (G_INT (def->ofs));
|
||||||
|
|
||||||
|
for (count = 0, e = eles->e.block.head; e; count++, e = e->next)
|
||||||
|
;
|
||||||
|
if (count > def->type->num_parms) {
|
||||||
|
warning (eles, "excessive elements in initializer");
|
||||||
|
count = def->type->num_parms;
|
||||||
|
}
|
||||||
|
for (i = 0, e = eles->e.block.head; i < count; i++, e = e->next) {
|
||||||
|
if (e->type == ex_block) {
|
||||||
|
warning (e, "not yet implemented");
|
||||||
|
} else if (e->type >= ex_string) {
|
||||||
|
if (get_type (e) != def->type->aux_type) {
|
||||||
|
error (e, "type mismatch in initializer");
|
||||||
|
g += pr_type_size[def->type->aux_type->type];
|
||||||
|
} else {
|
||||||
|
if (e->type == ex_string) {
|
||||||
|
*(int*)g = ReuseString (e->e.string_val);
|
||||||
|
} else {
|
||||||
|
memcpy (g, &e->e, pr_type_size[extract_type (e)] * 4);
|
||||||
|
}
|
||||||
|
g += pr_type_size[extract_type (e)];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
error (e, "non-constant initializer");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -187,6 +187,19 @@ PR_GetDef (type_t *type, const char *name, def_t *scope, int *allocate)
|
||||||
pr.size_fields += size;
|
pr.size_fields += size;
|
||||||
}
|
}
|
||||||
} else if (type->type == ev_pointer) {
|
} else if (type->type == ev_pointer) {
|
||||||
|
dstatement_t *st;
|
||||||
|
statref_t *ref;
|
||||||
|
|
||||||
|
if (pr_scope) {
|
||||||
|
st = (dstatement_t *) &G_INT (def->ofs);
|
||||||
|
ref = PR_NewStatref (st, 4);
|
||||||
|
ref->next = def->refs;
|
||||||
|
def->refs = ref;
|
||||||
|
G_INT (def->ofs) = 1;
|
||||||
|
} else {
|
||||||
|
G_INT (def->ofs) = *allocate;
|
||||||
|
}
|
||||||
|
|
||||||
size = PR_GetTypeSize (type->aux_type);
|
size = PR_GetTypeSize (type->aux_type);
|
||||||
*allocate += type->num_parms * size;
|
*allocate += type->num_parms * size;
|
||||||
if (type->num_parms)
|
if (type->num_parms)
|
||||||
|
|
|
@ -118,7 +118,7 @@ typedef struct {
|
||||||
%type <def> param param_list def_name
|
%type <def> param param_list def_name
|
||||||
%type <def> var_def_item var_def_list
|
%type <def> var_def_item var_def_list
|
||||||
%type <def> func_def_item func_def_list
|
%type <def> func_def_item func_def_list
|
||||||
%type <expr> const opt_expr expr arg_list
|
%type <expr> const opt_expr expr arg_list element_list element_list1 element
|
||||||
%type <expr> statement statements statement_block
|
%type <expr> statement statements statement_block
|
||||||
%type <expr> break_label continue_label
|
%type <expr> break_label continue_label
|
||||||
%type <function> begin_function
|
%type <function> begin_function
|
||||||
|
@ -137,6 +137,7 @@ expr_t *break_label;
|
||||||
expr_t *continue_label;
|
expr_t *continue_label;
|
||||||
switch_block_t *switch_block;
|
switch_block_t *switch_block;
|
||||||
type_t *struct_type;
|
type_t *struct_type;
|
||||||
|
expr_t *current_init;
|
||||||
|
|
||||||
def_t *pr_scope; // the function being parsed, or NULL
|
def_t *pr_scope; // the function being parsed, or NULL
|
||||||
string_t s_file; // filename for function definition
|
string_t s_file; // filename for function definition
|
||||||
|
@ -326,6 +327,58 @@ opt_var_initializer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
| '=' '{' { current_init = new_block_expr (); } element_list '}'
|
||||||
|
{
|
||||||
|
init_elements (current_def, $4);
|
||||||
|
current_init = 0;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
element_list
|
||||||
|
: /* empty */
|
||||||
|
{
|
||||||
|
$$ = new_block_expr ();
|
||||||
|
}
|
||||||
|
| element_list1 opt_comma
|
||||||
|
{
|
||||||
|
$$ = current_init;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
element_list1
|
||||||
|
: element
|
||||||
|
{
|
||||||
|
append_expr (current_init, $1);
|
||||||
|
}
|
||||||
|
| element_list1 ',' element
|
||||||
|
{
|
||||||
|
append_expr (current_init, $3);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
element
|
||||||
|
: '{'
|
||||||
|
{
|
||||||
|
$$ = current_init;
|
||||||
|
current_init = new_block_expr ();
|
||||||
|
}
|
||||||
|
element_list
|
||||||
|
{
|
||||||
|
current_init = $<expr>2;
|
||||||
|
}
|
||||||
|
'}'
|
||||||
|
{
|
||||||
|
$$ = $3;
|
||||||
|
}
|
||||||
|
| expr
|
||||||
|
{
|
||||||
|
$$ = $1;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
opt_comma
|
||||||
|
: /* empty */
|
||||||
|
| ','
|
||||||
;
|
;
|
||||||
|
|
||||||
opt_func_initializer
|
opt_func_initializer
|
||||||
|
|
|
@ -485,6 +485,7 @@ void
|
||||||
PR_RelocateRefs (def_t *def)
|
PR_RelocateRefs (def_t *def)
|
||||||
{
|
{
|
||||||
statref_t *ref;
|
statref_t *ref;
|
||||||
|
int *d;
|
||||||
|
|
||||||
for (ref = def->refs; ref; ref = ref->next) {
|
for (ref = def->refs; ref; ref = ref->next) {
|
||||||
switch (ref->field) {
|
switch (ref->field) {
|
||||||
|
@ -497,6 +498,10 @@ PR_RelocateRefs (def_t *def)
|
||||||
case 2:
|
case 2:
|
||||||
ref->statement->c = def->ofs;
|
ref->statement->c = def->ofs;
|
||||||
break;
|
break;
|
||||||
|
case 4:
|
||||||
|
d = (int*)ref->statement;
|
||||||
|
*d += def->ofs;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
abort ();
|
abort ();
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,15 @@ struct foo = {
|
||||||
void (foo bar) eek;
|
void (foo bar) eek;
|
||||||
float (float a, float b) boing;
|
float (float a, float b) boing;
|
||||||
|
|
||||||
|
string [6] dot = {
|
||||||
|
"gfx/menudot0.lpm",
|
||||||
|
"gfx/menudot1.lpm",
|
||||||
|
"gfx/menudot2.lpm",
|
||||||
|
"gfx/menudot3.lpm",
|
||||||
|
"gfx/menudot4.lpm",
|
||||||
|
"gfx/menudot5.lpm",
|
||||||
|
};
|
||||||
|
|
||||||
float () main =
|
float () main =
|
||||||
{
|
{
|
||||||
local float messed_or;
|
local float messed_or;
|
||||||
|
@ -32,5 +41,7 @@ float () main =
|
||||||
print (buffer);
|
print (buffer);
|
||||||
} while (read_result == 1024);
|
} while (read_result == 1024);
|
||||||
close (handle);
|
close (handle);
|
||||||
|
for (handle = 0; handle < 6; handle++)
|
||||||
|
print (dot[handle] + "\n");
|
||||||
return 0;
|
return 0;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue