59 #include "amxo_parser.tab.h"
63 int64_t func_attrs = 0;
65 func_attrs |= SET_BIT(amxd_fattr_private);
68 func_attrs |= SET_BIT(amxd_fattr_protected);
71 func_attrs |= SET_BIT(amxd_fattr_template);
74 func_attrs |= SET_BIT(amxd_fattr_instance);
77 func_attrs |= SET_BIT(amxd_fattr_async);
83 int64_t arg_attrs = 0;
84 if(SET_BIT(
attr_in) & attributes) {
85 arg_attrs |= SET_BIT(amxd_aattr_in);
88 arg_attrs |= SET_BIT(amxd_aattr_out);
91 arg_attrs |= SET_BIT(amxd_aattr_mandatory);
94 arg_attrs |= SET_BIT(amxd_aattr_strict);
101 int64_t attr_bitmask,
103 amxd_function_t* func = NULL;
104 amxd_function_t* orig_func = NULL;
107 amxc_string_t res_name;
108 amxc_string_init(&res_name, 0);
110 if(amxc_string_set_resolved(&res_name, name, &pctx->
config) > 0) {
111 name = amxc_string_get(&res_name, 0);
114 orig_func = amxd_object_get_function(pctx->
object, name);
116 pctx->
status = amxd_function_new(&func, name, type, NULL);
117 if(pctx->
status != amxd_status_ok) {
122 if(amxd_object_get_type(pctx->
object) == amxd_object_instance) {
123 fattrs |= SET_BIT(amxd_fattr_instance);
126 amxd_function_set_attrs(func, fattrs,
true);
128 if(orig_func != NULL) {
129 if(amxd_function_get_owner(orig_func) == pctx->
object) {
130 amxd_function_delete(&orig_func);
133 pctx->
status = amxd_object_add_function(pctx->
object, func);
136 pctx->
status = amxd_object_add_function(pctx->
object, func);
145 amxc_string_clean(&res_name);
150 const amxc_htable_t* ht_flags = NULL;
152 when_null(flags, exit);
153 when_true(amxc_var_type_of(flags) != AMXC_VAR_ID_HTABLE, exit);
155 ht_flags = amxc_var_constcast(amxc_htable_t, flags);
156 amxc_htable_for_each(it, ht_flags) {
157 const char* flag_name = amxc_htable_it_get_key(it);
158 amxc_var_t* flag = amxc_var_from_htable_it(it);
159 if(amxc_var_dyncast(
bool, flag)) {
160 amxd_function_set_flag(pctx->
func, flag_name);
162 amxd_function_unset_flag(pctx->
func, flag_name);
166 amxc_var_delete(&flags);
173 amxd_object_fn_t fn = NULL;
176 amxd_function_set_impl(pctx->
func, fn);
184 int64_t attr_bitmask,
186 amxc_var_t* def_value) {
189 if(!IS_BIT_SET(aattrs, amxd_aattr_in) &&
190 !IS_BIT_SET(aattrs, amxd_aattr_out)) {
191 aattrs |= 1 << amxd_aattr_in;
196 pctx->
status = amxd_function_new_arg(pctx->
func, name, type, def_value);
197 if(pctx->
status != amxd_status_ok) {
198 amxo_parser_msg(pctx,
"Failed to create/add function argument %s", name);
202 amxd_function_arg_set_attrs(pctx->
func, name, aattrs,
true);
int amxo_parser_push_func(amxo_parser_t *pctx, const char *name, int64_t attr_bitmask, uint32_t type)
bool amxo_parser_set_function_flags(amxo_parser_t *pctx, amxc_var_t *flags)
static int64_t amxo_attr_2_arg_attr(int64_t attributes)
static int64_t amxo_attr_2_func_attr(int64_t attributes)
void amxo_parser_pop_func(amxo_parser_t *pctx)
bool amxo_parser_add_arg(amxo_parser_t *pctx, const char *name, int64_t attr_bitmask, uint32_t type, amxc_var_t *def_value)
PRIVATE void amxo_hooks_add_func(amxo_parser_t *parser, const char *name, int64_t attr_bitmask, uint32_t type)
PRIVATE void amxo_hooks_add_func_arg(amxo_parser_t *parser, const char *name, int64_t attr_bitmask, uint32_t type, amxc_var_t *def_value)
PRIVATE void amxo_hooks_end_func(amxo_parser_t *parser)
PRIVATE void amxo_parser_msg(amxo_parser_t *parser, const char *format,...) __attribute__((format(printf
The ODL parser structure.
amxo_fn_ptr_t resolved_fn
amxc_string_t * resolved_fn_name