From ae15dd5490fcf3e5185f5966da33dc061a1f67e7 Mon Sep 17 00:00:00 2001
From: "yu.dongliang" <18588496441@163.com>
Date: Thu, 18 Jun 2026 20:02:24 +0800
Subject: [PATCH] 1, css: support counter, 2, js: support setTimeout() with
variable args, 3, fix: some BUGS in native/x64.
---
examples/{js2.html => js_func.html} | 0
examples/js_obj_func.html | 22 +
examples/js_setTimeout.html | 21 +
examples/{js.html => js_switch.html} | 0
html/Makefile | 3 +-
html/abc_css.c | 20 +-
html/abc_css_counter.c | 234 +++++++++--
html/abc_html.c | 36 +-
html/abc_html.h | 28 +-
html/abc_obj.c | 4 +-
html/abc_obj.h | 21 +-
html/main.c | 4 +-
js/Makefile | 4 +
js/abc_libjs.c | 81 ++++
js/abc_libjs.so | Bin 64528 -> 136824 bytes
js/abc_libjs_asm.S | 67 +++
js/core/scf_3ac.c | 6 +-
js/core/scf_3ac.h | 4 +-
js/core/scf_ast.c | 42 +-
js/core/scf_basic_block.c | 2 +-
js/core/scf_block.h | 3 +-
js/core/scf_calculate.c | 33 +-
js/core/scf_calculate.h | 1 -
js/core/scf_calculate_i32.c | 1 -
js/core/scf_calculate_i64.c | 1 -
js/core/scf_calculate_u32.c | 1 -
js/core/scf_calculate_u64.c | 65 +++
js/core/scf_expr.c | 3 +-
js/core/scf_function.c | 21 +-
js/core/scf_function.h | 8 +-
js/core/scf_label.c | 4 -
js/core/scf_node.c | 31 +-
js/core/scf_node.h | 17 +-
js/core/scf_operator_handler_3ac.c | 48 +--
js/core/scf_optimizer_inline.c | 21 +-
js/core/scf_optimizer_js_array.c | 4 +-
js/core/scf_optimizer_js_array2.c | 75 ++--
js/core/scf_optimizer_js_teq.c | 2 +-
js/core/scf_optimizer_js_unary_op.c | 4 +-
js/core/scf_scope.c | 76 +---
js/core/scf_scope.h | 41 +-
js/core/scf_type.c | 13 +-
js/core/scf_type.h | 12 +-
js/core/scf_variable.c | 2 +-
js/doc.c | 70 +++-
js/elf/scf_dwarf.c | 31 ++
js/elf/scf_dwarf.h | 4 +
js/lex/scf_lex_util.c | 496 +++++++++++++++--------
js/lib/scf_rbtree.c | 4 +-
js/native/x64/scf_x64.c | 70 ++--
js/native/x64/scf_x64_inst.c | 6 +-
js/native/x64/scf_x64_inst_common.c | 78 ++--
js/native/x64/scf_x64_peephole.c | 153 +++----
js/native/x64/scf_x64_reg.c | 100 +++--
js/native/x64/scf_x64_reg.h | 4 +-
js/parse/scf_dfa_call.c | 50 ++-
js/parse/scf_dfa_class.c | 2 +-
js/parse/scf_dfa_container.c | 2 +-
js/parse/scf_dfa_expr.c | 9 +-
js/parse/scf_dfa_function.c | 4 +-
js/parse/scf_dfa_function_js.c | 2 +-
js/parse/scf_dfa_goto.c | 6 +-
js/parse/scf_dfa_include.c | 4 +-
js/parse/scf_dfa_init_data.c | 12 +-
js/parse/scf_dfa_label.c | 3 +-
js/parse/scf_dfa_new.c | 6 +-
js/parse/scf_dfa_type.c | 2 +-
js/parse/scf_dfa_va_arg.c | 2 +-
js/parse/scf_dfa_var.c | 12 +-
js/parse/scf_operator_handler_const.c | 2 +-
js/parse/scf_operator_handler_semantic.c | 38 +-
js/parse/scf_parse.c | 247 ++++-------
js/parse/scf_struct_array.c | 29 +-
js/parse/scf_symtab.c | 100 +++++
js/parse/scf_symtab.h | 37 ++
js/util/scf_string.c | 2 +-
js/util/scf_string.h | 2 +-
ui/Makefile | 2 +
ui/abc_layout.c | 7 +-
ui/abc_layout_text.c | 7 +-
ui/main.c | 77 ++--
81 files changed, 1751 insertions(+), 1017 deletions(-)
rename examples/{js2.html => js_func.html} (100%)
create mode 100644 examples/js_obj_func.html
create mode 100644 examples/js_setTimeout.html
rename examples/{js.html => js_switch.html} (100%)
create mode 100644 js/abc_libjs_asm.S
create mode 100644 js/core/scf_calculate_u64.c
create mode 100644 js/parse/scf_symtab.c
create mode 100644 js/parse/scf_symtab.h
diff --git a/examples/js2.html b/examples/js_func.html
similarity index 100%
rename from examples/js2.html
rename to examples/js_func.html
diff --git a/examples/js_obj_func.html b/examples/js_obj_func.html
new file mode 100644
index 0000000..0c3cb9b
--- /dev/null
+++ b/examples/js_obj_func.html
@@ -0,0 +1,22 @@
+
+
+
+
+嫿javascriptç页é¢
+
+嫿jsç页é¢
+
+
+
+
+
diff --git a/examples/js_setTimeout.html b/examples/js_setTimeout.html
new file mode 100644
index 0000000..83b1ea6
--- /dev/null
+++ b/examples/js_setTimeout.html
@@ -0,0 +1,21 @@
+
+
+
+
+è鏿ç¨(runoob.com)
+
+
+
+åè°å½æ°çå¾
3 ç§åæ§è¡ã
+
+
+
+
+
+
diff --git a/examples/js.html b/examples/js_switch.html
similarity index 100%
rename from examples/js.html
rename to examples/js_switch.html
diff --git a/html/Makefile b/html/Makefile
index bbb8c73..b11e664 100644
--- a/html/Makefile
+++ b/html/Makefile
@@ -20,8 +20,9 @@ CFILES += ../js/lex/scf_lex.c
CFILES += ../js/lex/scf_lex_util.c
CFILES += ../js/parse/main.c
-CFILES += ../js/parse/scf_parse_util.c
CFILES += ../js/parse/scf_parse.c
+CFILES += ../js/parse/scf_parse_util.c
+CFILES += ../js/parse/scf_symtab.c
CFILES += ../js/parse/scf_operator_handler_semantic.c
CFILES += ../js/parse/scf_operator_handler_expr.c
CFILES += ../js/parse/scf_operator_handler_const.c
diff --git a/html/abc_css.c b/html/abc_css.c
index 16112df..8e25c92 100644
--- a/html/abc_css.c
+++ b/html/abc_css.c
@@ -1683,24 +1683,30 @@ int abc_css_clear(abc_obj_t* obj, int pse_start, int pse_end)
{
abc_attr_t* attr;
int i;
+ int n = 0;
for (i = pse_start; i <= pse_end; i++)
{
attr = abc_obj_get_attr(obj, i);
- if (attr)
+ if (!attr)
+ continue;
+
+ if (attr->flags & ABC_CSS_FLAG_ON) {
attr->flags &= ~ABC_CSS_FLAG_ON;
+ n++;
+ }
}
- return 0;
+ return n;
}
int abc_css_active(abc_obj_t* obj, int pse)
{
abc_attr_t* attr = abc_obj_get_attr(obj, pse);
- if (attr) {
- attr->flags |= ABC_CSS_FLAG_ON;
- return 1;
- }
- return 0;
+ if (!attr || (attr->flags & ABC_CSS_FLAG_ON))
+ return 0;
+
+ attr->flags |= ABC_CSS_FLAG_ON;
+ return 1;
}
diff --git a/html/abc_css_counter.c b/html/abc_css_counter.c
index a91985a..67431a0 100644
--- a/html/abc_css_counter.c
+++ b/html/abc_css_counter.c
@@ -1,11 +1,48 @@
#include"abc_html.h"
+static int __cmp_ref_counter(const void* counter, const void* ref)
+{
+ const ref_count_t* r = ref;
+
+ if (r->counter == counter)
+ return 0;
+ return -1;
+}
+
+static int __sort_ref_counter(const void* v0, const void* v1)
+{
+ const ref_count_t* r0 = *(const ref_count_t**)v0;
+ const ref_count_t* r1 = *(const ref_count_t**)v1;
+
+ if (r0->layer < r1->layer)
+ return -1;
+
+ else if (r0->layer > r1->layer)
+ return 1;
+ return 0;
+}
+
+css_count_t* css_count_alloc(const char* name, size_t len)
+{
+ css_count_t* cnt = calloc(1, sizeof(css_count_t));
+ if (!cnt)
+ return NULL;
+
+ cnt->name = scf_string_cstr_len(name, len);
+ if (!cnt->name) {
+ free(cnt);
+ return NULL;
+ }
+
+ return cnt;
+}
+
int abc_css_counter_reset(abc_obj_t* obj, abc_attr_t* attr)
{
if (!obj || !attr || !attr->value || 0 == attr->value->len)
return -EINVAL;
- css_count_t* cnt = obj->counter_list;
+ css_count_t* cnt = obj->reset_counters;
while (cnt) {
if (!scf_string_cmp(cnt->name, attr->value))
break;
@@ -13,26 +50,100 @@ int abc_css_counter_reset(abc_obj_t* obj, abc_attr_t* attr)
}
if (!cnt) {
- cnt = calloc(1, sizeof(css_count_t));
+ cnt = css_count_alloc(attr->value->data, attr->value->len);
if (!cnt)
return -ENOMEM;
- cnt->name = scf_string_clone(attr->value);
- if (!cnt->name) {
- free(cnt);
- return -ENOMEM;
+ cnt->next = obj->reset_counters;
+ obj->reset_counters = cnt;
+
+ } else if (cnt->objs) {
+ abc_obj_t* tmp;
+ int i;
+
+ for (i = 0; i < cnt->objs->size; i++) {
+ tmp = cnt->objs->data[i];
+
+ if (tmp->content) {
+ scf_string_free(tmp->content);
+ tmp->content = NULL;
+ }
+
+ ref_count_t* r = scf_vector_find_cmp(tmp->used_counters, cnt, __cmp_ref_counter);
+ if (r)
+ assert(0 == scf_vector_del(tmp->used_counters, r));
+
+ tmp->css_used = 0;
+
+ scf_logw("cnt: %p, i: %d, obj: %p, css_used: %u\n", cnt, i, tmp, tmp->css_used);
}
- cnt->next = obj->counter_list;
- obj->counter_list = cnt;
+ scf_vector_free(cnt->objs);
+ cnt->objs = NULL;
}
cnt->value = 0;
- scf_logd("cnt->name: %s, value: %ld\n", cnt->name->data, cnt->value);
+ scf_logd("cnt->name: %s, value: %d\n", cnt->name->data, cnt->value);
return 0;
}
+static int __css_ref_counter(abc_obj_t* obj, css_count_t* cnt, int layer)
+{
+ if (!obj->used_counters) {
+ obj ->used_counters = scf_vector_alloc();
+
+ if (!obj->used_counters)
+ return -ENOMEM;
+ }
+
+ ref_count_t* r = scf_vector_find_cmp(obj->used_counters, cnt, __cmp_ref_counter);
+
+ if (!r) {
+ r = calloc(1, sizeof(ref_count_t));
+ if (!r)
+ return -ENOMEM;
+
+ int ret = scf_vector_add(obj->used_counters, r);
+ if (ret < 0) {
+ free(r);
+ return ret;
+ }
+
+ r->counter = cnt;
+ r->value = cnt->value;
+ }
+
+ r->layer = layer;
+
+ scf_logi("#0 r: %p, cnt: %p, value: %d, layer: %d, obj: %p\n", r, cnt, cnt->value, layer, obj);
+ return 0;
+}
+
+static int __css_inc_counter(abc_obj_t* obj, css_count_t* cnt)
+{
+ if (!cnt->objs) {
+ cnt ->objs = scf_vector_alloc();
+
+ if (!cnt->objs)
+ return -ENOMEM;
+ }
+
+ if (scf_vector_find(cnt->objs, obj))
+ return 0;
+
+ int ret = scf_vector_add(cnt->objs, obj);
+ if (ret < 0)
+ return ret;
+
+ cnt->value++;
+
+ printf("\n");
+ scf_logw("## cnt: %p, value: %d, obj: %p\n", cnt, cnt->value, obj);
+
+ return __css_ref_counter(obj, cnt, 0);
+}
+
int abc_css_counter_inc(abc_obj_t* obj, abc_attr_t* attr)
{
if (!obj || !attr || !attr->value || 0 == attr->value->len)
@@ -43,52 +154,44 @@ int abc_css_counter_inc(abc_obj_t* obj, abc_attr_t* attr)
for (parent = obj->parent; parent; parent = parent->parent) {
- for (cnt = parent->counter_list; cnt; cnt = cnt->next)
+ for (cnt = parent->reset_counters; cnt; cnt = cnt->next)
{
- if (!scf_string_cmp(cnt->name, attr->value)) {
- cnt->value++;
- return 0;
- }
+ if (scf_string_cmp(cnt->name, attr->value))
+ continue;
+
+ return __css_inc_counter(obj, cnt);
}
}
return -EINVAL;
}
-static int __css_recursive_counter(scf_string_t* content, abc_obj_t* parent, const char* name, int len, const char* split, int split_len, int all_flag)
+static int __css_use_counter(abc_obj_t* obj, css_count_t* cnt, int layer)
{
- if (all_flag && parent->parent) {
+ if (!cnt->objs) {
+ cnt ->objs = scf_vector_alloc();
- int ret = __css_recursive_counter(content, parent->parent, name, len, split, split_len, all_flag);
- if (ret < 0)
- return ret;
+ if (!cnt->objs)
+ return -ENOMEM;
}
- css_count_t* cnt;
+ ref_count_t* r;
- for (cnt = parent->counter_list; cnt; cnt = cnt->next) {
+ if (scf_vector_find(cnt->objs, obj)) {
+ r = scf_vector_find_cmp(obj->used_counters, cnt, __cmp_ref_counter);
+ assert(r);
- if (cnt->name->len == len && !memcmp(cnt->name->data, name, len)) {
- uint8_t buf[128];
+ r->layer = layer;
- int n = snprintf(buf, sizeof(buf) - 1, "%ld", cnt->value);
-
- int ret = scf_string_cat_cstr_len(content, buf, n);
- if (ret < 0)
- return ret;
-
- if (split && split_len > 0) {
-
- ret = scf_string_cat_cstr_len(content, split, split_len);
- if (ret < 0)
- return ret;
- }
-
- break;
- }
+ scf_logi("#1 r: %p, cnt: %p, value: %d, layer: %d, obj: %p\n", r, r->counter, r->value, r->layer, obj);
+ return 0;
}
- return 0;
+ int ret = scf_vector_add(cnt->objs, obj);
+ if (ret < 0)
+ return ret;
+
+ return __css_ref_counter(obj, cnt, layer);
}
static int __css_counter(abc_obj_t* obj, abc_attr_t* attr, int lp, int comma, int rp, int all_flag)
@@ -115,9 +218,58 @@ static int __css_counter(abc_obj_t* obj, abc_attr_t* attr, int lp, int comma, in
}
}
- int split_len = (int)(split2 - split);
+ abc_obj_t* parent;
+ css_count_t* cnt;
+ ref_count_t* r;
+
+ int layer = 0;
+ int ret;
+
+ for (parent = obj->parent; parent; parent = parent->parent) {
+
+ for (cnt = parent->reset_counters; cnt; cnt = cnt->next) {
+
+ if (cnt->name->len == len && !memcmp(cnt->name->data, name, len)) {
+
+ ret = __css_use_counter(obj, cnt, layer);
+ if (ret < 0)
+ return ret;
+
+ if (!all_flag)
+ goto found;
+
+ layer++;
+ break;
+ }
+ }
+ }
+
+found:
+ if (!obj->used_counters)
+ return 0;
+
+ scf_vector_qsort(obj->used_counters, __sort_ref_counter);
- return __css_recursive_counter(obj->content, obj->parent, name, len, split, split_len, all_flag);
+ for (i = obj->used_counters->size - 1; i >= 0; i--) {
+ r = obj->used_counters->data[i];
+
+ scf_logi("#2 i: %d, r: %p, cnt: %p, value: %d, layer: %d, obj: %p\n", i, r, r->counter, r->value, r->layer, obj);
+
+ uint8_t buf[128];
+ int n = snprintf(buf, sizeof(buf) - 1, "%d", r->value);
+
+ ret = scf_string_cat_cstr_len(obj->content, buf, n);
+ if (ret < 0)
+ return ret;
+
+ if (split && split2 > split) {
+ ret = scf_string_cat_cstr_len(obj->content, split, (size_t)(split2 - split));
+ if (ret < 0)
+ return ret;
+ }
+ }
+
+ return 0;
}
int abc_css_content(abc_obj_t* obj, abc_attr_t* attr)
diff --git a/html/abc_html.c b/html/abc_html.c
index 37946b0..47ed2d1 100644
--- a/html/abc_html.c
+++ b/html/abc_html.c
@@ -902,6 +902,8 @@ int abc_html_open(abc_html_t** pp, const char* path)
if (!html)
return -ENOMEM;
+ scf_rbtree_init(&html->timers);
+
html->io.proto = io->proto;
html->io.priv = NULL;
html->io.open = io->open;
@@ -1381,10 +1383,6 @@ static int __html_run_js(abc_html_t* html, abc_obj_t* obj)
if (ret < 0)
return ret;
- ret = __html_js_path(&obj->js_entry, obj, NULL, NULL, 0);
- if (ret < 0)
- return ret;
-
if (!html->js) {
ret = scf_parse_open(&html->js);
if (ret < 0)
@@ -1422,12 +1420,13 @@ static int __html_run_js(abc_html_t* html, abc_obj_t* obj)
#if 1
assert(!html->io.tmp_list_js);
- void* so = dlopen(obj->js_so->data, RTLD_LAZY);
- void (*f)() = dlsym(so, "__js_main");
+ obj->js_so_handle = dlopen(obj->js_so->data, RTLD_LAZY);
+ void (*f)(void*) = dlsym (obj->js_so_handle, "__js_main");
+
+ html->js_auto_freep = dlsym(obj->js_so_handle, "scf__auto_freep_array");
+ html->js_release = dlsym(obj->js_so_handle, "Object___release_Object1");
f(html);
- dlclose(so);
- so = NULL;
#endif
abc_char_t* c;
while ( html->io.tmp_list_js) {
@@ -1560,11 +1559,13 @@ static int __html_parse_obj(abc_html_t* html, abc_char_t* c)
} else
ret = __html_parse_text(html, obj);
+ int err;
switch (obj->type)
{
case ABC_HTML_SCRIPT:
- if (__html_run_js(html, obj) < 0)
- return -1;
+ err = __html_run_js(html, obj);
+ if (err < 0)
+ return err;
break;
case ABC_HTML_LINK:
@@ -1576,19 +1577,22 @@ static int __html_parse_obj(abc_html_t* html, abc_char_t* c)
break;
case ABC_HTML_STYLE:
- if (abc_css_parse(obj) < 0)
- return -1;
+ err = abc_css_parse(obj);
+ if (err < 0)
+ return err;
- if (abc_css_merge(html, obj) < 0)
- return -1;
+ err = abc_css_merge(html, obj);
+ if (err < 0)
+ return err;
break;
case ABC_HTML_VIDEO:
html->has_video = 1;
case ABC_HTML_AUDIO:
- if (__html_add_controls(obj) < 0)
- return -1;
+ err = __html_add_controls(obj);
+ if (err < 0)
+ return err;
default:
break;
};
diff --git a/html/abc_html.h b/html/abc_html.h
index ff5a675..e41dae9 100644
--- a/html/abc_html.h
+++ b/html/abc_html.h
@@ -4,8 +4,10 @@
#include"abc_io.h"
#include"abc_obj.h"
#include"scf_parse.h"
+#include"scf_rbtree.h"
-typedef struct abc_html_s abc_html_t;
+typedef struct abc_html_s abc_html_t;
+typedef struct abc_timer_s abc_timer_t;
typedef struct {
abc_str_t* names;
@@ -30,10 +32,23 @@ typedef struct {
#define abc_number_of(__array) (sizeof(__array) / sizeof(__array[0]))
+struct abc_timer_s
+{
+ scf_rbtree_node_t node;
+ int64_t usec;
+
+ void (*func)(int argc, void* argv[]);
+
+ int argc;
+ void* argv[0];
+};
+
struct abc_html_s
{
scf_list_t list;
+ scf_rbtree_t timers;
+
abc_obj_t* root;
abc_obj_t* current;
@@ -46,6 +61,8 @@ struct abc_html_s
int pos;
scf_parse_t* js;
+ void (*js_auto_freep)(void** pp, int n_pointers, void (*js_release)(void* jobj));
+ void (*js_release )(void* jobj);
uint8_t has_video:1;
};
@@ -90,4 +107,13 @@ int abc_css_counter_reset(abc_obj_t* obj, abc_attr_t* attr);
int abc_css_counter_inc (abc_obj_t* obj, abc_attr_t* attr);
int abc_css_content (abc_obj_t* obj, abc_attr_t* attr);
+
+static inline int abc_timer_cmp(scf_rbtree_node_t* node0, void* data)
+{
+ abc_timer_t* t0 = (abc_timer_t*)node0;
+ abc_timer_t* t1 = (abc_timer_t*)data;
+
+ return t0->usec - t1->usec;
+}
+
#endif
diff --git a/html/abc_obj.c b/html/abc_obj.c
index 60ca2e1..e93a111 100644
--- a/html/abc_obj.c
+++ b/html/abc_obj.c
@@ -44,8 +44,8 @@ void abc_obj_free(abc_obj_t* obj)
if (obj->js_so)
scf_string_free(obj->js_so);
- if (obj->js_entry)
- scf_string_free(obj->js_entry);
+ if (obj->js_so_handle)
+ dlclose(obj->js_so_handle);
#ifndef ABC_HTML_TEST
if (obj->av_filter)
diff --git a/html/abc_obj.h b/html/abc_obj.h
index a493295..e947a40 100644
--- a/html/abc_obj.h
+++ b/html/abc_obj.h
@@ -9,11 +9,12 @@
typedef struct abc_obj_s abc_obj_t;
typedef struct abc_attr_s abc_attr_t;
typedef struct abc_text_s abc_text_t;
-
typedef struct abc_css_s abc_css_t;
+
typedef struct css_rule_s css_rule_t;
typedef struct css_hash_s css_hash_t;
typedef struct css_count_s css_count_t;
+typedef struct ref_count_s ref_count_t;
enum abc_objs
{
@@ -266,7 +267,16 @@ struct css_count_s
css_count_t* next;
scf_string_t* name;
- intptr_t value;
+ int value;
+
+ scf_vector_t* objs;
+};
+
+struct ref_count_s
+{
+ css_count_t* counter;
+ int value;
+ int layer;
};
#define ABC_HTML_FLAG_OPEN 0
@@ -368,7 +378,8 @@ struct abc_obj_s
abc_text_t* text_splits; // for layout, split a long text to multi-lines and save every-line here
abc_io_t io;
- css_count_t* counter_list;
+ css_count_t* reset_counters;
+ scf_vector_t* used_counters;
scf_string_t* content;
int border_top;
@@ -438,12 +449,12 @@ struct abc_obj_s
scf_string_t* js_path;
scf_string_t* js_obj;
scf_string_t* js_so;
- scf_string_t* js_entry;
+ void* js_so_handle;
uint32_t clicked:1;
uint32_t visited:1;
- uint32_t css_use:1;
+ uint32_t css_used:1;
uint32_t w_set:1;
uint32_t h_set:1;
diff --git a/html/main.c b/html/main.c
index 561c805..35e3788 100644
--- a/html/main.c
+++ b/html/main.c
@@ -10,8 +10,8 @@ void abc_css_recursive_use(abc_html_t* html, abc_obj_t* obj)
if (!obj)
return;
- if (!obj->css_use && ABC_CORE_TEXT != obj->type) {
- obj->css_use = 1;
+ if (!obj->css_used && ABC_CORE_TEXT != obj->type) {
+ obj->css_used = 1;
abc_css_use(html, obj);
}
diff --git a/js/Makefile b/js/Makefile
index b4d00fb..b8c56f8 100644
--- a/js/Makefile
+++ b/js/Makefile
@@ -1,4 +1,8 @@
CFILES += abc_libjs.c
+CFILES += abc_libjs_asm.S
+CFILES += ../js/util/scf_string.c
+CFILES += ../js/util/scf_rbtree.c
+CFILES += ../js/lib/x64/scf_atomic.o
CFLAGS += -g -DABC_HTML_TEST -D_GNU_SOURCE
CFLAGS += -I../ffmpeg
diff --git a/js/abc_libjs.c b/js/abc_libjs.c
index f8a1312..3e28fdc 100644
--- a/js/abc_libjs.c
+++ b/js/abc_libjs.c
@@ -2,6 +2,9 @@
#define PCRE2_CODE_UNIT_WIDTH 8
#include
+void asm_Object_ref(void* obj);
+void asm_timer_func(int argc, void* argv[]);
+
static char* js_days[] = {
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
};
@@ -415,3 +418,81 @@ int abc_pcre2_match(int** __ovector, const char* __subject, const char* __patter
*__ovector = outs;
return n_outs;
}
+
+static abc_obj_t* __html_getElementById(abc_obj_t* root, const char* id)
+{
+ if (!root)
+ return NULL;
+
+ scf_list_t* l;
+ abc_obj_t* child;
+ abc_obj_t* obj;
+ abc_attr_t* attr = abc_obj_get_attr(root, ABC_CSS_ID);
+
+ if (attr && attr->value && attr->value->len > 0 && !strcmp(attr->value->data, id))
+ return root;
+
+ for (l = scf_list_head(&root->childs); l != scf_list_sentinel(&root->childs); l = scf_list_next(l)) {
+ child = scf_list_data(l, abc_obj_t, list);
+
+ obj = __html_getElementById(child, id);
+ if (obj)
+ return obj;
+ }
+
+ return NULL;
+}
+
+abc_obj_t* abc_html_getElementById(abc_html_t* html, const char* id)
+{
+ if (!html || !html->root)
+ return NULL;
+
+ return __html_getElementById(html->root, id);
+}
+
+void abc_html_inner(abc_obj_t* obj, const char* s)
+{
+ printf("obj: %p, s: %s\n", obj, s);
+
+ scf_string_t* text = scf_string_cstr(s);
+ if (text) {
+ if (obj->text)
+ scf_string_free(obj->text);
+
+ obj->text = text;
+ }
+}
+
+void abc_html_setTimeout(abc_html_t* html, int argc, void (*func)(abc_html_t* html), int msec, void** argv)
+{
+ printf("html: %p, func: %p, argc: %d, msec: %d, argv: %p\n", html, func, argc, msec, argv);
+
+ int n = argc;
+ if (n < 5)
+ n = 5;
+
+ n = (n + 1) & ~0x1;
+
+ abc_timer_t* timer = calloc(1, sizeof(abc_timer_t) + sizeof(void*) * (2 + n));
+ if (!timer)
+ return;
+
+ timer->usec = gettime() + msec * 1000ll;
+ timer->func = asm_timer_func;
+ timer->argc = 2 + n;
+ timer->argv[0] = func;
+ timer->argv[1] = html;
+
+ int i;
+ for (i = 0; i < argc; i++) {
+ asm_Object_ref(argv[i]);
+
+ printf("argv[%d]: %p\n", i, argv[i]);
+
+ timer->argv[2 + i] = argv[i];
+ }
+
+// timer->func(timer->argc, timer->argv);
+ scf_rbtree_insert(&html->timers, (scf_rbtree_node_t*)timer, abc_timer_cmp);
+}
diff --git a/js/abc_libjs.so b/js/abc_libjs.so
index b5d7e51efae8bd855a2bd95d04bf4c0060ff4aea..e9b31a886e3576a056b32783adc71d35b296fc91 100755
GIT binary patch
literal 136824
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