From 4b2b8d3176e84f76510cc69a627dbfa089c1dd35 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sat, 25 Jan 2020 09:48:56 +0100 Subject: Implement almost all instructions --- src/value.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'src/value.c') diff --git a/src/value.c b/src/value.c index 690527f..c08048a 100644 --- a/src/value.c +++ b/src/value.c @@ -12,19 +12,23 @@ static uint64_t hash_range(const uint8_t *data, size_t size) { } uint64_t tsl_value_hash(const TslValue *key) { - switch(key->type) { + switch((TslType)key->type) { case TSL_TYPE_NULL: return 0; case TSL_TYPE_NUMBER: return *(uint64_t*)&key->data.number; case TSL_TYPE_STRING: return hash_range(key->data.string->data, key->data.string->size); + case TSL_TYPE_STRING_VIEW: + return hash_range((uint8_t*)key->data.string_view.data, key->data.string_view.size); case TSL_TYPE_BOOL: return key->data.boolean; case TSL_TYPE_LIST: return (uint64_t)key->data.list; case TSL_TYPE_MAP: return (uint64_t)key->data.map; + case TSL_TYPE_FUNCTION: + return key->data.function; case TSL_TYPE_USERDATA: return (uint64_t)key->data.userdata; } @@ -36,10 +40,23 @@ int tsl_value_equals(const TslValue *lhs, const TslValue *rhs) { if(lhs->type == TSL_TYPE_STRING) { return lhs->data.string->size == rhs->data.string->size && memcmp(lhs->data.string->data, rhs->data.string->data, lhs->data.string->size) == 0; + } else if(lhs->type == TSL_TYPE_STRING_VIEW) { + return lhs->data.string_view.size == rhs->data.string_view.size + && memcmp(lhs->data.string_view.data, rhs->data.string_view.data, lhs->data.string_view.size) == 0; } else { return *(uint64_t*)&lhs->data == *(uint64_t*)&rhs->data; } + } else if(lhs->type == TSL_TYPE_STRING && rhs->type == TSL_TYPE_STRING_VIEW) { + return lhs->data.string->size == rhs->data.string_view.size + && memcmp(lhs->data.string->data, rhs->data.string_view.data, lhs->data.string->size) == 0; + } else if(lhs->type == TSL_TYPE_STRING_VIEW && rhs->type == TSL_TYPE_STRING) { + return lhs->data.string_view.size == rhs->data.string->size + && memcmp(lhs->data.string_view.data, rhs->data.string->data, lhs->data.string_view.size) == 0; } else { return 0; } } + +void tsl_value_clear(TslValue *self) { + memset(self, 0, sizeof(TslValue)); +} -- cgit v1.2.3