System/Libraries/Json: Implement array->contains()
This commit is contained in:
parent
8ef544d912
commit
de213e35fe
1 changed files with 68 additions and 0 deletions
|
@ -87,6 +87,7 @@ class @json_callable_array : @json_array
|
||||||
@json_callable_array* (*a)(I64 index, Bool return_item = FALSE);
|
@json_callable_array* (*a)(I64 index, Bool return_item = FALSE);
|
||||||
@json_callable_object* (*o)(I64 index, Bool return_item = FALSE);
|
@json_callable_object* (*o)(I64 index, Bool return_item = FALSE);
|
||||||
U0 (*append)(U64 value, I64 type = NULL);
|
U0 (*append)(U64 value, I64 type = NULL);
|
||||||
|
Bool (*contains)(U64 value, I64 type = NULL, Bool match_case = FALSE);
|
||||||
U0 (*insert)(I64 index, U64 value, I64 type = NULL);
|
U0 (*insert)(I64 index, U64 value, I64 type = NULL);
|
||||||
U0 (*prepend)(U64 value, I64 type = NULL);
|
U0 (*prepend)(U64 value, I64 type = NULL);
|
||||||
U0 (*remove)(I64 index);
|
U0 (*remove)(I64 index);
|
||||||
|
@ -1222,6 +1223,55 @@ U64 @json_array_index(@json_array* arr, I64 index, Bool return_item = FALSE)
|
||||||
return item->value;
|
return item->value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Bool @json_array_contains(@json_array* arr, U64 value, I64 type = NULL, Bool match_case = FALSE)
|
||||||
|
{
|
||||||
|
if (!arr)
|
||||||
|
return FALSE;
|
||||||
|
if (arr->type != JSON_ARRAY)
|
||||||
|
return FALSE;
|
||||||
|
if (!arr->length)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (!type) {
|
||||||
|
if (value > 0x1000) {
|
||||||
|
type = JSON_STRING;
|
||||||
|
} else {
|
||||||
|
type = JSON_BOOLEAN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
I64 i;
|
||||||
|
@json_item* item = NULL;
|
||||||
|
for (i = 0; i < arr->length; i++) {
|
||||||
|
item = @json_array_index(arr, i, TRUE);
|
||||||
|
if (item->type == type) {
|
||||||
|
switch (type) {
|
||||||
|
case JSON_STRING:
|
||||||
|
if (match_case) {
|
||||||
|
if (!StrCmp(value, item->value)) {
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!StrICmp(value, item->value)) {
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case JSON_BOOLEAN:
|
||||||
|
case JSON_NULL:
|
||||||
|
case JSON_NUMBER:
|
||||||
|
if (item->value == value) {
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
U0 @json_remove_item(@json_array* arr, I64 index)
|
U0 @json_remove_item(@json_array* arr, I64 index)
|
||||||
{
|
{
|
||||||
if (!arr)
|
if (!arr)
|
||||||
|
@ -1268,6 +1318,11 @@ U0 @json_callable_array_append_wrapper_function(U64 value, I64 type = NULL)
|
||||||
@json_append_item(JSON_WRAPPER_MAGIC_NUMBER, value, type);
|
@json_append_item(JSON_WRAPPER_MAGIC_NUMBER, value, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Bool @json_callable_array_contains_wrapper_function(U64 value, I64 type = NULL, Bool match_case = FALSE)
|
||||||
|
{
|
||||||
|
return @json_array_contains(JSON_WRAPPER_MAGIC_NUMBER, value, type, match_case);
|
||||||
|
}
|
||||||
|
|
||||||
U0 @json_callable_array_insert_wrapper_function(I64 index, U64 value, I64 type = NULL)
|
U0 @json_callable_array_insert_wrapper_function(I64 index, U64 value, I64 type = NULL)
|
||||||
{
|
{
|
||||||
@json_insert_item(JSON_WRAPPER_MAGIC_NUMBER, index, value, type);
|
@json_insert_item(JSON_WRAPPER_MAGIC_NUMBER, index, value, type);
|
||||||
|
@ -1319,6 +1374,19 @@ U0 @json_callable_array_remove_wrapper_function(I64 index)
|
||||||
a += 0x1b;
|
a += 0x1b;
|
||||||
@patch_call_rel32(a, &@json_append_item);
|
@patch_call_rel32(a, &@json_append_item);
|
||||||
|
|
||||||
|
// Create a copy of function and patch Contains
|
||||||
|
code_size = MSize(&@json_callable_array_contains_wrapper_function);
|
||||||
|
carr->contains = CAlloc(code_size, arr->mem_task->code_heap);
|
||||||
|
MemCpy(carr->contains, &@json_callable_array_contains_wrapper_function, code_size);
|
||||||
|
|
||||||
|
a = carr->contains;
|
||||||
|
a += 0x1b;
|
||||||
|
MemSetI64(a, carr, 1);
|
||||||
|
|
||||||
|
a = carr->contains;
|
||||||
|
a += 0x24;
|
||||||
|
@patch_call_rel32(a, &@json_array_contains);
|
||||||
|
|
||||||
// Create a copy of function and patch Prepend
|
// Create a copy of function and patch Prepend
|
||||||
code_size = MSize(&@json_callable_array_prepend_wrapper_function);
|
code_size = MSize(&@json_callable_array_prepend_wrapper_function);
|
||||||
carr->prepend = CAlloc(code_size, arr->mem_task->code_heap);
|
carr->prepend = CAlloc(code_size, arr->mem_task->code_heap);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue