17 #define max_type(A, B) (DYN_TYPE(A) > DYN_TYPE(B)) ? DYN_TYPE(A) : DYN_TYPE(B) 19 #define CHECK_COPY_REFERENCE(X1) \ 20 if (DYN_TYPE(X1) == REFERENCE2) \ 21 DYN_TYPE(X1) = REFERENCE; \ 22 if(DYN_TYPE(X1) == REFERENCE) \ 23 dyn_copy(X1->data.ref, X1); \ 25 #define CHECK_NOCOPY_REFERENCE(X2) \ 26 if(DYN_IS_REFERENCE(X2)) \ 30 #define CHECK_REFERENCE(X1, X2) \ 31 CHECK_COPY_REFERENCE(X1) \ 32 CHECK_NOCOPY_REFERENCE(X2) 74 CHECK_COPY_REFERENCE(dyn)
77 case NONE:
goto LABEL_OK;
78 case BOOL: dyn->data.
b = !dyn->data.
b;
82 case FLOAT: dyn->data.
f = -dyn->data.
f;
126 CHECK_REFERENCE(dyn1, dyn2)
132 switch (max_type(dyn1, dyn2)) {
148 tmp.data.
str[0]=
'\0';
213 CHECK_REFERENCE(dyn1, dyn2)
216 switch (max_type(dyn1, dyn2)) {
232 pos = search(dyn1, dyn2);
240 pos = search(dyn1, &tmp);
273 CHECK_REFERENCE(dyn1, dyn2)
276 switch (max_type(dyn1, dyn2)) {
296 dyn1->data.
str = (
dyn_str) realloc(dyn1->data.
str, len * i + 1);
301 for(j=0; j<len; ++j) {
302 *c++ = dyn1->data.
str[j];
328 for (m=1; m<
i; ++m) {
329 for (n=0; n<len; n++)
358 CHECK_REFERENCE(dyn1, dyn2)
361 switch (max_type(dyn1, dyn2)) {
390 CHECK_REFERENCE(dyn1, dyn2)
395 if ( (t1 && t2) && t1 <=
FLOAT && t2 <=
FLOAT ) {
423 union {
unsigned int i;
425 } mx = { (vx.i & 0x007FFFFF) | 0x3f000000 };
427 x = vx.i * 1.1920928955078125e-7
f 429 - 1.498030302f * mx.f
430 - 1.72587999f / (0.3520887068f + mx.f);
434 float offset = (x < 0) ? 1.0
f : 0.0
f;
435 float clipp = (x < -126) ? -126.0
f : x;
436 float z = clipp - (int) clipp + offset;
437 mx.i = (
unsigned int) ( (1 << 23) * (clipp + 121.2740575f + 27.7280233f / (4.84252568f - z) - 1.49012907
f * z) );
455 CHECK_REFERENCE(dyn1, dyn2)
475 dyn1->data.
i *= base;
480 dyn1->data.
f /= base;
487 dyn1->data.
f *= base;
491 dyn1->data.
f /= base;
660 CHECK_COPY_REFERENCE(dyn)
685 enum{EQ,LT,GT,NEQ,
TYPE,MARK};
706 switch (max_type(tmp, dyn2)) {
954 container = container->data.
ref;
978 dyn->data.
i = ~dyn->data.
i;
989 CHECK_REFERENCE(dyn1, dyn2)
992 dyn1->data.
i = dyn1->data.
i & dyn2->data.
i;
1002 CHECK_REFERENCE(dyn1, dyn2)
1005 dyn1->data.
i = dyn1->data.
i | dyn2->data.
i;
1016 CHECK_REFERENCE(dyn1, dyn2)
1019 dyn1->data.
i ^= dyn2->data.
i;
1030 CHECK_REFERENCE(dyn1, dyn2)
1033 dyn1->data.
i <<= dyn2->data.
i;
1043 CHECK_REFERENCE(dyn1, dyn2)
1046 dyn1->data.
i >>= dyn2->data.
i;
dyn_c * ref
reference pointer to dynamic elements
int32_t dyn_int
32bit signed integer, standard Integer type.
trilean dyn_op_le(dyn_c *dyn1, dyn_c *dyn2)
Relational Less Than or Equal.
dyn_float dyn_get_float(const dyn_c *dyn)
Return float value of a dynamic element.
trilean dyn_op_ge(dyn_c *dyn1, dyn_c *dyn2)
Relational Greater Than or Equal.
dictionary of type dyn_dict
trilean dyn_op_b_not(dyn_c *dyn)
Binary complement.
trilean dyn_op_b_shift_r(dyn_c *dyn1, dyn_c *dyn2)
Binary shift right.
dyn_ushort dyn_strlen(dyn_const_str str)
Returns the length of an string.
trilean dyn_op_id(dyn_c *dyn1, dyn_c *dyn2)
Type and Value Equality.
trilean dyn_list_remove(dyn_c *list, dyn_ushort i)
Delete the ith element from a list.
dyn_c * dyn_dict_insert(dyn_c *dict, dyn_const_str key, dyn_c *value)
Insert a new key-value pair into the dictionary.
trilean dyn_list_insert(dyn_c *list, dyn_c *element, const dyn_ushort i)
Insert a new element at the ith position into a list.
#define DYN_IS_REFERENCE(dyn)
Check if dynamic element is of type REFERENCE.
dyn_c* for internal usage only
#define DYN_LIST_LEN(dyn)
Return list length.
dyn_int dyn_get_int(const dyn_c *dyn)
Return integer value of a dynamic element.
#define DYN_IS_NONE(dyn)
Check if dynamic element is of type NONE.
dyn_ushort dyn_dict_has_key(const dyn_c *dict, dyn_const_str key)
Check if dict has key and return its position - 1 (returns 0 if not found)
trilean dyn_set_insert(dyn_c *set, dyn_c *element)
Insert new element into set, if and only if it is not included yet.
trilean dyn_set_string(dyn_c *dyn, dyn_const_str v)
Set dynamic element to STRING.
trilean dyn_copy(const dyn_c *dyn, dyn_c *copy)
Deep copy dynamic element.
Dynamic data types as part of the SelectScript-VM implementation.
trilean dyn_op_in(dyn_c *element, dyn_c *container)
Check if dyn2 is element of dyn1.
#define DYN_NOT_NONE(dyn)
Check if dynamic element is not of type NONE.
trilean dyn_op_mod(dyn_c *dyn1, dyn_c *dyn2)
dyn1 Modulo dyn2
#define DYN_INIT(dyn)
Mandatory initialization for dynamic elements (NONE)
trilean dyn_op_or(dyn_c *dyn1, dyn_c *dyn2)
Logical (trinary) OR operation.
function pointer of type dyn_fct
trilean dyn_op_eq(dyn_c *dyn1, dyn_c *dyn2)
Relational Equality.
#define DYN_LIST_GET_REF(dyn, i)
Return the reference to the ith element within a dynamic list.
trilean dyn_op_add(dyn_c *dyn1, dyn_c *dyn2)
Add dyn2 to dyn1.
represents a third unknown state, which is not true or false
Boolean 0==False, 1==True.
trilean dyn_op_neg(dyn_c *dyn)
Negate dynamic value in param dyn.
float fast_approx_pow(float x, float p)
Power function approximation x^y.
dyn_str dyn_get_string(const dyn_c *dyn)
Return string representation value of a dynamic element.
trilean dyn_op_and(dyn_c *dyn1, dyn_c *dyn2)
Logical (trinary) AND operation.
trilean dyn_get_bool(const dyn_c *dyn)
Return boolean value of an dynamic element.
trilean dyn_op_ne(dyn_c *dyn1, dyn_c *dyn2)
Relational Not Equal.
#define DYN_DICT_GET_I_REF(dyn, i)
Return a reference to the ith element stored within a dictionary.
#define DYN_DICT_GET_I_KEY(dyn, i)
Return a reference to the ith key stored within a dictionary.
char dyn_char
Basic 8bit signed integer.
#define DYN_TYPE(dyn)
Return type value of a dynamic element.
#define DYN_DICT_LEN(dyn)
Return number of elements within a dictionary.
trilean dyn_op_b_xor(dyn_c *dyn1, dyn_c *dyn2)
Binary XOR.
trilean dyn_op_div(dyn_c *dyn1, dyn_c *dyn2)
Divide dyn1 by dyn2.
uint16_t dyn_ushort
16bit unsigned integer
void dyn_string_add(const dyn_c *dyn, dyn_str string)
Add string representation of dynamic element to string.
void dyn_move(dyn_c *from, dyn_c *to)
Move dynamic element to new reference, from is of type NONE afterwards.
None type without any value.
void dyn_set_bool(dyn_c *dyn, const dyn_char v)
Set dynamic element to BOOL (DYN_TRUE or DYN_FALSE)
dyn_c*, explicite reference
TYPE
Basic data type definitions.
dyn_c * container
pointer to an array of dynamic elements
void dyn_set_float(dyn_c *dyn, const dyn_float v)
Set dynamic element to FLOAT.
dyn_ushort dyn_string_len(const dyn_c *dyn)
Calculate length of string representation of dynamic element.
trilean dyn_op_not(dyn_c *dyn)
Logical (trinary) Negation.
trilean dyn_op_pow(dyn_c *dyn1, dyn_c *dyn2)
dyn1 to the power of dyn2
dyn_c * dyn_list_push(dyn_c *list, const dyn_c *element)
Push new element to the end of a list.
trilean dyn_op_gt(dyn_c *dyn1, dyn_c *dyn2)
Relational Greater Than.
dyn_str * key
array to C strings used as identifiers
trilean dyn_op_lt(dyn_c *dyn1, dyn_c *dyn2)
Relational Less Than.
trilean
basic return type for truth values
trilean dyn_get_bool_3(const dyn_c *dyn)
Returns the trinary truth value (DYN_TRUE|DYN_FALSE|DYN_NONE) of an element.
trilean dyn_op_b_shift_l(dyn_c *dyn1, dyn_c *dyn2)
Binary shift left.
dyn_char dyn_strcmp(dyn_const_str a, dyn_const_str b)
Compares the string a to the string b.
trilean dyn_op_b_or(dyn_c *dyn1, dyn_c *dyn2)
Binary OR.
void dyn_set_ref(dyn_c *ref, dyn_c *orig)
Set dynamic element as reference to another dynamic element.
float dyn_float
basic float definition (32 bit)
void dyn_free(dyn_c *dyn)
free allocated memory
trilean dyn_op_sub(dyn_c *dyn1, dyn_c *dyn2)
Subtract dyn2 from dyn1.
trilean dyn_list_resize(dyn_c *list, const dyn_ushort size)
Change the maximal space of a list.
trilean dyn_op_xor(dyn_c *dyn1, dyn_c *dyn2)
Logical (trinary) XOR operation.
trilean dyn_op_mul(dyn_c *dyn1, dyn_c *dyn2)
Multiply dyn1 with dyn2.
char * dyn_str
Standard dynamic C string.
void dyn_set_int(dyn_c *dyn, const dyn_int v)
Set dynamic element to INTEGER.
trilean dyn_op_b_and(dyn_c *dyn1, dyn_c *dyn2)
Binary AND.
dyn_char dyn_op_cmp(dyn_c *dyn1, dyn_c *dyn2)
Common compare function for dynamic elements.
trilean dyn_set_list_len(dyn_c *dyn, dyn_ushort len)
Set dynamic element to list with maximal length.
dyn_str str
pointer to character-array
Basic container for dynamic data types.