469
* @param item Item node
471
void rdata_item_delete(rdata_item_t *item)
473
assert(item != NULL);
477
/** Deallocate variable address.
479
* @param addr_var Variable address node
481
void rdata_addr_var_delete(rdata_addr_var_t *addr_var)
483
assert(addr_var != NULL);
487
/** Deallocate property address.
489
* @param addr_prop Variable address node
491
void rdata_addr_prop_delete(rdata_addr_prop_t *addr_prop)
493
assert(addr_prop != NULL);
497
/** Deallocate named property address.
499
* @param aprop_named Variable address node
501
void rdata_aprop_named_delete(rdata_aprop_named_t *aprop_named)
503
assert(aprop_named != NULL);
507
/** Deallocate indexed property address.
509
* @param aprop_indexed Variable address node
511
void rdata_aprop_indexed_delete(rdata_aprop_indexed_t *aprop_indexed)
513
assert(aprop_indexed != NULL);
517
/** Deallocate address.
519
* @param address Address node
521
void rdata_address_delete(rdata_address_t *address)
523
assert(address != NULL);
527
/** Deallocate value.
529
* @param value Value node
531
void rdata_value_delete(rdata_value_t *value)
533
assert(value != NULL);
537
/** Deallocate var node.
539
* @param var Var node
541
void rdata_var_delete(rdata_var_t *var)
547
/** Deallocate boolean.
549
* @param bool_v Boolean
551
void rdata_bool_delete(rdata_bool_t *bool_v)
553
assert(bool_v != NULL);
557
/** Deallocate character.
559
* @param char_v Character
561
void rdata_char_delete(rdata_char_t *char_v)
563
assert(char_v != NULL);
567
/** Deallocate integer.
569
* @param int_v Integer
571
void rdata_int_delete(rdata_int_t *int_v)
573
assert(int_v != NULL);
577
/** Deallocate string.
579
* @param string_v String
581
void rdata_string_delete(rdata_string_t *string_v)
583
assert(string_v != NULL);
587
/** Deallocate reference.
589
* @param ref_v Reference
591
void rdata_ref_delete(rdata_ref_t *ref_v)
593
assert(ref_v != NULL);
597
/** Deallocate delegate.
599
* @param deleg_v Reference
601
void rdata_deleg_delete(rdata_deleg_t *deleg_v)
603
assert(deleg_v != NULL);
609
* @param enum_v Reference
611
void rdata_enum_delete(rdata_enum_t *enum_v)
613
assert(enum_v != NULL);
617
/** Deallocate array.
619
* @param array_v Array
621
void rdata_array_delete(rdata_array_t *array_v)
623
assert(array_v != NULL);
627
/** Deallocate object.
629
* @param object_v Object
631
void rdata_object_delete(rdata_object_t *object_v)
633
assert(object_v != NULL);
637
/** Deallocate resource.
639
* @param resource_v Resource
641
void rdata_resource_delete(rdata_resource_t *resource_v)
643
assert(resource_v != NULL);
647
/** Deallocate symbol.
649
* @param symbol_v Symbol
651
void rdata_symbol_delete(rdata_symbol_t *symbol_v)
653
assert(symbol_v != NULL);
659
* @param src Input value
660
* @param dest Place to store pointer to new value
662
void rdata_value_copy(rdata_value_t *src, rdata_value_t **dest)
666
*dest = rdata_value_new();
667
rdata_var_copy(src->var, &(*dest)->var);
459
670
/** Make copy of a variable.
461
672
* Creates a new var node that is an exact copy of an existing var node.
469
680
rdata_var_t *nvar;
471
682
nvar = rdata_var_new(src->vc);
683
rdata_var_copy_to(src, nvar);
688
/** Copy variable content to another variable.
690
* Writes an exact copy of an existing var node to another var node.
691
* The varclass of @a src and @a dest must match. The content of
692
* @a dest.u must be invalid.
694
* @param src Source var node.
695
* @param dest Destination var node.
697
static void rdata_var_copy_to(rdata_var_t *src, rdata_var_t *dest)
473
701
switch (src->vc) {
475
rdata_bool_copy(src->u.bool_v, &nvar->u.bool_v);
703
rdata_bool_copy(src->u.bool_v, &dest->u.bool_v);
478
rdata_char_copy(src->u.char_v, &nvar->u.char_v);
706
rdata_char_copy(src->u.char_v, &dest->u.char_v);
481
rdata_int_copy(src->u.int_v, &nvar->u.int_v);
709
rdata_int_copy(src->u.int_v, &dest->u.int_v);
484
rdata_string_copy(src->u.string_v, &nvar->u.string_v);
712
rdata_string_copy(src->u.string_v, &dest->u.string_v);
487
rdata_ref_copy(src->u.ref_v, &nvar->u.ref_v);
715
rdata_ref_copy(src->u.ref_v, &dest->u.ref_v);
490
rdata_deleg_copy(src->u.deleg_v, &nvar->u.deleg_v);
718
rdata_deleg_copy(src->u.deleg_v, &dest->u.deleg_v);
493
rdata_enum_copy(src->u.enum_v, &nvar->u.enum_v);
721
rdata_enum_copy(src->u.enum_v, &dest->u.enum_v);
496
rdata_array_copy(src->u.array_v, &nvar->u.array_v);
724
rdata_array_copy(src->u.array_v, &dest->u.array_v);
499
rdata_object_copy(src->u.object_v, &nvar->u.object_v);
727
rdata_object_copy(src->u.object_v, &dest->u.object_v);
501
729
case vc_resource:
502
rdata_resource_copy(src->u.resource_v, &nvar->u.resource_v);
730
rdata_resource_copy(src->u.resource_v, &dest->u.resource_v);
505
rdata_symbol_copy(src->u.symbol_v, &nvar->u.symbol_v);
733
rdata_symbol_copy(src->u.symbol_v, &dest->u.symbol_v);
512
739
/** Copy boolean.
514
* @param src Source boolean.
515
* @param dest Place to store pointer to new boolean.
741
* @param src Source boolean
742
* @param dest Place to store pointer to new boolean
517
744
static void rdata_bool_copy(rdata_bool_t *src, rdata_bool_t **dest)
633
860
(*dest)->sym = src->sym;
863
/** Destroy var node.
865
* @param var Var node
867
void rdata_var_destroy(rdata_var_t *var)
869
/* First destroy class-specific part */
870
rdata_var_destroy_inner(var);
872
/* Deallocate var node */
873
rdata_var_delete(var);
876
/** Destroy inside of var node.
878
* Destroy content of var node, but do not deallocate the var node
881
* @param var Var node
883
static void rdata_var_destroy_inner(rdata_var_t *var)
885
/* First destroy class-specific part */
889
rdata_bool_destroy(var->u.bool_v);
892
rdata_char_destroy(var->u.char_v);
895
rdata_int_destroy(var->u.int_v);
898
rdata_string_destroy(var->u.string_v);
901
rdata_ref_destroy(var->u.ref_v);
904
rdata_deleg_destroy(var->u.deleg_v);
907
rdata_enum_destroy(var->u.enum_v);
910
rdata_array_destroy(var->u.array_v);
913
rdata_object_destroy(var->u.object_v);
916
rdata_resource_destroy(var->u.resource_v);
919
rdata_symbol_destroy(var->u.symbol_v);
926
* Destroy an item including the value or address within.
930
void rdata_item_destroy(rdata_item_t *item)
932
/* First destroy class-specific part */
936
rdata_address_destroy(item->u.address);
939
rdata_value_destroy(item->u.value);
943
/* Deallocate item node */
944
rdata_item_delete(item);
949
* Destroy an address node.
951
* @param address Address
953
void rdata_address_destroy(rdata_address_t *address)
955
switch (address->ac) {
957
rdata_addr_var_destroy(address->u.var_a);
960
rdata_addr_prop_destroy(address->u.prop_a);
964
/* Deallocate address node */
965
rdata_address_delete(address);
968
/** Destroy variable address.
970
* Destroy a variable address node.
972
* @param addr_var Variable address
974
void rdata_addr_var_destroy(rdata_addr_var_t *addr_var)
976
addr_var->vref = NULL;
978
/* Deallocate variable address node */
979
rdata_addr_var_delete(addr_var);
982
/** Destroy property address.
984
* Destroy a property address node.
986
* @param addr_prop Property address
988
void rdata_addr_prop_destroy(rdata_addr_prop_t *addr_prop)
990
switch (addr_prop->apc) {
992
rdata_aprop_named_destroy(addr_prop->u.named);
995
rdata_aprop_indexed_destroy(addr_prop->u.indexed);
999
if (addr_prop->tvalue != NULL) {
1000
rdata_value_destroy(addr_prop->tvalue);
1001
addr_prop->tvalue = NULL;
1004
addr_prop->tpos = NULL;
1006
/* Deallocate property address node */
1007
rdata_addr_prop_delete(addr_prop);
1010
/** Destroy named property address.
1012
* Destroy a named property address node.
1014
* @param aprop_named Named property address
1016
void rdata_aprop_named_destroy(rdata_aprop_named_t *aprop_named)
1018
rdata_deleg_destroy(aprop_named->prop_d);
1020
/* Deallocate named property address node */
1021
rdata_aprop_named_delete(aprop_named);
1024
/** Destroy indexed property address.
1026
* Destroy a indexed property address node.
1028
* @param aprop_indexed Indexed property address
1030
void rdata_aprop_indexed_destroy(rdata_aprop_indexed_t *aprop_indexed)
1032
list_node_t *arg_node;
1033
rdata_item_t *arg_i;
1035
/* Destroy the object delegate. */
1036
rdata_deleg_destroy(aprop_indexed->object_d);
1039
* Walk through all argument items (indices) and destroy them,
1040
* removing them from the list as well.
1042
while (!list_is_empty(&aprop_indexed->args)) {
1043
arg_node = list_first(&aprop_indexed->args);
1044
arg_i = list_node_data(arg_node, rdata_item_t *);
1046
rdata_item_destroy(arg_i);
1047
list_remove(&aprop_indexed->args, arg_node);
1050
/* Destroy the now empty list */
1051
list_fini(&aprop_indexed->args);
1053
/* Deallocate indexed property address node */
1054
rdata_aprop_indexed_delete(aprop_indexed);
1059
* Destroy a value node.
1061
* @param value Value
1063
void rdata_value_destroy(rdata_value_t *value)
1065
/* Assumption: Var nodes in values are not shared. */
1066
rdata_var_destroy(value->var);
1068
/* Deallocate value node */
1069
rdata_value_delete(value);
1072
/** Destroy boolean.
1074
* @param bool_v Boolean
1076
static void rdata_bool_destroy(rdata_bool_t *bool_v)
1078
rdata_bool_delete(bool_v);
1081
/** Destroy character.
1083
* @param char_v Character
1085
static void rdata_char_destroy(rdata_char_t *char_v)
1087
bigint_destroy(&char_v->value);
1088
rdata_char_delete(char_v);
1091
/** Destroy integer.
1093
* @param int_v Integer
1095
static void rdata_int_destroy(rdata_int_t *int_v)
1097
bigint_destroy(&int_v->value);
1098
rdata_int_delete(int_v);
1103
* @param string_v String
1105
static void rdata_string_destroy(rdata_string_t *string_v)
1108
* String values are shared so we cannot free them. Just deallocate
1111
rdata_string_delete(string_v);
1114
/** Destroy reference.
1116
* @param ref_v Reference
1118
static void rdata_ref_destroy(rdata_ref_t *ref_v)
1121
rdata_ref_delete(ref_v);
1124
/** Destroy delegate.
1126
* @param deleg_v Reference
1128
static void rdata_deleg_destroy(rdata_deleg_t *deleg_v)
1130
deleg_v->obj = NULL;
1131
deleg_v->sym = NULL;
1132
rdata_deleg_delete(deleg_v);
1137
* @param enum_v Reference
1139
static void rdata_enum_destroy(rdata_enum_t *enum_v)
1141
enum_v->value = NULL;
1142
rdata_enum_delete(enum_v);
1147
* @param array_v Array
1149
static void rdata_array_destroy(rdata_array_t *array_v)
1155
* Compute total number of elements in array.
1156
* At the same time zero out the extent array.
1159
for (d = 0; d < array_v->rank; d++) {
1160
n_elems = n_elems * array_v->extent[d];
1161
array_v->extent[d] = 0;
1164
/* Destroy all elements and zero out the array */
1165
for (p = 0; p < n_elems; p++) {
1166
rdata_var_delete(array_v->element[p]);
1167
array_v->element[p] = NULL;
1170
/* Free the arrays */
1171
free(array_v->element);
1172
free(array_v->extent);
1176
/* Deallocate the node */
1177
rdata_array_delete(array_v);
1182
* @param object_v Object
1184
static void rdata_object_destroy(rdata_object_t *object_v)
1187
rdata_object_delete(object_v);
1190
/** Destroy resource.
1192
* @param resource_v Resource
1194
static void rdata_resource_destroy(rdata_resource_t *resource_v)
1197
* XXX Presumably this should be handled by the appropriate
1198
* built-in module, so, some call-back function would be required.
1200
resource_v->data = NULL;
1201
rdata_resource_delete(resource_v);
1206
* @param symbol_v Symbol
1208
static void rdata_symbol_destroy(rdata_symbol_t *symbol_v)
1210
symbol_v->sym = NULL;
1211
rdata_symbol_delete(symbol_v);
636
1214
/** Read data from a variable.
638
1216
* This copies data from the variable to a value item. Ideally any read access
671
1249
void rdata_var_write(rdata_var_t *var, rdata_value_t *value)
1251
/* Free old content of var->u */
1252
rdata_var_destroy_inner(var);
675
1254
/* Perform a shallow copy of @c value->var. */
676
rdata_var_copy(value->var, &nvar);
678
/* XXX do this in a prettier way. */
682
case vc_bool: var->u.bool_v = nvar->u.bool_v; break;
683
case vc_char: var->u.char_v = nvar->u.char_v; break;
684
case vc_int: var->u.int_v = nvar->u.int_v; break;
685
case vc_string: var->u.string_v = nvar->u.string_v; break;
686
case vc_ref: var->u.ref_v = nvar->u.ref_v; break;
687
case vc_deleg: var->u.deleg_v = nvar->u.deleg_v; break;
688
case vc_enum: var->u.enum_v = nvar->u.enum_v; break;
689
case vc_array: var->u.array_v = nvar->u.array_v; break;
690
case vc_object: var->u.object_v = nvar->u.object_v; break;
691
case vc_resource: var->u.resource_v = nvar->u.resource_v; break;
692
case vc_symbol: var->u.symbol_v = nvar->u.symbol_v; break;
695
/* XXX We should free some stuff around here. */
1255
rdata_var_copy_to(value->var, var);
698
1258
/** Print data item in human-readable form.