int rmsgpack_dom_value_cmp( const struct rmsgpack_dom_value *a, const struct rmsgpack_dom_value *b ) { int rv; unsigned i; if (a == b) return 1; if (a->type != b->type) return 1; switch (a->type) { case RDT_NULL: return 0; case RDT_BOOL: return a->val.bool_ == b->val.bool_ ? 0 : 1; case RDT_INT: return a->val.int_ == b->val.int_ ? 0 : 1; case RDT_UINT: return a->val.uint_ == b->val.uint_ ? 0 : 1; case RDT_STRING: if (a->val.string.len != b->val.string.len) return 1; return strncmp(a->val.string.buff, b->val.string.buff, a->val.string.len); case RDT_BINARY: if (a->val.binary.len != b->val.binary.len) return 1; return memcmp(a->val.binary.buff, b->val.binary.buff, a->val.binary.len); case RDT_MAP: if (a->val.map.len != b->val.map.len) return 1; for (i = 0; i < a->val.map.len; i++) { if ((rv = rmsgpack_dom_value_cmp(&a->val.map.items[i].key, &b->val.map.items[i].key)) != 0) return rv; if ((rv = rmsgpack_dom_value_cmp(&a->val.map.items[i].value, &b->val.map.items[i].value)) != 0) return rv; } break; case RDT_ARRAY: if (a->val.array.len != b->val.array.len) return 1; for (i = 0; i < a->val.array.len; i++) { if ((rv = rmsgpack_dom_value_cmp(&a->val.array.items[i], &b->val.array.items[i])) != 0) return rv; } break; } return 1; }
static struct rmsgpack_dom_value equals(struct rmsgpack_dom_value input, unsigned argc, const struct argument * argv) { struct argument arg; struct rmsgpack_dom_value res; memset(&res, 0, sizeof(res)); res.type = RDT_BOOL; if (argc != 1) res.val.bool_ = 0; else { arg = argv[0]; if (arg.type != AT_VALUE) res.val.bool_ = 0; else { if (input.type == RDT_UINT && arg.a.value.type == RDT_INT) { arg.a.value.type = RDT_UINT; arg.a.value.val.uint_ = arg.a.value.val.int_; } res.val.bool_ = (rmsgpack_dom_value_cmp(&input, &arg.a.value) == 0); } } return res; }
struct rmsgpack_dom_value *rmsgpack_dom_value_map_value( const struct rmsgpack_dom_value *map, const struct rmsgpack_dom_value *key) { unsigned i; if (map->type != RDT_MAP) return NULL; for (i = 0; i < map->val.map.len; i++) { if (rmsgpack_dom_value_cmp(key, &map->val.map.items[i].key) == 0) return &map->val.map.items[i].value; } return NULL; }