1 #include "portability.h"
7 #include "../elk_config.h"
21 arr->
capacity = JSE_EXT_ARRAY_INITIAL_SIZE;
35 arr->
capacity = JSE_EXT_ARRAY_INITIAL_SIZE;
44 void jse_array_dump(
JSE_ARRAY arr,
int space){
45 char* sp = (
char*) calloc(1, (
sizeof(
char) * (space + 1)));
47 for (
int i = 0; i < arr.
size; i++) {
48 if (arr.pairs[i].
type == JSE_ARRAY_TYPE_INT) {
49 printf(
"%s[%d] Key: %s, Value (INT): %d\n",sp, i, arr.pairs[i].key, arr.pairs[i].
value.int_value);
50 }
else if (arr.pairs[i].
type == JSE_ARRAY_TYPE_STRING) {
51 printf(
"%s[%d] Key: %s, Value (STRING): %s\n",sp, i, arr.pairs[i].key, arr.pairs[i].
value.
str_value);
52 }
else if (arr.pairs[i].
type == JSE_ARRAY_TYPE_ARRAY) {
53 printf(
"%s[%d] Key: %s, Value (ARRAY): Size %d\n",sp, i, arr.pairs[i].key, arr.pairs[i].
value.
array_value->
size);
66 void jse_array_link_dump(
JSE_ARRAY* arr,
int space){
67 char* sp = (
char*)calloc(1,
sizeof(
char) * (space + 1));
69 for (
int i = 0; i < arr->
size; i++) {
70 if (arr->pairs[i].
type == JSE_ARRAY_TYPE_INT) {
71 printf(
"%s[%d] Key: %s, Value (INT): %d\n",sp, i, arr->pairs[i].key, arr->pairs[i].
value.int_value);
72 }
else if (arr->pairs[i].
type == JSE_ARRAY_TYPE_STRING) {
73 printf(
"%s[%d] Key: %s, Value (STRING): %s\n",sp, i, arr->pairs[i].key, arr->pairs[i].
value.
str_value);
74 }
else if (arr->pairs[i].
type == JSE_ARRAY_TYPE_ARRAY) {
75 printf(
"%s[%d] Key: %s, Value (ARRAY): Size %d\n",sp, i, arr->pairs[i].key, arr->pairs[i].
value.
array_value->
size);
89 if (data.type == JSE_ARRAY_TYPE_NULL) {
90 printf(
"[JSE] [Array] [DUMP] [VALUE] Invalid data\n");
93 char* sp = (
char*) calloc(1,
sizeof(
char) * (space + 1));
95 printf(
"[JSE] [Array] [DUMP] [VALUE] Success!\n%s Key: %s\n", sp, data.key);
96 printf(
"%s |--- Type: %d\n",sp, data.type);
97 if (data.type == JSE_ARRAY_TYPE_INT){
98 printf(
"%s |--- Value: %d\n",sp, data.value.int_value);
99 }
else if (data.type == JSE_ARRAY_TYPE_STRING){
100 printf(
"%s |--- Value: %s\n",sp, data.value.str_value);
101 }
else if (data.type == JSE_ARRAY_TYPE_ARRAY){
102 printf(
"%s |--- Value: (Array)\n",sp);
103 jse_array_dump(data.value.array_value[0],space + 4);
122 arr->pairs[arr->
size].key = jse_strdup(key);
138 if (Index >= 0 && Index < arr->size) {
140 if (arr->pairs[Index].
type == JSE_ARRAY_TYPE_ARRAY){
142 }
else if (arr->pairs[Index].
type == JSE_ARRAY_TYPE_STRING){
145 arr->pairs[Index].
value = value;
146 arr->pairs[Index].
type = type;
148 qemu_err(
"Error: Index out of bounds\n");
161 for (
int i = 0; i < arr->
size; i++) {
162 if (
strcmp(arr->pairs[i].key, key) == 0) {
164 return arr->pairs[i];
181 if (index >= 0 && index < arr->size) {
182 return arr->pairs[index];
195 for (
int i = 0; i < arr->
size; i++) {
197 free(arr->pairs[i].key);
198 if (arr->pairs[i].
type == JSE_ARRAY_TYPE_NULL ||
199 arr->pairs[i].
type != JSE_ARRAY_TYPE_STRING ||
200 arr->pairs[i].
type != JSE_ARRAY_TYPE_INT ||
201 arr->pairs[i].
type != JSE_ARRAY_TYPE_ARRAY
203 qemu_log(
"[Array] Skipping data");
206 if (arr->pairs[i].
type == JSE_ARRAY_TYPE_STRING) {
208 }
else if (arr->pairs[i].
type == JSE_ARRAY_TYPE_ARRAY) {
214 qemu_note(
"[Array] 2.Free %x",arr->pairs);
218 qemu_note(
"[Array] 3.Free %x",arr);
233 for (
int i = 0; i < orig->
size; i++) {
234 char* new_key = jse_strdup(orig->pairs[i].key);
235 (uppercase ?jse_func_toupper(new_key):jse_func_tolower(new_key));
236 jse_array_push(&new_arr, new_key, orig->pairs[i].
value, orig->pairs[i].
type);
252 for (
int i = start_index; i < start_index + count; i++) {
254 if (arr->pairs[i].
type == JSE_ARRAY_TYPE_STRING) {
256 }
else if (arr->pairs[i].
type == JSE_ARRAY_TYPE_ARRAY) {
259 arr->pairs[i].
value = value;
260 arr->pairs[i].
type = type;
266 arr->pairs[i].key = jse_strdup(
"");
267 arr->pairs[i].
value = value;
268 arr->pairs[i].
type = type;
283 JSE_ARRAY diff_array = jse_array_create();
285 for (
int i = 0; i <
array->size; i++) {
286 int found_in_other = 0;
287 for (
int j = 0; j < other_array->
size; j++) {
288 if (
array->pairs[i].type == other_array->pairs[j].
type) {
289 if (
array->pairs[i].type == JSE_ARRAY_TYPE_INT) {
290 if (
array->pairs[i].value.int_value == other_array->pairs[j].
value.int_value) {
294 }
else if (
array->pairs[i].type == JSE_ARRAY_TYPE_STRING) {
299 }
else if (
array->pairs[i].type == JSE_ARRAY_TYPE_ARRAY) {
302 if (nested_diff.
size > 0) {
304 jse_array_push(&diff_array,
array->pairs[i].key,
array->pairs[i].value,
array->pairs[i].type);
309 if (!found_in_other) {
310 jse_array_push(&diff_array,
array->pairs[i].key,
array->pairs[i].value,
array->pairs[i].type);
320 void jse_array_test(){
323 jse_array_push(&array1,
"age", (
JSE_ARRAY_VALUE){.int_value = 30}, JSE_ARRAY_TYPE_INT);
324 jse_array_push(&array1,
"name", (
JSE_ARRAY_VALUE){.str_value = jse_strdup(
"John")}, JSE_ARRAY_TYPE_STRING);
328 JSE_ARRAY nested_array1 = jse_array_create();
329 jse_array_push(&nested_array1,
"item1", (
JSE_ARRAY_VALUE){.int_value = 10}, JSE_ARRAY_TYPE_INT);
330 jse_array_push(&nested_array1,
"item2", (
JSE_ARRAY_VALUE){.str_value = jse_strdup(
"nested")}, JSE_ARRAY_TYPE_STRING);
331 jse_array_push(&array1,
"nested", (
JSE_ARRAY_VALUE){.array_value = &nested_array1}, JSE_ARRAY_TYPE_ARRAY);
334 jse_array_push(&array2,
"age", (
JSE_ARRAY_VALUE){.int_value = 30}, JSE_ARRAY_TYPE_INT);
335 jse_array_push(&array2,
"name", (
JSE_ARRAY_VALUE){.str_value = jse_strdup(
"Jane")}, JSE_ARRAY_TYPE_STRING);
338 JSE_ARRAY nested_array2 = jse_array_create();
339 jse_array_push(&nested_array2,
"item1", (
JSE_ARRAY_VALUE){.int_value = 10}, JSE_ARRAY_TYPE_INT);
340 jse_array_push(&nested_array2,
"item2", (
JSE_ARRAY_VALUE){.str_value = jse_strdup(
"nested")}, JSE_ARRAY_TYPE_STRING);
341 jse_array_push(&nested_array2,
"item3", (
JSE_ARRAY_VALUE){.str_value = jse_strdup(
"new")}, JSE_ARRAY_TYPE_STRING);
342 jse_array_push(&array2,
"nested", (
JSE_ARRAY_VALUE){.array_value = &nested_array2}, JSE_ARRAY_TYPE_ARRAY);
344 jse_array_value_dump(jse_array_getByKey(&array2,
"nested"),4);
345 jse_array_value_dump(jse_array_getByKey(&array2,
"i5ufjk4uj"),8);
348 JSE_ARRAY diff = jse_array_diff(&array1, &array2);
351 printf(
"Difference between array1 and array2:\n");
352 jse_array_dump(diff,4);
355 jse_array_free(&array1);
356 jse_array_free(&array2);
357 jse_array_free(&diff);
361 jsval_t jse_ext_array(
struct js *
js, jsval_t *args,
int nargs) {
363 qemu_log(
"JGA size: %d ",JSE_GLOBAL_ARRAY.
size);
369 arr->
capacity = JSE_EXT_ARRAY_INITIAL_SIZE;
371 qemu_log(
"Created array: %x ",arr);
372 jse_array_push(&JSE_GLOBAL_ARRAY,
"__GLOBAL__", (
JSE_ARRAY_VALUE){.array_value = arr}, JSE_ARRAY_TYPE_ARRAY);
374 qemu_log(
"JGA size: %d ",JSE_GLOBAL_ARRAY.
size);
375 qemu_log(
"ARR size: %d ",arr->
size);
377 return js_mknum(JSE_GLOBAL_ARRAY.
size - 1);
380 jsval_t jse_ext_array_push(
struct js *
js, jsval_t *args,
int nargs) {
383 if (nargs < 3)
return js_mkerr(
js,
"%n args are required.", 3);
384 int Index = jse_getInt(
js,args[0]);
385 const char* Key = js_str(
js,args[1]);
386 JSE_ARRAY_DATA data = jse_array_getByIndex(&JSE_GLOBAL_ARRAY, Index);
388 if (data.type != JSE_ARRAY_TYPE_ARRAY){
389 return js_mkerr(
js,
"This element is not an array.");
398 int val_type = js_type(args[2]);
400 if (val_type == JS_NUM){
401 jse_array_push(arr, Key, (
JSE_ARRAY_VALUE){.int_value = js_getnum(args[2])}, JSE_ARRAY_TYPE_INT);
402 }
else if (val_type == JS_STR) {
403 const char* Value = js_str(
js,args[2]);
404 jse_array_push(arr, Key, (
JSE_ARRAY_VALUE){.str_value = jse_strdup(Value)}, JSE_ARRAY_TYPE_STRING);
405 }
else if (val_type == JS_UNDEF || val_type == JS_FALSE || val_type == JS_NULL){
406 jse_array_push(arr, Key, (
JSE_ARRAY_VALUE){.int_value = 0}, JSE_ARRAY_TYPE_INT);
407 }
else if (val_type == JS_TRUE){
408 jse_array_push(arr, Key, (
JSE_ARRAY_VALUE){.int_value = 1}, JSE_ARRAY_TYPE_INT);
410 qemu_note(
"Undetected type: %x", val_type);
413 return js_mknum(arr->
size - 1);
417 jsval_t jse_ext_array_editByID(
struct js *
js, jsval_t *args,
int nargs) {
420 if (nargs < 3)
return js_mkerr(
js,
"%n args are required.", 3);
421 int Index = jse_getInt(
js,args[0]);
422 int Key = jse_getInt(
js,args[1]);
423 JSE_ARRAY_DATA data = jse_array_getByIndex(&JSE_GLOBAL_ARRAY, Index);
425 if (data.type != JSE_ARRAY_TYPE_ARRAY){
426 return js_mkerr(
js,
"This element is not an array.");
435 int val_type = js_type(args[2]);
437 if (val_type == JS_NUM){
438 jse_array_editByID(arr, Key, (
JSE_ARRAY_VALUE){.int_value = js_getnum(args[2])}, JSE_ARRAY_TYPE_INT);
439 }
else if (val_type == JS_STR) {
440 const char* Value = js_str(
js,args[2]);
441 jse_array_editByID(arr, Key, (
JSE_ARRAY_VALUE){.str_value = jse_strdup(Value)}, JSE_ARRAY_TYPE_STRING);
442 }
else if (val_type == JS_UNDEF || val_type == JS_FALSE || val_type == JS_NULL){
443 jse_array_editByID(arr, Key, (
JSE_ARRAY_VALUE){.int_value = 0}, JSE_ARRAY_TYPE_INT);
444 }
else if (val_type == JS_TRUE){
445 jse_array_editByID(arr, Key, (
JSE_ARRAY_VALUE){.int_value = 1}, JSE_ARRAY_TYPE_INT);
447 qemu_note(
"Undetected type: %x", val_type);
454 jsval_t jse_ext_array_getByKey(
struct js *
js, jsval_t *args,
int nargs) {
457 if (nargs < 2)
return js_mkerr(
js,
"%n args are required.", 2);
458 int Index = jse_getInt(
js,args[0]);
459 const char* Key = js_str(
js,args[1]);
460 JSE_ARRAY_DATA data = jse_array_getByIndex(&JSE_GLOBAL_ARRAY, Index);
462 if (data.type != JSE_ARRAY_TYPE_ARRAY){
463 return js_mkerr(
js,
"This element is not an array.");
473 if (a_data.
type == JSE_ARRAY_TYPE_NULL)
return js_mkundef();
474 if (a_data.
type == JSE_ARRAY_TYPE_ARRAY)
return js_mkstr(
js,
"(Array)",
strlen(
"(Array)"));
476 if (a_data.
type == JSE_ARRAY_TYPE_STRING)
return js_mkstr(
js,a_val.
str_value,
strlen(
"a_val.str_value"));
477 if (a_data.
type == JSE_ARRAY_TYPE_INT) {
478 char* buf = calloc(1, 64);
479 itoa(a_val.int_value, buf);
480 jsval_t ret = js_mkstr(
js, buf,
strlen(buf));
488 jsval_t jse_ext_array_getByIndex(
struct js *
js, jsval_t *args,
int nargs) {
490 if (nargs < 2)
return js_mkerr(
js,
"%n args are required.", 2);
491 int Index = jse_getInt(
js,args[0]);
492 int Key = jse_getInt(
js,args[1]);
493 JSE_ARRAY_DATA data = jse_array_getByIndex(&JSE_GLOBAL_ARRAY, Index);
495 if (data.type != JSE_ARRAY_TYPE_ARRAY){
496 qemu_err(
"It's no ARRAY!");
507 if (a_data.
type == JSE_ARRAY_TYPE_NULL)
return js_mkundef();
508 if (a_data.
type == JSE_ARRAY_TYPE_ARRAY)
return js_mkstr(
js,
"(Array)",
strlen(
"(Array)"));
510 if (a_data.
type == JSE_ARRAY_TYPE_STRING)
return js_mkstr(
js,a_val.
str_value,
strlen(
"a_val.str_value"));
511 if (a_data.
type == JSE_ARRAY_TYPE_INT) {
512 char* buf = calloc(1, 64);
513 itoa(a_val.int_value, buf);
514 jsval_t ret = js_mkstr(
js, buf,
strlen(buf));
521 jsval_t jse_ext_array_length(
struct js *
js, jsval_t *args,
int nargs) {
523 if (nargs < 1)
return js_mkerr(
js,
"%n args are required.", 1);
524 int Index = jse_getInt(
js,args[0]);
525 JSE_ARRAY_DATA data = jse_array_getByIndex(&JSE_GLOBAL_ARRAY, Index);
527 if (data.type != JSE_ARRAY_TYPE_ARRAY){
528 qemu_err(
"It's no ARRAY!");
538 return js_mknum(arr->
size);
541 jsval_t jse_ext_array_dump(
struct js *
js, jsval_t *args,
int nargs) {
543 if (nargs < 1)
return js_mkerr(
js,
"%n args are required.", 1);
544 int Index = jse_getInt(
js,args[0]);
545 JSE_ARRAY_DATA data = jse_array_getByIndex(&JSE_GLOBAL_ARRAY, Index);
547 if (data.type != JSE_ARRAY_TYPE_ARRAY){
548 qemu_err(
"It's no ARRAY!");
556 jse_array_link_dump(arr,0);
561 jsval_t jse_ext_array_diff(
struct js *
js, jsval_t *args,
int nargs) {
563 if (nargs < 2)
return js_mkerr(
js,
"%n args are required.", 2);
564 int Index = jse_getInt(
js,args[0]);
565 int Index2 = jse_getInt(
js,args[1]);
566 JSE_ARRAY_DATA data = jse_array_getByIndex(&JSE_GLOBAL_ARRAY, Index);
568 if (data.type != JSE_ARRAY_TYPE_ARRAY){
569 qemu_err(
"#1 It's no ARRAY!");
573 JSE_ARRAY_DATA data2 = jse_array_getByIndex(&JSE_GLOBAL_ARRAY, Index2);
575 if (data2.
type != JSE_ARRAY_TYPE_ARRAY){
576 qemu_err(
"#2 It's no ARRAY!");
591 diff_array->
size = 0;
592 diff_array->
capacity = JSE_EXT_ARRAY_INITIAL_SIZE;
594 qemu_log(
"Created array: %x ",diff_array);
595 jse_array_push(&JSE_GLOBAL_ARRAY,
"__GLOBAL__", (
JSE_ARRAY_VALUE){.array_value = diff_array}, JSE_ARRAY_TYPE_ARRAY);
597 for (
int i = 0; i <
array->size; i++) {
598 int found_in_other = 0;
599 for (
int j = 0; j < other_array->
size; j++) {
600 if (
array->pairs[i].type == other_array->pairs[j].
type) {
601 if (
array->pairs[i].type == JSE_ARRAY_TYPE_INT) {
602 if (
array->pairs[i].value.int_value == other_array->pairs[j].
value.int_value) {
606 }
else if (
array->pairs[i].type == JSE_ARRAY_TYPE_STRING) {
611 }
else if (
array->pairs[i].type == JSE_ARRAY_TYPE_ARRAY) {
614 if (nested_diff.
size > 0) {
616 jse_array_push(&diff_array,
array->pairs[i].key,
array->pairs[i].value,
array->pairs[i].type);
621 if (!found_in_other) {
622 jse_array_push(diff_array,
array->pairs[i].key,
array->pairs[i].value,
array->pairs[i].type);
628 return js_mknum(JSE_GLOBAL_ARRAY.
size - 1);
636 void jse_array_config(
struct js*
js){
637 qemu_note(
"[JSE] [EXT] [Array] Registration of functions");
638 JSE_GLOBAL_ARRAY = jse_array_create();
639 js_set(
js, js_glob(
js),
"array", js_mkfun(jse_ext_array));
640 js_set(
js, js_glob(
js),
"array_push", js_mkfun(jse_ext_array_push));
641 js_set(
js, js_glob(
js),
"array_getByKey", js_mkfun(jse_ext_array_getByKey));
642 js_set(
js, js_glob(
js),
"array_getByIndex", js_mkfun(jse_ext_array_getByIndex));
643 js_set(
js, js_glob(
js),
"array_length", js_mkfun(jse_ext_array_length));
644 js_set(
js, js_glob(
js),
"array_dump", js_mkfun(jse_ext_array_dump));
645 js_set(
js, js_glob(
js),
"array_diff", js_mkfun(jse_ext_array_diff));
646 js_set(
js, js_glob(
js),
"array_editByID", js_mkfun(jse_ext_array_editByID));
652 char* sp = (
char*)calloc(1,
sizeof(
char) * (space + 1));
656 qemu_note(
"%s|--- Size:%d | Capacity:%d", sp,
array->size,
array->capacity);
657 for (
int i = 0; i <
array->size; i++){
658 qemu_note(
"%s|--- Delete data %d / %d",sp, i + 1,
array->size);
659 if (
array->pairs[i].type != JSE_ARRAY_TYPE_STRING &&
660 array->pairs[i].type != JSE_ARRAY_TYPE_INT &&
661 array->pairs[i].type != JSE_ARRAY_TYPE_ARRAY){
662 qemu_log(
" %s |--- Skipping data (Fantom type: %x)", sp,
array->pairs[i].type);
665 free(
array->pairs[i].key);
666 qemu_ok(
" %s |--- Delete key",sp);
667 if (
array->pairs[i].type == JSE_ARRAY_TYPE_STRING) {
668 free(
array->pairs[i].value.str_value);
669 qemu_ok(
" %s |--- Delete string",sp);
670 }
else if (
array->pairs[i].type == JSE_ARRAY_TYPE_ARRAY) {
673 qemu_note(
"%s |--- [IGN] GOTO %x",sp ,
array->pairs[i].value.array_value);
677 qemu_ok(
" %s|--- Delete pars",sp);
679 qemu_ok(
" %s|--- Delete array",sp);
684 void jse_array_destroy(
struct js*
js){
687 qemu_note(
"[JSE] [EXT] [Array] Destroy");
689 qemu_note(
" |--- Size:%d | Capacity:%d", JSE_GLOBAL_ARRAY.
size, JSE_GLOBAL_ARRAY.
capacity);
690 for (
int i = 0; i < JSE_GLOBAL_ARRAY.
size; i++){
691 qemu_note(
" |--- Delete data %d / %d", i + 1, JSE_GLOBAL_ARRAY.
size);
692 free(JSE_GLOBAL_ARRAY.pairs[i].key);
693 qemu_ok(
" |--- Delete key");
694 if (JSE_GLOBAL_ARRAY.pairs[i].
type == JSE_ARRAY_TYPE_STRING) {
696 qemu_ok(
" |--- Delete string");
697 }
else if (JSE_GLOBAL_ARRAY.pairs[i].
type == JSE_ARRAY_TYPE_ARRAY) {
703 qemu_ok(
" |--- Delete global pars");
704 free(JSE_GLOBAL_ARRAY.pairs);
705 qemu_ok(
" |--- Delete global array");
size_t strlen(const char *str)
Возращает длину строки
int strcmp(const char *s1, const char *s2)
Сравнение строк
void * memset(void *ptr, char value, size_t num)
Заполнение массива указанными символами
size_t itoa(int32_t n, char *buffer)
Конвертируем число в символы
JSE_ARRAY_VALUE value
! Ключ
JSE_ARRAY_TYPE type
! Значение
int size
! Данные (ключ,значение)
int capacity
! Кол-во элементов
struct JSE_ARRAY * array_value
! Строка (при JSE_ARRAY_TYPE_STRING)
char * str_value
! Числовое значение (при JSE_ARRAY_TYPE_INT)