From e2761c74fcf9b12ec23ca8938fa956f8add214de Mon Sep 17 00:00:00 2001 From: Witold Filipczyk Date: Sun, 12 Mar 2023 17:29:59 +0100 Subject: [PATCH] [build] Link against libdom Segfault is expected. --- Makefile.config.in | 5 +++ configure.ac | 22 +++++++++- meson.build | 8 ++++ src/ecmascript/Makefile | 2 + src/ecmascript/ecmascript.cpp | 2 + src/ecmascript/libdom/Makefile | 7 +++ src/ecmascript/libdom/meson.build | 2 + src/ecmascript/libdom/parse.c | 73 +++++++++++++++++++++++++++++++ src/ecmascript/meson.build | 4 ++ 9 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 src/ecmascript/libdom/Makefile create mode 100644 src/ecmascript/libdom/meson.build create mode 100644 src/ecmascript/libdom/parse.c diff --git a/Makefile.config.in b/Makefile.config.in index 36a4d97d..0c62e021 100644 --- a/Makefile.config.in +++ b/Makefile.config.in @@ -70,7 +70,11 @@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ DBLATEX = @DBLATEX@ +LIBCSS_CFLAGS = @LIBCSS_CFLAGS@ +LIBCSS_LIBS = @LIBCSS_LIBS@ LIBDIR = @LIBDIR@ +LIBDOM_CFLAGS = @LIBDOM_CFLAGS@ +LIBDOM_LIBS = @LIBDOM_LIBS@ LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@ LOCALEDIR = @LOCALEDIR@ LUA_CFLAGS = @LUA_CFLAGS@ @@ -145,6 +149,7 @@ CONFIG_IPV6 = @CONFIG_IPV6@ CONFIG_DBLATEX = @CONFIG_DBLATEX@ CONFIG_LEDS = @CONFIG_LEDS@ CONFIG_LIBCSS = @CONFIG_LIBCSS@ +CONFIG_LIBDOM = @CONFIG_LIBDOM@ CONFIG_LZMA = @CONFIG_LZMA@ CONFIG_MAILCAP = @CONFIG_MAILCAP@ CONFIG_MANUAL = @CONFIG_MANUAL@ diff --git a/configure.ac b/configure.ac index b59d0751..e46ecfcc 100644 --- a/configure.ac +++ b/configure.ac @@ -879,13 +879,33 @@ CONFIG_LIBCSS= if test "x$CONFIG_XML" = xyes; then LIBCSS_CFLAGS="$($PKG_CONFIG $pkg_config_static --cflags libcss)" LIBCSS_LIBS="$($PKG_CONFIG $pkg_config_static --libs libcss)" - LIBS="$LIBS $LIBCSS_LIBS" + LIBS="$LIBCSS_LIBS $LIBS" CFLAGS="$CFLAGS $LIBCSS_CFLAGS" CONFIG_LIBCSS=yes EL_CONFIG(CONFIG_LIBCSS, [libcss]) + AC_SUBST(LIBCSS_CFLAGS) + AC_SUBST(LIBCSS_LIBS) AC_SUBST(CONFIG_LIBCSS) fi +# =================================================================== +# Check for libdom +# =================================================================== + +CONFIG_LIBDOM= + +if test "x$CONFIG_XML" = xyes; then + LIBDOM_CFLAGS="$($PKG_CONFIG $pkg_config_static --cflags libdom)" + LIBDOM_LIBS="$($PKG_CONFIG $pkg_config_static --libs libdom)" + LIBS="$LIBDOM_LIBS $LIBS" + CFLAGS="$CFLAGS $LIBDOM_CFLAGS" + CONFIG_LIBDOM=yes + EL_CONFIG(CONFIG_LIBDOM, [libdom]) + AC_SUBST(LIBDOM_CFLAGS) + AC_SUBST(LIBDOM_LIBS) + AC_SUBST(CONFIG_LIBDOM) +fi + # =================================================================== # Check for Guile, optional even if installed. # =================================================================== diff --git a/meson.build b/meson.build index 44f229dc..77d0cdea 100644 --- a/meson.build +++ b/meson.build @@ -414,6 +414,14 @@ if conf_data.get('CONFIG_ECMASCRIPT_SMJS') or conf_data.get('CONFIG_QUICKJS') or conf_data.set('CONFIG_LIBCSS', true) endif +conf_data.set('CONFIG_LIBDOM', false) + +if conf_data.get('CONFIG_ECMASCRIPT_SMJS') or conf_data.get('CONFIG_QUICKJS') or conf_data.get('CONFIG_MUJS') + cssdeps = dependency('libdom', static: st, version: '>=0.4.1') + deps += cssdeps + conf_data.set('CONFIG_LIBDOM', true) +endif + if conf_data.get('CONFIG_SCRIPTING_LUA') luadeps = dependency(luapkg, static: st) deps += luadeps diff --git a/src/ecmascript/Makefile b/src/ecmascript/Makefile index b00a0ed3..5542219a 100644 --- a/src/ecmascript/Makefile +++ b/src/ecmascript/Makefile @@ -4,6 +4,8 @@ INCLUDES += $(SPIDERMONKEY_CFLAGS) $(MUJS_CFLAGS) SUBDIRS-$(CONFIG_ECMASCRIPT_SMJS) += spidermonkey +SUBDIRS-$(CONFIG_LIBDOM) += libdom + SUBDIRS-$(CONFIG_MUJS) += mujs SUBDIRS-$(CONFIG_QUICKJS) += quickjs diff --git a/src/ecmascript/ecmascript.cpp b/src/ecmascript/ecmascript.cpp index 2ca42087..e56d00b3 100644 --- a/src/ecmascript/ecmascript.cpp +++ b/src/ecmascript/ecmascript.cpp @@ -841,6 +841,7 @@ free_document(void *doc) delete docu; } +#ifndef CONFIG_LIBDOM void * document_parse(struct document *document) { @@ -871,6 +872,7 @@ document_parse(struct document *document) return (void *)docu; } +#endif static void delayed_goto(void *data) diff --git a/src/ecmascript/libdom/Makefile b/src/ecmascript/libdom/Makefile new file mode 100644 index 00000000..5918ea73 --- /dev/null +++ b/src/ecmascript/libdom/Makefile @@ -0,0 +1,7 @@ +top_builddir=../../.. +include $(top_builddir)/Makefile.config +INCLUDES += $(LIBDOM_CFLAGS) + +OBJS = parse.o + +include $(top_srcdir)/Makefile.lib diff --git a/src/ecmascript/libdom/meson.build b/src/ecmascript/libdom/meson.build new file mode 100644 index 00000000..0c505c48 --- /dev/null +++ b/src/ecmascript/libdom/meson.build @@ -0,0 +1,2 @@ +srcs += files('parse.c') + diff --git a/src/ecmascript/libdom/parse.c b/src/ecmascript/libdom/parse.c new file mode 100644 index 00000000..49ac7bd2 --- /dev/null +++ b/src/ecmascript/libdom/parse.c @@ -0,0 +1,73 @@ +/* Parse document. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#ifdef CONFIG_LIBDOM +#include +#include +#endif + +#include "elinks.h" + +#include "cache/cache.h" +#include "document/document.h" + +void * +document_parse(struct document *document) +{ +#ifdef ECMASCRIPT_DEBUG + fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__); +#endif + struct cache_entry *cached = document->cached; + struct fragment *f = get_cache_fragment(cached); + const char *encoding; + dom_hubbub_parser *parser = NULL; + dom_hubbub_error error; + dom_hubbub_parser_params params; + dom_document *doc; + + if (!f || !f->length) { + return NULL; + } + + params.enc = NULL; + params.fix_enc = true; + params.enable_script = false; + params.msg = NULL; + params.script = NULL; + params.ctx = NULL; + params.daf = NULL; + + /* Create Hubbub parser */ + error = dom_hubbub_parser_create(¶ms, &parser, &doc); + if (error != DOM_HUBBUB_OK) { + fprintf(stderr, "Can't create Hubbub Parser\n"); + return NULL; + } + + /* Parse */ + error = dom_hubbub_parser_parse_chunk(parser, f->data, f->length); + if (error != DOM_HUBBUB_OK) { + dom_hubbub_parser_destroy(parser); + fprintf(stderr, "Parsing errors occur\n"); + return NULL; + } + + /* Done parsing file */ + error = dom_hubbub_parser_completed(parser); + if (error != DOM_HUBBUB_OK) { + dom_hubbub_parser_destroy(parser); + fprintf(stderr, "Parsing error when construct DOM\n"); + return NULL; + } + + /* Finished with parser */ + dom_hubbub_parser_destroy(parser); + + return doc; +} diff --git a/src/ecmascript/meson.build b/src/ecmascript/meson.build index 99b2a3b2..09c2d653 100644 --- a/src/ecmascript/meson.build +++ b/src/ecmascript/meson.build @@ -25,3 +25,7 @@ if conf_data.get('CONFIG_QUICKJS') subdir('quickjs') srcs += files('css2xpath.cpp', 'ecmascript.cpp', 'localstorage-db.cpp', 'quickjs.cpp') endif + +if conf_data.get('CONFIG_LIBDOM') + subdir('libdom') +endif