#include "psl_object.h" #include "error.h" extern psl_object psl_object_null = (psl_object){ 1, &psl_object_null, NULL, 0, (psl_member_node){}}; psl_object *psl_object_new(psl_object *parent, size_t datalength, void *data) { psl_object *retval = malloc(sizeof(psl_object)); if(retval == NULL) ERROR("Out of memory.\n"); *retval = (psl_object){ 1, parent, (psl_member_node){}, datalength, data }; return retval; } psl_object *psl_get_member(char *name, psl_object *object) { if(!strcmp(name, "null")) return psl_object_null; recurse: psl_member_node *cur = object->members; int cmp = strcmp(name, cur->name); if(!cmp) return cur->o; else if (cmp < 0) { if (cur->left) { cur = cur->left; goto recurse; } else return NULL; } else { if (cur->right) { object = cur->right; goto recurse; } else return NULL; } } void psl_add_member(psl_object *object, psl_member_node member) { recurse: psl_member_node *cur = object->members; int cmp = strcmp(cur->name, member.name); if(!cmp) { member.o.refs = cur->o->refs; cur->o = member.o; return; } else if (cmp > 0) { if (cur->left) { cur = cur->left; goto recurse; } else { cur->left = member; return; } } else { if (cur->right) { cur = cur->right; goto recurse; } else { cur->right = member; return; } } }