makiri 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/conformance.yml +22 -0
- data/.github/workflows/libfuzzer.yml +83 -0
- data/.github/workflows/release.yml +12 -7
- data/.github/workflows/security.yml +88 -3
- data/.github/workflows/valgrind.yml +135 -0
- data/CHANGELOG.md +152 -15
- data/README.md +183 -13
- data/Rakefile +294 -7
- data/ext/makiri/bridge/bridge.h +28 -0
- data/ext/makiri/bridge/ruby_string.c +282 -12
- data/ext/makiri/core/mkr_alloc.c +40 -3
- data/ext/makiri/core/mkr_alloc.h +28 -5
- data/ext/makiri/core/mkr_buf.c +47 -3
- data/ext/makiri/core/mkr_buf.h +112 -3
- data/ext/makiri/core/mkr_core.c +143 -0
- data/ext/makiri/core/mkr_core.h +11 -2
- data/ext/makiri/core/mkr_hash.h +1 -1
- data/ext/makiri/core/mkr_span.h +186 -0
- data/ext/makiri/core/mkr_text.h +8 -8
- data/ext/makiri/core/mkr_utf8.c +101 -0
- data/ext/makiri/core/mkr_utf8.h +88 -0
- data/ext/makiri/extconf.rb +123 -10
- data/ext/makiri/fuzz/Makefile +95 -0
- data/ext/makiri/fuzz/check_fuzzer.cc +4 -0
- data/ext/makiri/fuzz/xml_fuzz.c +24 -0
- data/ext/makiri/fuzz/xpath_fuzz.c +109 -0
- data/ext/makiri/glue/glue.h +55 -11
- data/ext/makiri/glue/ruby_doc.c +129 -59
- data/ext/makiri/glue/ruby_html_css.c +292 -0
- data/ext/makiri/glue/{ruby_mutate.c → ruby_html_mutate.c} +248 -52
- data/ext/makiri/glue/ruby_html_node.c +859 -0
- data/ext/makiri/glue/ruby_html_serialize.c +154 -0
- data/ext/makiri/glue/ruby_node.c +74 -729
- data/ext/makiri/glue/ruby_node_set.c +167 -32
- data/ext/makiri/glue/ruby_xml.c +602 -0
- data/ext/makiri/glue/ruby_xml_node.c +1373 -0
- data/ext/makiri/glue/ruby_xpath.c +63 -30
- data/ext/makiri/glue/ruby_xpath.h +19 -0
- data/ext/makiri/lexbor_compat/compat.h +42 -9
- data/ext/makiri/lexbor_compat/compat_internal.h +1 -1
- data/ext/makiri/lexbor_compat/dom_index.c +2 -2
- data/ext/makiri/lexbor_compat/post_parse.c +100 -10
- data/ext/makiri/lexbor_compat/source_loc.c +15 -13
- data/ext/makiri/lexbor_compat/text_index.c +14 -8
- data/ext/makiri/lexbor_compat/utf8_input.c +19 -33
- data/ext/makiri/makiri.c +184 -6
- data/ext/makiri/makiri.h +43 -2
- data/ext/makiri/xml/mkr_xml.h +125 -0
- data/ext/makiri/xml/mkr_xml_chars.c +195 -0
- data/ext/makiri/xml/mkr_xml_index.c +169 -0
- data/ext/makiri/xml/mkr_xml_index.h +48 -0
- data/ext/makiri/xml/mkr_xml_mutate.c +817 -0
- data/ext/makiri/xml/mkr_xml_mutate.h +139 -0
- data/ext/makiri/xml/mkr_xml_node.c +399 -0
- data/ext/makiri/xml/mkr_xml_node.h +184 -0
- data/ext/makiri/xml/mkr_xml_tree.c +1515 -0
- data/ext/makiri/xpath/mkr_css.c +1023 -0
- data/ext/makiri/xpath/mkr_css.h +65 -0
- data/ext/makiri/xpath/mkr_xpath.c +96 -32
- data/ext/makiri/xpath/mkr_xpath.h +109 -4
- data/ext/makiri/xpath/mkr_xpath_engine_html.c +17 -0
- data/ext/makiri/xpath/mkr_xpath_engine_xml.c +12 -0
- data/ext/makiri/xpath/{mkr_xpath_eval.c → mkr_xpath_eval_body.h} +551 -241
- data/ext/makiri/xpath/{mkr_xpath_funcs.c → mkr_xpath_funcs_body.h} +318 -276
- data/ext/makiri/xpath/mkr_xpath_internal.h +177 -206
- data/ext/makiri/xpath/mkr_xpath_lex.c +95 -125
- data/ext/makiri/xpath/mkr_xpath_node_access_html.h +138 -0
- data/ext/makiri/xpath/mkr_xpath_node_access_xml.h +145 -0
- data/ext/makiri/xpath/mkr_xpath_number.c +109 -0
- data/ext/makiri/xpath/mkr_xpath_parse.c +83 -94
- data/ext/makiri/xpath/mkr_xpath_prelude_html.h +30 -0
- data/ext/makiri/xpath/mkr_xpath_prelude_xml.h +28 -0
- data/ext/makiri/xpath/mkr_xpath_shared.c +609 -0
- data/ext/makiri/xpath/mkr_xpath_value_body.h +801 -0
- data/ext/makiri/xpath/mkr_xpath_xml_selftest.c +76 -0
- data/lib/makiri/{attribute.rb → attr.rb} +7 -3
- data/lib/makiri/cdata_section.rb +19 -0
- data/lib/makiri/comment.rb +10 -0
- data/lib/makiri/compat_aliases.rb +30 -0
- data/lib/makiri/document.rb +9 -73
- data/lib/makiri/document_fragment.rb +14 -9
- data/lib/makiri/element.rb +4 -4
- data/lib/makiri/html/document.rb +106 -0
- data/lib/makiri/html/node_methods.rb +19 -0
- data/lib/makiri/html.rb +12 -0
- data/lib/makiri/node.rb +58 -15
- data/lib/makiri/node_set.rb +8 -0
- data/lib/makiri/processing_instruction.rb +10 -0
- data/lib/makiri/text.rb +1 -1
- data/lib/makiri/version.rb +1 -1
- data/lib/makiri/xml/builder.rb +263 -0
- data/lib/makiri/xml/document.rb +24 -0
- data/lib/makiri/xml/node_methods.rb +84 -0
- data/lib/makiri/xml.rb +10 -0
- data/lib/makiri/xpath_context.rb +1 -1
- data/lib/makiri.rb +24 -5
- data/script/build_native_gem.rb +2 -2
- data/script/check_alloc_failures.rb +266 -0
- data/script/check_c_safety.rb +77 -2
- data/script/check_c_safety_allowlist.yml +102 -0
- data/script/check_leaks.rb +64 -0
- data/script/leaks_harness.rb +64 -0
- data/vendor/lexbor/CMakeLists.txt +6 -0
- data/vendor/lexbor/README.md +12 -0
- data/vendor/lexbor/config.cmake +1 -1
- data/vendor/lexbor/source/lexbor/core/base.h +1 -1
- data/vendor/lexbor/source/lexbor/core/config.cmake +9 -1
- data/vendor/lexbor/source/lexbor/css/selectors/pseudo_state.c +2 -3
- data/vendor/lexbor/source/lexbor/css/selectors/state.c +3 -0
- data/vendor/lexbor/source/lexbor/dom/interfaces/element.c +21 -0
- data/vendor/lexbor/source/lexbor/dom/interfaces/element.h +5 -0
- data/vendor/lexbor/source/lexbor/encoding/decode.c +33 -4
- data/vendor/lexbor/source/lexbor/html/base.h +1 -1
- data/vendor/lexbor/source/lexbor/html/interfaces/select_element.c +4 -0
- data/vendor/lexbor/source/lexbor/html/serialize.c +545 -41
- data/vendor/lexbor/source/lexbor/html/serialize.h +2 -1
- data/vendor/lexbor/source/lexbor/html/tokenizer.h +2 -2
- data/vendor/lexbor/source/lexbor/html/tree/insertion_mode/in_body.c +1 -1
- data/vendor/lexbor/source/lexbor/html/tree.c +6 -6
- data/vendor/lexbor/source/lexbor/selectors/selectors.c +12 -3
- data/vendor/lexbor/source/lexbor/url/base.h +1 -1
- data/vendor/lexbor/source/lexbor/url/url.c +5 -2
- data/vendor/lexbor/source/lexbor/url/url.h +9 -0
- data/vendor/lexbor/version +1 -1
- metadata +53 -9
- data/ext/makiri/glue/ruby_css.c +0 -185
- data/ext/makiri/glue/ruby_serialize.c +0 -92
- data/ext/makiri/xpath/mkr_xpath_value.c +0 -1286
- data/lib/makiri/cdata.rb +0 -6
|
@@ -27,7 +27,7 @@ extern "C" {
|
|
|
27
27
|
#include "lexbor/core/lexbor.h"
|
|
28
28
|
|
|
29
29
|
#define LEXBOR_VERSION_MAJOR 3
|
|
30
|
-
#define LEXBOR_VERSION_MINOR
|
|
30
|
+
#define LEXBOR_VERSION_MINOR 1
|
|
31
31
|
#define LEXBOR_VERSION_PATCH 0
|
|
32
32
|
|
|
33
33
|
#define LEXBOR_VERSION_STRING LEXBOR_STRINGIZE(LEXBOR_VERSION_MAJOR) "." \
|
|
@@ -3,10 +3,18 @@ set(DESCRIPTION "The main module of the Lexbor project.
|
|
|
3
3
|
The module includes various algorithms and methods for working with memory:
|
|
4
4
|
AVL Tree, Array, String, Memory Pool and so on.")
|
|
5
5
|
|
|
6
|
-
IF(
|
|
6
|
+
IF(TARGET ${CURRENT_LIB_NAME})
|
|
7
7
|
FEATURE_TRY_FUNCTION_EXISTS("${CURRENT_LIB_NAME}" "ceil" "m")
|
|
8
8
|
ENDIF()
|
|
9
9
|
|
|
10
|
+
IF(TARGET ${CURRENT_LIB_NAME_STATIC})
|
|
11
|
+
FEATURE_TRY_FUNCTION_EXISTS("${CURRENT_LIB_NAME_STATIC}" "ceil" "m")
|
|
12
|
+
ENDIF()
|
|
13
|
+
|
|
10
14
|
IF(TARGET ${LEXBOR_LIB_NAME})
|
|
11
15
|
FEATURE_TRY_FUNCTION_EXISTS("${LEXBOR_LIB_NAME}" "ceil" "m")
|
|
16
|
+
ENDIF()
|
|
17
|
+
|
|
18
|
+
IF(TARGET ${LEXBOR_LIB_NAME_STATIC})
|
|
19
|
+
FEATURE_TRY_FUNCTION_EXISTS("${LEXBOR_LIB_NAME_STATIC}" "ceil" "m")
|
|
12
20
|
ENDIF()
|
|
@@ -227,13 +227,12 @@ again:
|
|
|
227
227
|
contains->insensitive = false;
|
|
228
228
|
str = &contains->str;
|
|
229
229
|
|
|
230
|
-
str->data = lexbor_mraw_alloc(parser->memory->mraw,
|
|
231
|
-
sizeof(lexbor_str_t));
|
|
230
|
+
str->data = lexbor_mraw_alloc(parser->memory->mraw, length + 1);
|
|
232
231
|
if (str->data == NULL) {
|
|
233
232
|
return lxb_css_parser_memory_fail(parser);
|
|
234
233
|
}
|
|
235
234
|
|
|
236
|
-
memcpy(str->data, data, length
|
|
235
|
+
memcpy(str->data, data, length);
|
|
237
236
|
|
|
238
237
|
str->length = length;
|
|
239
238
|
str->data[length] = '\0';
|
|
@@ -1138,6 +1138,9 @@ lxb_css_selectors_state_element_ns(lxb_css_parser_t *parser,
|
|
|
1138
1138
|
return lxb_css_selectors_state_ns(parser, selector);
|
|
1139
1139
|
}
|
|
1140
1140
|
|
|
1141
|
+
selector->name.data[0] = '\0';
|
|
1142
|
+
selector->name.length = 0;
|
|
1143
|
+
|
|
1141
1144
|
lxb_css_syntax_parser_consume(parser);
|
|
1142
1145
|
|
|
1143
1146
|
return lxb_css_selectors_state_ns_ident(parser, selector);
|
|
@@ -474,6 +474,27 @@ lxb_dom_element_attr_by_local_name_data(lxb_dom_element_t *element,
|
|
|
474
474
|
return NULL;
|
|
475
475
|
}
|
|
476
476
|
|
|
477
|
+
lxb_dom_attr_t *
|
|
478
|
+
lxb_dom_element_attr_by_local_name_ns_data(lxb_dom_element_t *element,
|
|
479
|
+
const lxb_dom_attr_data_t *data,
|
|
480
|
+
lxb_ns_id_t ns)
|
|
481
|
+
{
|
|
482
|
+
lxb_dom_attr_t *attr = element->first_attr;
|
|
483
|
+
|
|
484
|
+
while (attr != NULL) {
|
|
485
|
+
if ((attr->node.local_name == data->attr_id
|
|
486
|
+
&& attr->node.ns == ns)
|
|
487
|
+
|| attr->qualified_name == data->attr_id)
|
|
488
|
+
{
|
|
489
|
+
return attr;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
attr = attr->next;
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
return NULL;
|
|
496
|
+
}
|
|
497
|
+
|
|
477
498
|
lxb_dom_attr_t *
|
|
478
499
|
lxb_dom_element_attr_by_id(lxb_dom_element_t *element,
|
|
479
500
|
lxb_dom_attr_id_t attr_id)
|
|
@@ -140,6 +140,11 @@ LXB_API lxb_dom_attr_t *
|
|
|
140
140
|
lxb_dom_element_attr_by_local_name_data(lxb_dom_element_t *element,
|
|
141
141
|
const lxb_dom_attr_data_t *data);
|
|
142
142
|
|
|
143
|
+
LXB_API lxb_dom_attr_t *
|
|
144
|
+
lxb_dom_element_attr_by_local_name_ns_data(lxb_dom_element_t *element,
|
|
145
|
+
const lxb_dom_attr_data_t *data,
|
|
146
|
+
lxb_ns_id_t ns);
|
|
147
|
+
|
|
143
148
|
LXB_API lxb_dom_attr_t *
|
|
144
149
|
lxb_dom_element_attr_by_id(lxb_dom_element_t *element,
|
|
145
150
|
lxb_dom_attr_id_t attr_id);
|
|
@@ -912,6 +912,13 @@ lxb_encoding_decode_iso_2022_jp(lxb_encoding_decode_t *ctx,
|
|
|
912
912
|
}
|
|
913
913
|
LXB_ENCODING_DECODE_ERROR_END();
|
|
914
914
|
|
|
915
|
+
if (ctx->buffer_used >= ctx->buffer_length) {
|
|
916
|
+
iso->prepand = iso->lead;
|
|
917
|
+
iso->lead = 0x00;
|
|
918
|
+
|
|
919
|
+
return LXB_STATUS_SMALL_BUFFER;
|
|
920
|
+
}
|
|
921
|
+
|
|
915
922
|
byte = iso->lead;
|
|
916
923
|
iso->lead = 0x00;
|
|
917
924
|
|
|
@@ -1279,6 +1286,12 @@ lxb_encoding_decode_utf_16(lxb_encoding_decode_t *ctx, bool is_be,
|
|
|
1279
1286
|
}
|
|
1280
1287
|
LXB_ENCODING_DECODE_ERROR_END();
|
|
1281
1288
|
|
|
1289
|
+
if (ctx->buffer_used >= ctx->buffer_length) {
|
|
1290
|
+
ctx->u.lead = lead + 0x01;
|
|
1291
|
+
|
|
1292
|
+
return LXB_STATUS_SMALL_BUFFER;
|
|
1293
|
+
}
|
|
1294
|
+
|
|
1282
1295
|
goto lead_state;
|
|
1283
1296
|
}
|
|
1284
1297
|
|
|
@@ -1723,6 +1736,13 @@ lxb_encoding_decode_gb18030(lxb_encoding_decode_t *ctx,
|
|
|
1723
1736
|
}
|
|
1724
1737
|
LXB_ENCODING_DECODE_ERROR_END();
|
|
1725
1738
|
|
|
1739
|
+
if (ctx->buffer_used >= ctx->buffer_length) {
|
|
1740
|
+
ctx->prepend = true;
|
|
1741
|
+
ctx->u.gb18030.first = second;
|
|
1742
|
+
|
|
1743
|
+
return LXB_STATUS_SMALL_BUFFER;
|
|
1744
|
+
}
|
|
1745
|
+
|
|
1726
1746
|
first = second;
|
|
1727
1747
|
|
|
1728
1748
|
goto prepend_first;
|
|
@@ -1756,11 +1776,8 @@ lxb_encoding_decode_gb18030(lxb_encoding_decode_t *ctx,
|
|
|
1756
1776
|
}
|
|
1757
1777
|
LXB_ENCODING_DECODE_ERROR_END();
|
|
1758
1778
|
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
if (ctx->buffer_used == ctx->buffer_length) {
|
|
1779
|
+
if (ctx->buffer_used >= ctx->buffer_length) {
|
|
1762
1780
|
ctx->prepend = true;
|
|
1763
|
-
ctx->have_error = true;
|
|
1764
1781
|
|
|
1765
1782
|
/* First is a fake for trigger */
|
|
1766
1783
|
ctx->u.gb18030.first = 0x01;
|
|
@@ -1770,6 +1787,18 @@ lxb_encoding_decode_gb18030(lxb_encoding_decode_t *ctx,
|
|
|
1770
1787
|
return LXB_STATUS_SMALL_BUFFER;
|
|
1771
1788
|
}
|
|
1772
1789
|
|
|
1790
|
+
LXB_ENCODING_DECODE_APPEND_WO_CHECK(ctx, second);
|
|
1791
|
+
|
|
1792
|
+
if (ctx->buffer_used >= ctx->buffer_length) {
|
|
1793
|
+
ctx->prepend = true;
|
|
1794
|
+
|
|
1795
|
+
ctx->u.gb18030.first = third;
|
|
1796
|
+
ctx->u.gb18030.second = 0x00;
|
|
1797
|
+
ctx->u.gb18030.third = 0x00;
|
|
1798
|
+
|
|
1799
|
+
return LXB_STATUS_SMALL_BUFFER;
|
|
1800
|
+
}
|
|
1801
|
+
|
|
1773
1802
|
first = third;
|
|
1774
1803
|
|
|
1775
1804
|
goto prepend_first;
|
|
@@ -72,6 +72,10 @@ lxb_html_select_selectedness_display_size(lxb_html_select_element_t *el)
|
|
|
72
72
|
|
|
73
73
|
value = size->value;
|
|
74
74
|
|
|
75
|
+
if (value == NULL) {
|
|
76
|
+
goto default_size;
|
|
77
|
+
}
|
|
78
|
+
|
|
75
79
|
status = lxb_html_common_parsing_nonneg_integer(value->data, value->length,
|
|
76
80
|
&len);
|
|
77
81
|
if (status != LXB_STATUS_OK || len < 0) {
|