libamxo  4.3.4
Object Definition Language (ODL) parsing
amxo_parser_dm_param_utils.c File Reference
#include "amxo_parser_priv.h"
#include "amxo_parser.tab.h"
#include "amxo_parser_hooks_priv.h"

Go to the source code of this file.

Macros

#define _GNU_SOURCE
 

Functions

static int64_t amxo_attr_2_param_attr (int64_t attributes)
 
static void amxo_parser_set_event (amxo_parser_t *pctx, event_id_t event)
 
static void amxo_parser_data_event (amxo_parser_t *pctx, amxd_param_t *param)
 
static amxd_param_t * amxo_parser_new_param (amxo_parser_t *pctx, const char *name, int64_t pattrs, uint32_t type)
 
static int amxo_parser_set_param_value (amxo_parser_t *pctx, const char *parent_path, const char *name, amxd_param_t *param, amxc_var_t *value)
 
static bool amxo_parser_add_param (amxo_parser_t *pctx, const char *name, int64_t pattrs, uint32_t type)
 
static bool amxo_parser_update_param (amxo_parser_t *pctx, amxd_param_t *param, const char *name, uint32_t type)
 
static amxd_param_t * amxo_parser_check_param (amxo_parser_t *pctx, const char *name, const char *parent_path, amxc_var_t *value, int *retval)
 
bool amxo_parser_set_param_attrs (amxo_parser_t *pctx, uint64_t attr, bool enable)
 
bool amxo_parser_set_param_flags (amxo_parser_t *pctx, amxc_var_t *flags)
 
bool amxo_parser_push_param (amxo_parser_t *pctx, const char *name, int64_t attr_bitmask, uint32_t type)
 
int amxo_parser_set_param (amxo_parser_t *pctx, const char *name, amxc_var_t *value)
 
bool amxo_parser_pop_param (amxo_parser_t *pctx)
 

Macro Definition Documentation

◆ _GNU_SOURCE

#define _GNU_SOURCE

Definition at line 55 of file amxo_parser_dm_param_utils.c.

Function Documentation

◆ amxo_attr_2_param_attr()

static int64_t amxo_attr_2_param_attr ( int64_t  attributes)
static

Definition at line 62 of file amxo_parser_dm_param_utils.c.

62  {
63  int64_t param_attrs = 0;
64  if(SET_BIT(attr_readonly) & attributes) {
65  param_attrs |= SET_BIT(amxd_pattr_read_only);
66  }
67  if(SET_BIT(attr_persistent) & attributes) {
68  param_attrs |= SET_BIT(amxd_pattr_persistent);
69  }
70  if(SET_BIT(attr_private) & attributes) {
71  param_attrs |= SET_BIT(amxd_pattr_private);
72  }
73  if(SET_BIT(attr_protected) & attributes) {
74  param_attrs |= SET_BIT(amxd_pattr_protected);
75  }
76  if(SET_BIT(attr_template) & attributes) {
77  param_attrs |= SET_BIT(amxd_pattr_template);
78  }
79  if(SET_BIT(attr_instance) & attributes) {
80  param_attrs |= SET_BIT(amxd_pattr_instance);
81  }
82  if(SET_BIT(attr_variable) & attributes) {
83  param_attrs |= SET_BIT(amxd_pattr_variable);
84  }
85  if(SET_BIT(attr_key) & attributes) {
86  param_attrs |= SET_BIT(amxd_pattr_key);
87  }
88  if(SET_BIT(attr_unique) & attributes) {
89  param_attrs |= SET_BIT(amxd_pattr_unique);
90  }
91  if(SET_BIT(attr_mutable) & attributes) {
92  param_attrs |= SET_BIT(amxd_pattr_mutable);
93  }
94  return param_attrs;
95 }
@ attr_instance
@ attr_variable
@ attr_protected
@ attr_template
@ attr_persistent
@ attr_readonly
@ attr_private
@ attr_key
@ attr_unique
@ attr_mutable

◆ amxo_parser_add_param()

static bool amxo_parser_add_param ( amxo_parser_t pctx,
const char *  name,
int64_t  pattrs,
uint32_t  type 
)
static

Definition at line 175 of file amxo_parser_dm_param_utils.c.

178  {
179  bool retval = false;
180  amxd_param_t* param = NULL;
181 
182  if(amxd_object_get_type(pctx->object) == amxd_object_instance) {
183  pattrs |= SET_BIT(amxd_pattr_instance);
184  }
185  param = amxo_parser_new_param(pctx, name, pattrs, type);
186  when_null(param, exit);
187  amxo_hooks_add_param(pctx, name, pattrs, type);
188 
189  pctx->param = param;
190  retval = true;
191 
192 exit:
193  return retval;
194 }
static amxd_param_t * amxo_parser_new_param(amxo_parser_t *pctx, const char *name, int64_t pattrs, uint32_t type)
PRIVATE void amxo_hooks_add_param(amxo_parser_t *parser, const char *name, int64_t attr_bitmask, uint32_t type)
amxd_param_t * param
Definition: amxo_types.h:263
amxd_object_t * object
Definition: amxo_types.h:262

◆ amxo_parser_check_param()

static amxd_param_t* amxo_parser_check_param ( amxo_parser_t pctx,
const char *  name,
const char *  parent_path,
amxc_var_t *  value,
int *  retval 
)
static

Definition at line 226 of file amxo_parser_dm_param_utils.c.

230  {
231  amxd_param_t* param = NULL;
232  if(amxo_parser_check_config(pctx, "populate-behavior.unknown-parameter", "add")) {
233  uint32_t type = amxc_var_is_null(value) ? AMXC_VAR_ID_CSTRING : amxc_var_type_of(value);
234  int64_t pattrs = SET_BIT(amxd_pattr_persistent);
235  if(amxd_object_get_type(pctx->object) == amxd_object_instance) {
236  pattrs |= SET_BIT(amxd_pattr_instance);
237  }
238  if(amxd_object_get_type(pctx->object) == amxd_object_template) {
239  pattrs |= SET_BIT(amxd_pattr_instance);
240  pattrs |= SET_BIT(amxd_pattr_template);
241  }
242  param = amxo_parser_new_param(pctx, name, pattrs, type);
243  } else if(amxo_parser_check_config(pctx,
244  "populate-behavior.unknown-parameter",
245  "warning")) {
246  amxo_parser_msg(pctx,
247  "Parameter %s not found in object \"%s\"",
248  name,
249  parent_path);
250  pctx->status = amxd_status_parameter_not_found;
251  *retval = 0;
252  } else {
253  amxo_parser_msg(pctx,
254  "Parameter %s not found in object \"%s\"",
255  name,
256  parent_path);
257  pctx->status = amxd_status_parameter_not_found;
258  }
259 
260  return param;
261 }
PRIVATE bool amxo_parser_check_config(amxo_parser_t *pctx, const char *path, const char *check)
PRIVATE void amxo_parser_msg(amxo_parser_t *parser, const char *format,...) __attribute__((format(printf
amxd_status_t status
Definition: amxo_types.h:258

◆ amxo_parser_data_event()

static void amxo_parser_data_event ( amxo_parser_t pctx,
amxd_param_t *  param 
)
static

Definition at line 104 of file amxo_parser_dm_param_utils.c.

105  {
106  amxc_lstack_it_t* it = amxc_llist_get_last(&pctx->event_list);
107  event_t* e = amxc_container_of(it, event_t, it);
108  amxc_var_t* value = NULL;
109 
110  when_true(e->id != event_object_change, exit);
111  if(amxc_var_type_of(&e->data) != AMXC_VAR_ID_HTABLE) {
112  amxc_var_set_type(&e->data, AMXC_VAR_ID_HTABLE);
113  }
114  value = GET_ARG(&e->data, amxd_param_get_name(param));
115  when_not_null(value, exit);
116 
117  amxc_var_set_key(&e->data, amxd_param_get_name(param), &param->value, AMXC_VAR_FLAG_COPY);
118 
119 exit:
120  return;
121 }
@ event_object_change
amxc_lstack_t event_list
Definition: amxo_types.h:283
event_id_t id
amxc_var_t data

◆ amxo_parser_new_param()

static amxd_param_t* amxo_parser_new_param ( amxo_parser_t pctx,
const char *  name,
int64_t  pattrs,
uint32_t  type 
)
static

Definition at line 123 of file amxo_parser_dm_param_utils.c.

126  {
127  amxd_param_t* param = NULL;
128 
129  pctx->status = amxd_param_new(&param, name, type);
130  if(pctx->status != amxd_status_ok) {
131  amxo_parser_msg(pctx, "Failed to create parameter %s", name);
132  goto exit;
133  }
134  amxd_param_set_attrs(param, pattrs, true);
135  pctx->status = amxd_object_add_param(pctx->object, param);
136 
137 exit:
138  return param;
139 }

◆ amxo_parser_pop_param()

bool amxo_parser_pop_param ( amxo_parser_t pctx)

Definition at line 348 of file amxo_parser_dm_param_utils.c.

348  {
349  bool retval = false;
350  amxc_var_t value;
351  amxc_var_init(&value);
352 
353  if(pctx->param != NULL) {
354  amxc_var_copy(&value, &pctx->param->value);
355  pctx->status = amxd_param_validate(pctx->param, &value);
356  if(pctx->status != amxd_status_ok) {
357  amxo_parser_msg(pctx, "Parameter %s validation failed",
358  amxd_param_get_name(pctx->param));
359  goto exit;
360  }
361 
362  amxo_hooks_end_param(pctx);
363  pctx->param = NULL;
364  }
365  retval = true;
366 
367 exit:
368  amxc_var_clean(&value);
369  return retval;
370 }
PRIVATE void amxo_hooks_end_param(amxo_parser_t *parser)

◆ amxo_parser_push_param()

bool amxo_parser_push_param ( amxo_parser_t pctx,
const char *  name,
int64_t  attr_bitmask,
uint32_t  type 
)

Definition at line 292 of file amxo_parser_dm_param_utils.c.

295  {
296  amxd_param_t* param = NULL;
297  int64_t pattrs = amxo_attr_2_param_attr(attr_bitmask);
298  bool retval = false;
299  amxc_string_t res_name;
300  amxc_string_init(&res_name, 0);
301 
303 
304  if(amxc_string_set_resolved(&res_name, name, &pctx->config) > 0) {
305  name = amxc_string_get(&res_name, 0);
306  }
307 
308  pctx->status = amxd_status_ok;
309  param = amxd_object_get_param_def(pctx->object, name);
310  if(param == NULL) {
311  retval = amxo_parser_add_param(pctx, name, pattrs, type);
312  } else {
313  retval = amxo_parser_update_param(pctx, param, name, type);
314  }
315 
316  amxc_string_clean(&res_name);
317  return retval;
318 }
static bool amxo_parser_add_param(amxo_parser_t *pctx, const char *name, int64_t pattrs, uint32_t type)
static void amxo_parser_set_event(amxo_parser_t *pctx, event_id_t event)
static bool amxo_parser_update_param(amxo_parser_t *pctx, amxd_param_t *param, const char *name, uint32_t type)
static int64_t amxo_attr_2_param_attr(int64_t attributes)
@ event_none
amxc_var_t config
Definition: amxo_types.h:250

◆ amxo_parser_set_event()

static void amxo_parser_set_event ( amxo_parser_t pctx,
event_id_t  event 
)
static

Definition at line 97 of file amxo_parser_dm_param_utils.c.

98  {
99  amxc_lstack_it_t* it = amxc_llist_get_last(&pctx->event_list);
100  event_t* e = amxc_container_of(it, event_t, it);
101  e->id = event;
102 }

◆ amxo_parser_set_param()

int amxo_parser_set_param ( amxo_parser_t pctx,
const char *  name,
amxc_var_t *  value 
)

Definition at line 320 of file amxo_parser_dm_param_utils.c.

322  {
323  amxd_param_t* param = NULL;
324  int retval = -1;
325  char* parent_path = amxd_object_get_path(pctx->object, AMXD_OBJECT_NAMED);
326  amxc_string_t res_name;
327  amxc_string_init(&res_name, 0);
328 
329  if(amxc_string_set_resolved(&res_name, name, &pctx->config) > 0) {
330  name = amxc_string_get(&res_name, 0);
331  }
332 
333  pctx->status = amxd_status_ok;
334  param = pctx->param == NULL ? amxd_object_get_param_def(pctx->object, name) : pctx->param;
335  if(param == NULL) {
336  param = amxo_parser_check_param(pctx, name, parent_path, value, &retval);
337  }
338  if(param != NULL) {
339  amxo_parser_data_event(pctx, param);
340  retval = amxo_parser_set_param_value(pctx, parent_path, name, param, value);
341  }
342 
343  amxc_string_clean(&res_name);
344  free(parent_path);
345  return retval;
346 }
static void amxo_parser_data_event(amxo_parser_t *pctx, amxd_param_t *param)
static amxd_param_t * amxo_parser_check_param(amxo_parser_t *pctx, const char *name, const char *parent_path, amxc_var_t *value, int *retval)
static int amxo_parser_set_param_value(amxo_parser_t *pctx, const char *parent_path, const char *name, amxd_param_t *param, amxc_var_t *value)

◆ amxo_parser_set_param_attrs()

bool amxo_parser_set_param_attrs ( amxo_parser_t pctx,
uint64_t  attr,
bool  enable 
)

Definition at line 263 of file amxo_parser_dm_param_utils.c.

263  {
264  int64_t pattrs = amxo_attr_2_param_attr(attr);
265  amxd_param_set_attrs(pctx->param, pattrs, enable);
266  return true;
267 }

◆ amxo_parser_set_param_flags()

bool amxo_parser_set_param_flags ( amxo_parser_t pctx,
amxc_var_t *  flags 
)

Definition at line 269 of file amxo_parser_dm_param_utils.c.

269  {
270  const amxc_htable_t* ht_flags = NULL;
271 
272  when_null(flags, exit);
273  when_true(amxc_var_type_of(flags) != AMXC_VAR_ID_HTABLE, exit);
274 
275  ht_flags = amxc_var_constcast(amxc_htable_t, flags);
276  amxc_htable_for_each(it, ht_flags) {
277  const char* flag_name = amxc_htable_it_get_key(it);
278  amxc_var_t* flag = amxc_var_from_htable_it(it);
279  if(amxc_var_dyncast(bool, flag)) {
280  amxd_param_set_flag(pctx->param, flag_name);
281  } else {
282  amxd_param_unset_flag(pctx->param, flag_name);
283  }
284  }
285 
286  amxc_var_delete(&flags);
287 
288 exit:
289  return true;
290 }

◆ amxo_parser_set_param_value()

static int amxo_parser_set_param_value ( amxo_parser_t pctx,
const char *  parent_path,
const char *  name,
amxd_param_t *  param,
amxc_var_t *  value 
)
static

Definition at line 141 of file amxo_parser_dm_param_utils.c.

145  {
146  int retval = -1;
147  if((value != NULL) && (param != NULL)) {
148  if((amxc_var_type_of(value) == AMXC_VAR_ID_HTABLE) ||
149  (amxc_var_type_of(value) == AMXC_VAR_ID_LIST)) {
150  pctx->status = amxd_status_invalid_value;
151  } else {
152  pctx->status = amxd_param_set_value(param, value);
153  }
154  if(pctx->status == amxd_status_invalid_value) {
155  amxo_parser_msg(pctx,
156  "Invalid parameter value for parameter %s in object \"%s\"",
157  name,
158  parent_path);
159  } else if(pctx->status == amxd_status_ok) {
160  pctx->param = param;
161  amxo_hooks_set_param(pctx, value);
162  retval = 0;
163  }
164  } else {
165  pctx->param = param;
166  if(param != NULL) {
167  retval = 0;
168  amxo_hooks_set_param(pctx, value);
169  }
170  }
171 
172  return retval;
173 }
PRIVATE void amxo_hooks_set_param(amxo_parser_t *parser, amxc_var_t *value)

◆ amxo_parser_update_param()

static bool amxo_parser_update_param ( amxo_parser_t pctx,
amxd_param_t *  param,
const char *  name,
uint32_t  type 
)
static

Definition at line 196 of file amxo_parser_dm_param_utils.c.

199  {
200  bool retval = false;
201 
202  if(!amxo_parser_check_config(pctx,
203  "define-behavior.existing-parameter",
204  "update")) {
205  amxo_parser_msg(pctx, "Duplicate parameter %s", name);
206  pctx->status = amxd_status_duplicate;
207  goto exit;
208  }
209  if((type != AMXC_VAR_ID_LIST) &&
210  ( type != AMXC_VAR_ID_HTABLE) &&
211  ( type != AMXC_VAR_ID_FD)) {
212  amxc_var_set_type(&param->value, type);
213  } else {
214  amxo_parser_msg(pctx, "Invalid parameter type for parameter %s", name);
215  pctx->status = amxd_status_invalid_type;
216  goto exit;
217  }
218 
219  pctx->param = param;
220  retval = true;
221 
222 exit:
223  return retval;
224 }