version 1.1.1.1, 2017/08/22 12:33:54
|
version 1.1.1.2, 2021/03/17 19:50:23
|
Line 2
|
Line 2
|
* Filters: utility functions |
* Filters: utility functions |
* |
* |
* Copyright 1998 Pavel Machek <pavel@ucw.cz> |
* Copyright 1998 Pavel Machek <pavel@ucw.cz> |
|
* 2017 Jan Maria Matejka <mq@ucw.cz> |
* |
* |
* Can be freely distributed and used under the terms of the GNU GPL. |
* Can be freely distributed and used under the terms of the GNU GPL. |
*/ |
*/ |
Line 13
|
Line 14
|
#define P(a,b) ((a<<8) | b) |
#define P(a,b) ((a<<8) | b) |
|
|
struct f_inst * |
struct f_inst * |
f_new_inst(void) | f_new_inst(enum f_instruction_code fi_code) |
{ |
{ |
struct f_inst * ret; |
struct f_inst * ret; |
ret = cfg_alloc(sizeof(struct f_inst)); | ret = cfg_allocz(sizeof(struct f_inst)); |
ret->code = ret->aux = 0; | ret->fi_code = fi_code; |
ret->arg1 = ret->arg2 = ret->next = NULL; | |
ret->lineno = ifs->lino; |
ret->lineno = ifs->lino; |
return ret; |
return ret; |
} |
} |
|
|
struct f_inst * |
struct f_inst * |
f_new_dynamic_attr(int type, int f_type UNUSED, int code) | f_new_inst_da(enum f_instruction_code fi_code, struct f_dynamic_attr da) |
{ |
{ |
/* FIXME: Remove the f_type parameter? */ | struct f_inst *ret = f_new_inst(fi_code); |
struct f_inst *f = f_new_inst(); | ret->aux = da.type; |
f->aux = type; | ret->a2.i = da.ea_code; |
f->a2.i = code; | return ret; |
return f; | |
} |
} |
|
|
|
struct f_inst * |
|
f_new_inst_sa(enum f_instruction_code fi_code, struct f_static_attr sa) |
|
{ |
|
struct f_inst *ret = f_new_inst(fi_code); |
|
ret->aux = sa.f_type; |
|
ret->a2.i = sa.sa_code; |
|
ret->a1.i = sa.readonly; |
|
return ret; |
|
} |
|
|
/* |
/* |
* Generate set_dynamic( operation( get_dynamic(), argument ) ) |
* Generate set_dynamic( operation( get_dynamic(), argument ) ) |
*/ |
*/ |
struct f_inst * |
struct f_inst * |
f_generate_complex(int operation, int operation_aux, struct f_inst *dyn, struct f_inst *argument) | f_generate_complex(int operation, int operation_aux, struct f_dynamic_attr da, struct f_inst *argument) |
{ |
{ |
struct f_inst *set_dyn = f_new_inst(), | struct f_inst *set_dyn = f_new_inst_da(FI_EA_SET, da), |
*oper = f_new_inst(), | *oper = f_new_inst(operation), |
*get_dyn = dyn; | *get_dyn = f_new_inst_da(FI_EA_GET, da); |
|
|
*set_dyn = *get_dyn; |
|
get_dyn->code = P('e','a'); |
|
oper->code = operation; |
|
oper->aux = operation_aux; |
oper->aux = operation_aux; |
oper->a1.p = get_dyn; |
oper->a1.p = get_dyn; |
oper->a2.p = argument; |
oper->a2.p = argument; |
set_dyn->code = P('e','S'); | |
set_dyn->a1.p = oper; |
set_dyn->a1.p = oper; |
return set_dyn; |
return set_dyn; |
} |
} |
Line 59 struct f_inst *
|
Line 65 struct f_inst *
|
f_generate_roa_check(struct symbol *sym, struct f_inst *prefix, struct f_inst *asn) |
f_generate_roa_check(struct symbol *sym, struct f_inst *prefix, struct f_inst *asn) |
{ |
{ |
struct f_inst_roa_check *ret = cfg_allocz(sizeof(struct f_inst_roa_check)); |
struct f_inst_roa_check *ret = cfg_allocz(sizeof(struct f_inst_roa_check)); |
ret->i.code = P('R','C'); | ret->i.fi_code = FI_ROA_CHECK; |
ret->i.lineno = ifs->lino; |
ret->i.lineno = ifs->lino; |
ret->i.arg1 = prefix; |
ret->i.arg1 = prefix; |
ret->i.arg2 = asn; |
ret->i.arg2 = asn; |