P->types = psi_plist_init((psi_plist_dtor) psi_decl_arg_free);
}
P->types = psi_plist_add(P->types, &def);
- psi_parser_proc_add_from_typedef(P, def);
}
static inline void psi_parser_proc_add_const(struct psi_parser *P, struct psi_const *cnst) {
assert(cnst);
%empty {
$val = NULL;
}
+| num_exp[num] {
+ if (psi_num_exp_validate(PSI_DATA(P), $num, NULL, NULL, NULL, NULL, NULL)) {
+ impl_val res = {0};
+ token_t type = psi_num_exp_exec($num, &res, NULL, &P->preproc->defs);
+
+ if (type == PSI_T_FLOAT || type == PSI_T_DOUBLE) {
+ $val = psi_impl_def_val_init(type, NULL);
+ } else {
+ $val = psi_impl_def_val_init(PSI_T_INT, NULL);
+ }
+
+ switch (type) {
+ case PSI_T_UINT8: $val->ival.zend.lval = res.u8; break;
+ case PSI_T_UINT16: $val->ival.zend.lval = res.u16; break;
+ case PSI_T_UINT32: $val->ival.zend.lval = res.u32; break;
+ case PSI_T_UINT64: $val->ival.zend.lval = res.u64; break; /* FIXME */
+ case PSI_T_INT8: $val->ival.zend.lval = res.i8; break;
+ case PSI_T_INT16: $val->ival.zend.lval = res.i16; break;
+ case PSI_T_INT32: $val->ival.zend.lval = res.i32; break;
+ case PSI_T_INT64: $val->ival.zend.lval = res.i64; break;
+ case PSI_T_FLOAT: $val->ival.dval = res.fval; break;
+ case PSI_T_DOUBLE: $val->ival.dval = res.dval; break;
+ default:
+ assert(0);
+
+ }
+ } else {
+ $val = NULL;
+ }
+ psi_num_exp_free(&$num);
+}
| impl_def_val_token[token] {
$val = psi_impl_def_val_init($token->type, $token->text);
$val->token = psi_token_copy($token);
impl_def_val_token:
NULL
-| NUMBER
| TRUE
| FALSE
| QUOTED_STRING
$def->var->token = psi_token_copy($name_token);
$def->type->token = psi_token_copy($enum->token);
$def->type->real.enm = $enum;
+ psi_parser_proc_add_enum(P, $enum);
}
| struct_name[struct] align_and_size[as] struct_args_block[args] decl_var[var] {
$def = psi_decl_arg_init(psi_decl_type_init(PSI_T_STRUCT, $struct->text), $var);
$def->type->real.strct->token = psi_token_copy($struct);
$def->type->real.strct->align = $as.pos;
$def->type->real.strct->size = $as.len;
+ psi_parser_proc_add_struct(P, $def->type->real.strct);
}
| union_name[union] align_and_size[as] struct_args_block[args] decl_var[var] {
$def = psi_decl_arg_init(psi_decl_type_init(PSI_T_UNION, $union->text), $var);
$def->type->real.unn->token = psi_token_copy($union);
$def->type->real.unn->align = $as.pos;
$def->type->real.unn->size = $as.len;
+ psi_parser_proc_add_union(P, $def->type->real.unn);
}
| const_decl_type[type] decl_stdint_type[stdint] {
$stdint->type = PSI_T_NAME;
| let_calloc[calloc] {
$exp = psi_let_exp_init(PSI_LET_CALLOC, $calloc);
}
+| STATIC let_calloc[calloc] {
+ $exp = psi_let_exp_init(PSI_LET_CALLOC, $calloc);
+ $calloc->static_memory = 1;
+}
| let_callback[callback] {
$exp = psi_let_exp_init(PSI_LET_CALLBACK, $callback);
}