dynamiC  0.1
Macros | Functions
DynamicBase

basic functionality for scalar dynamic data types More...

Macros

#define DYN_INIT(dyn)   (dyn)->type=NONE
 Mandatory initialization for dynamic elements (NONE)
 
#define DYN_TYPE(dyn)   (dyn)->type
 Return type value of a dynamic element. More...
 
#define DYN_IS_NONE(dyn)   !DYN_TYPE(dyn)
 Check if dynamic element is of type NONE.
 
#define DYN_NOT_NONE(dyn)   DYN_TYPE(dyn)
 Check if dynamic element is not of type NONE.
 
#define DYN_IS_REFERENCE(dyn)   DYN_TYPE(dyn)==REFERENCE || DYN_TYPE(dyn)==REFERENCE2
 Check if dynamic element is of type REFERENCE.
 
#define DYN_MOVE(from, to)   *to = *from; DYN_INIT(from)
 

Functions

TYPE dyn_type (const dyn_c *dyn)
 Return type value of a dynamic element. More...
 
void dyn_free (dyn_c *dyn)
 free allocated memory More...
 
trilean dyn_copy (const dyn_c *dyn, dyn_c *copy)
 Deep copy dynamic element.
 
void dyn_move (dyn_c *from, dyn_c *to)
 Move dynamic element to new reference, from is of type NONE afterwards.
 
dyn_ushort dyn_length (const dyn_c *dyn)
 Reterns the length of an element. More...
 
dyn_uint dyn_size (const dyn_c *dyn)
 Return the number of allocated bytes. More...
 
void dyn_set_none (dyn_c *dyn)
 Set dynamic element to NONE. More...
 
void dyn_set_bool (dyn_c *dyn, const dyn_char v)
 Set dynamic element to BOOL (DYN_TRUE or DYN_FALSE) More...
 
void dyn_set_int (dyn_c *dyn, const dyn_int v)
 Set dynamic element to INTEGER. More...
 
void dyn_set_float (dyn_c *dyn, const dyn_float v)
 Set dynamic element to FLOAT. More...
 
void dyn_set_extern (dyn_c *dyn, const void *v)
 Set dynamic element to point to an arbitrary value. More...
 
trilean dyn_set_string (dyn_c *dyn, dyn_const_str v)
 Set dynamic element to STRING. More...
 
void dyn_set_ref (dyn_c *ref, dyn_c *orig)
 Set dynamic element as reference to another dynamic element. More...
 
trilean dyn_get_bool (const dyn_c *dyn)
 Return boolean value of an dynamic element. More...
 
trilean dyn_get_bool_3 (const dyn_c *dyn)
 Returns the trinary truth value (DYN_TRUE|DYN_FALSE|DYN_NONE) of an element. More...
 
dyn_int dyn_get_int (const dyn_c *dyn)
 Return integer value of a dynamic element.
 
dyn_float dyn_get_float (const dyn_c *dyn)
 Return float value of a dynamic element.
 
dyn_str dyn_get_string (const dyn_c *dyn)
 Return string representation value of a dynamic element.
 
const void * dyn_get_extern (const dyn_c *dyn)
 Return pointer, stored in dyn->data.ex.
 
void dyn_string_add (const dyn_c *dyn, dyn_str string)
 Add string representation of dynamic element to string.
 
dyn_ushort dyn_string_len (const dyn_c *dyn)
 Calculate length of string representation of dynamic element.
 

Detailed Description

basic functionality for scalar dynamic data types

These functions and macros cover basic scalar data types, their handling, initialization, etc. Every module includes its own functions for memory allocation and freeing, but functions such as dyn_free, dyn_get_string, as well es others provide basic interfaces, which hide the additional and type specific functionality which is required to deal with different dynamic data types.

Macro Definition Documentation

◆ DYN_TYPE

#define DYN_TYPE (   dyn)    (dyn)->type

Return type value of a dynamic element.

See also
TYPE

Definition at line 40 of file dynamic.h.

Referenced by dyn_free(), dyn_get_bool(), dyn_get_bool_3(), dyn_op_b_not(), dyn_op_id(), dyn_op_in(), dyn_size(), and dyn_type().

Function Documentation

◆ dyn_free()

void dyn_free ( dyn_c dyn)

free allocated memory

Frees any kind of dynamic type and convertes it to a NONE element. For the the freeing of different data types the different free functions in the different modules is applied.

See also
dyn_list_free
dyn_dict_free
dyn_fct_free
Parameters
[in,out]dynelement to free, result is of type NONE

Definition at line 30 of file dynamic.c.

Referenced by dyn_dict_copy(), dyn_dict_empty(), dyn_dict_free(), dyn_dict_remove(), dyn_list_copy(), dyn_list_free(), dyn_list_get(), dyn_list_popi(), dyn_op_and(), dyn_op_b_not(), dyn_op_gt(), dyn_op_lt(), dyn_op_or(), dyn_op_xor(), dyn_set_bool(), dyn_set_dict(), dyn_set_extern(), dyn_set_float(), dyn_set_int(), dyn_set_list_len(), dyn_set_none(), dyn_set_ref(), and dyn_set_string().

31 {
32  switch (DYN_TYPE(dyn)) {
33  case STRING: free(dyn->data.str);
34  break;
35 #ifdef S2_SET
36  case SET:
37 #endif
38  case LIST: dyn_list_free(dyn);
39  break;
40  case DICT: dyn_dict_free(dyn);
41  break;
42  case FUNCTION: dyn_fct_free(dyn);
43  }
44  dyn->type=NONE;
45 }
dictionary of type dyn_dict
Definition: dynamic_types.h:69
set of type dyn_list
Definition: dynamic_types.h:68
function pointer of type dyn_fct
Definition: dynamic_types.h:71
list of type dyn_list
Definition: dynamic_types.h:67
#define DYN_TYPE(dyn)
Return type value of a dynamic element.
Definition: dynamic.h:40
char*
Definition: dynamic_types.h:66
None type without any value.
Definition: dynamic_types.h:61
void dyn_dict_free(dyn_c *dict)
Free all allocated memory.
Definition: dynamic_dict.c:245
void dyn_list_free(dyn_c *list)
Free the allocated memory of the entire list and set it to NONE.
Definition: dynamic_list.c:67
char type
type definition
dyn_str str
pointer to character-array

◆ dyn_get_bool()

trilean dyn_get_bool ( const dyn_c dyn)

Return boolean value of an dynamic element.

The conversion of dynamic values into boolean truth values is similar to the one in Python. NONE, FUNCTION, etc. elements are also converted into DYN_FALSE in contrast to dyn_get_bool_3, which return DYN_NONE as a third truth value.

// BOOL
// INTEGER
otherwise DYN_TRUE
// FLOAT
otherwise DYN_TRUE
// STRING, LIST, SET, DICT
if empty DYN_FALSE
// everything else results in ...
See also
dyn_get_bool_3
Parameters
dyndynamic element to check for boolean truth value
Returns
DYN_TRUE or DYN_FALSE according to the examples above

Definition at line 241 of file dynamic.c.

Referenced by dyn_get_bool_3(), and dyn_set_insert().

242 {
243 START:
244  switch (DYN_TYPE(dyn)) {
245  case BOOL: return dyn->data.b ? DYN_TRUE : DYN_FALSE;
246  case INTEGER: return dyn->data.i ? DYN_TRUE : DYN_FALSE;
247  case FLOAT: return dyn->data.f ? DYN_TRUE : DYN_FALSE;
248 
249  case STRING:
250 #ifdef S2_SET
251  case SET:
252 #endif
253  case LIST:
254  case DICT:
255  return dyn_length(dyn);// ? DYN_TRUE : DYN_FALSE;
256  case REFERENCE2:
257  case REFERENCE: dyn=dyn->data.ref;
258  goto START;
259  }
260 
261  return DYN_FALSE;
262 }
dyn_c * ref
reference pointer to dynamic elements
float 32 bit
Definition: dynamic_types.h:65
represents boolean false
Definition: dynamic_types.h:23
represents boolean true
Definition: dynamic_types.h:24
dictionary of type dyn_dict
Definition: dynamic_types.h:69
dyn_char b
boolean value
dyn_c* for internal usage only
Definition: dynamic_types.h:73
dyn_float f
float value
set of type dyn_list
Definition: dynamic_types.h:68
Boolean 0==False, 1==True.
Definition: dynamic_types.h:62
list of type dyn_list
Definition: dynamic_types.h:67
#define DYN_TYPE(dyn)
Return type value of a dynamic element.
Definition: dynamic.h:40
signed integer 32 bit
Definition: dynamic_types.h:64
char*
Definition: dynamic_types.h:66
dyn_c*, explicite reference
Definition: dynamic_types.h:74
dyn_int i
basic integer
dyn_ushort dyn_length(const dyn_c *dyn)
Reterns the length of an element.

◆ dyn_get_bool_3()

trilean dyn_get_bool_3 ( const dyn_c dyn)

Returns the trinary truth value (DYN_TRUE|DYN_FALSE|DYN_NONE) of an element.

Only an element of type NONE results in a return value of DYN_NONE, all other types result in a boolean value, as defined in

See also
dyn_get_bool
Parameters
[in]dynvalue to check DYN_TRUE ( 1) DYN_FALSE ( 0) DYN_NONE (-1)

In case of a NONE value or a FUNCTION the unknown truth value DYN_NONE gets returned otherwise the boolean truth value from dyn_get_bool.

Parameters
dyninput dynamic element
Returns
trilean truth value

Definition at line 509 of file dynamic_op.c.

Referenced by dyn_op_and(), dyn_op_or(), and dyn_op_xor().

510 {
511  if(DYN_IS_REFERENCE(dyn))
512  dyn=dyn->data.ref;
513 
514  return (DYN_IS_NONE(dyn) || DYN_TYPE(dyn) == FUNCTION) ? DYN_NONE : dyn_get_bool(dyn);
515 }
dyn_c * ref
reference pointer to dynamic elements
#define DYN_IS_REFERENCE(dyn)
Check if dynamic element is of type REFERENCE.
Definition: dynamic.h:46
#define DYN_IS_NONE(dyn)
Check if dynamic element is of type NONE.
Definition: dynamic.h:42
function pointer of type dyn_fct
Definition: dynamic_types.h:71
represents a third unknown state, which is not true or false
Definition: dynamic_types.h:25
trilean dyn_get_bool(const dyn_c *dyn)
Return boolean value of an dynamic element.
Definition: dynamic.c:241
#define DYN_TYPE(dyn)
Return type value of a dynamic element.
Definition: dynamic.h:40

◆ dyn_length()

dyn_ushort dyn_length ( const dyn_c dyn)

Reterns the length of an element.

Parameters
[in]dynvalue to check
Returns
length

Referenced by dyn_dict_string_add(), and dyn_get_bool().

◆ dyn_set_bool()

void dyn_set_bool ( dyn_c dyn,
const dyn_char  v 
)

Set dynamic element to BOOL (DYN_TRUE or DYN_FALSE)

Parameters
[in,out]dynelement, which is either DYN_TRUE or DYN_FALSE
[in]vboolean value

Definition at line 77 of file dynamic.c.

Referenced by dyn_op_and(), dyn_op_eq(), dyn_op_gt(), dyn_op_id(), dyn_op_in(), dyn_op_lt(), dyn_op_ne(), dyn_op_or(), and dyn_op_xor().

78 {
79  dyn_free(dyn);
80  dyn->type = BOOL;
81  dyn->data.b = v;
82 }
dyn_char b
boolean value
Boolean 0==False, 1==True.
Definition: dynamic_types.h:62
void dyn_free(dyn_c *dyn)
free allocated memory
Definition: dynamic.c:30
char type
type definition

◆ dyn_set_extern()

void dyn_set_extern ( dyn_c dyn,
const void *  v 
)

Set dynamic element to point to an arbitrary value.

This function can be used to reference anything via void pointers.

Parameters
[in,out]dynelement, which is set to reference the void pointer
[in]vvoid value

Definition at line 112 of file dynamic.c.

113 {
114  dyn_free(dyn);
115  dyn->type = EXTERN;
116  dyn->data.ex = v;
117 }
void*
Definition: dynamic_types.h:72
void dyn_free(dyn_c *dyn)
free allocated memory
Definition: dynamic.c:30
const void * ex
external (pointer to everything)
char type
type definition

◆ dyn_set_float()

void dyn_set_float ( dyn_c dyn,
const dyn_float  v 
)

Set dynamic element to FLOAT.

Parameters
[in,out]dynelement, which is set to FLOAT
[in]vfloat value

Definition at line 99 of file dynamic.c.

100 {
101  dyn_free(dyn);
102  dyn->type = FLOAT;
103  dyn->data.f = v;
104 }
float 32 bit
Definition: dynamic_types.h:65
dyn_float f
float value
void dyn_free(dyn_c *dyn)
free allocated memory
Definition: dynamic.c:30
char type
type definition

◆ dyn_set_int()

void dyn_set_int ( dyn_c dyn,
const dyn_int  v 
)

Set dynamic element to INTEGER.

Parameters
[in,out]dynelement, which is set to INTEGER
[in]vinteger value

Definition at line 88 of file dynamic.c.

89 {
90  dyn_free(dyn);
91  dyn->type = INTEGER;
92  dyn->data.i = v;
93 }
signed integer 32 bit
Definition: dynamic_types.h:64
dyn_int i
basic integer
void dyn_free(dyn_c *dyn)
free allocated memory
Definition: dynamic.c:30
char type
type definition

◆ dyn_set_none()

void dyn_set_none ( dyn_c dyn)

Set dynamic element to NONE.

The additional initialization of data.i is used to set the data element to false. This is used to associate also NONE values directly with false.

Parameters
[in,out]dynelement

Definition at line 67 of file dynamic.c.

68 {
69  dyn_free(dyn);
70  dyn->data.i = 0;
71 }
dyn_int i
basic integer
void dyn_free(dyn_c *dyn)
free allocated memory
Definition: dynamic.c:30

◆ dyn_set_ref()

void dyn_set_ref ( dyn_c ref,
dyn_c orig 
)

Set dynamic element as reference to another dynamic element.

This function is used to store a reference to a dynamic element instead of copying it.

Parameters
[in,out]refelement, which is used to reference the original element
[in]origoriginal dynamic element

Definition at line 149 of file dynamic.c.

Referenced by dyn_set_insert().

150 {
151  dyn_free(ref);
152 
153  ref->type = REFERENCE;
154  ref->data.ref = DYN_IS_REFERENCE(orig) ? orig->data.ref : orig;
155 }
dyn_c * ref
reference pointer to dynamic elements
#define DYN_IS_REFERENCE(dyn)
Check if dynamic element is of type REFERENCE.
Definition: dynamic.h:46
dyn_c* for internal usage only
Definition: dynamic_types.h:73
void dyn_free(dyn_c *dyn)
free allocated memory
Definition: dynamic.c:30
char type
type definition

◆ dyn_set_string()

trilean dyn_set_string ( dyn_c dyn,
dyn_const_str  v 
)

Set dynamic element to STRING.

An new char array is allocated to store the entire passed string v.

Parameters
[in,out]dynelement, which is set to STRING
[in]vC-string value
Return values
DYN_TRUEif the memory could allocated
DYN_FALSEotherwise

Definition at line 128 of file dynamic.c.

Referenced by dyn_get_bool().

129 {
130  dyn_free(dyn);
131 
132  dyn->data.str = (dyn_str) malloc(dyn_strlen((dyn_str)v)+1);
133 
134  if (dyn->data.str) {
135  dyn->type = STRING;
136  dyn_strcpy(dyn->data.str, (dyn_str)v);
137  return DYN_TRUE;
138  }
139  return DYN_FALSE;
140 }
represents boolean false
Definition: dynamic_types.h:23
represents boolean true
Definition: dynamic_types.h:24
dyn_ushort dyn_strlen(dyn_const_str str)
Returns the length of an string.
void dyn_strcpy(dyn_str destination, dyn_const_str source)
Copy string.
char*
Definition: dynamic_types.h:66
void dyn_free(dyn_c *dyn)
free allocated memory
Definition: dynamic.c:30
char * dyn_str
Standard dynamic C string.
Definition: dynamic_types.h:36
char type
type definition
dyn_str str
pointer to character-array

◆ dyn_size()

dyn_uint dyn_size ( const dyn_c dyn)

Return the number of allocated bytes.

This function is intended calculate the size of an dynamic element in bytes.

Parameters
[in,out]dynelement to check
Returns
size in bytes

Definition at line 164 of file dynamic.c.

Referenced by dyn_size().

165 {
166  dyn_uint bytes = sizeof(dyn_c);
167 
168  dyn_ushort len, i = 0;
169 
170  switch (DYN_TYPE(dyn)) {
171  case STRING:
172  bytes += dyn_strlen(dyn->data.str)+1;
173  break;
174 #ifdef S2_SET
175  case SET:
176 #endif
177  case LIST: {
178  bytes += sizeof(dyn_list);
179 
180  len = dyn->data.list->space;
181  for (; i<len; ++i)
182  bytes += dyn_size( DYN_LIST_GET_REF(dyn, i) );
183 
184  break;
185  }
186  case DICT: {
187  bytes += sizeof(dyn_dict);
188  bytes += dyn_size(&dyn->data.dict->value);
189 
190  len = dyn->data.dict->value.data.list->space;
191  for (; i<len; ++i) {
192  if (dyn->data.dict->key[i])
193  bytes += dyn_strlen(dyn->data.dict->key[i]);
194  bytes++;
195  }
196 
197  break;
198  }
199  case FUNCTION: {
200  bytes += sizeof(dyn_fct);
201  bytes += dyn_strlen(dyn->data.fct->info) + 1;
202  break;
203  }
204  }
205 
206  return bytes;
207 }
dyn_list * list
pointer to dynamic list
dictionary of type dyn_dict
Definition: dynamic_types.h:69
dyn_ushort dyn_strlen(dyn_const_str str)
Returns the length of an string.
uint32_t dyn_uint
32bit unsigned integer
Definition: dynamic_types.h:52
struct dynamic_function dyn_fct
common dynamic procedure/bytecode data type
Definition: dynamic_types.h:89
dyn_int i
basic integer
Definition: dynamic_types.h:59
dyn_ushort space
elements available
set of type dyn_list
Definition: dynamic_types.h:68
function pointer of type dyn_fct
Definition: dynamic_types.h:71
#define DYN_LIST_GET_REF(dyn, i)
Return the reference to the ith element within a dynamic list.
Definition: dynamic.h:125
struct dynamic_list dyn_list
common dynamic list data type
Definition: dynamic_types.h:83
dyn_uint dyn_size(const dyn_c *dyn)
Return the number of allocated bytes.
Definition: dynamic.c:164
list of type dyn_list
Definition: dynamic_types.h:67
dyn_fct * fct
pointer to function
#define DYN_TYPE(dyn)
Return type value of a dynamic element.
Definition: dynamic.h:40
char*
Definition: dynamic_types.h:66
uint16_t dyn_ushort
16bit unsigned integer
Definition: dynamic_types.h:43
dyn_dict * dict
pointer to dynamic dictionary
dyn_c value
dynamic element of type dyn_list
dyn_str * key
array to C strings used as identifiers
dyn_str info
info string
struct dynamic_dict dyn_dict
common dynamic dictionary data type
Definition: dynamic_types.h:86
dyn_str str
pointer to character-array
struct dynamic dyn_c
common dynamic data type
Definition: dynamic_types.h:80

◆ dyn_type()

TYPE dyn_type ( const dyn_c dyn)

Return type value of a dynamic element.

See also
TYPE

It is more appropriate to apply the macro DYN_TYPE instead of calling this function. This function is only applied to offer an interface if a compiled library is used.

Parameters
dynelement to check
Returns
a value defined in enumeration TYPE

Definition at line 56 of file dynamic.c.

57 {
58  return (TYPE)DYN_TYPE(dyn);
59 }
#define DYN_TYPE(dyn)
Return type value of a dynamic element.
Definition: dynamic.h:40
TYPE
Basic data type definitions.
Definition: dynamic_types.h:60