diff --git a/build.zig b/build.zig index 5b9bdb74..4e9cf6b9 100644 --- a/build.zig +++ b/build.zig @@ -115,4 +115,10 @@ fn linkNetSurf(step: *std.build.LibExeObjStep) void { step.addObjectFile(.{ .path = ns ++ "/lib/" ++ lib ++ ".a" }); } step.addIncludePath(.{ .path = ns ++ "/include" }); + + // wrapper + const flags = [_][]const u8{}; + const files: [1][]const u8 = .{ns ++ "wrapper/wrapper.c"}; + step.addCSourceFiles(&files, &flags); + step.addIncludePath(.{ .path = ns ++ "wrapper" }); } diff --git a/vendor/netsurf/wrapper/wrapper.c b/vendor/netsurf/wrapper/wrapper.c new file mode 100644 index 00000000..1f7c14bd --- /dev/null +++ b/vendor/netsurf/wrapper/wrapper.c @@ -0,0 +1,77 @@ +#include + +#include +#include + +/** + * Generate a LibDOM document DOM from an HTML file + * + * \param file The file path + * \return pointer to DOM document, or NULL on error + */ +dom_document *wr_create_doc_dom_from_file(char *filename) +{ + size_t buffer_size = 1024; + dom_hubbub_parser *parser = NULL; + FILE *handle; + int chunk_length; + dom_hubbub_error error; + dom_hubbub_parser_params params; + dom_document *doc; + unsigned char buffer[buffer_size]; + + 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) { + printf("Can't create Hubbub Parser\n"); + return NULL; + } + + /* Open input file */ + handle = fopen(filename, "rb"); + if (handle == NULL) { + dom_hubbub_parser_destroy(parser); + printf("Can't open test input file: %s\n", filename); + return NULL; + } + + /* Parse input file in chunks */ + chunk_length = buffer_size; + while (chunk_length == buffer_size) { + chunk_length = fread(buffer, 1, buffer_size, handle); + error = dom_hubbub_parser_parse_chunk(parser, buffer, + chunk_length); + if (error != DOM_HUBBUB_OK) { + dom_hubbub_parser_destroy(parser); + printf("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); + printf("Parsing error when construct DOM\n"); + return NULL; + } + + /* Finished with parser */ + dom_hubbub_parser_destroy(parser); + + /* Close input file */ + if (fclose(handle) != 0) { + printf("Can't close test input file: %s\n", filename); + return NULL; + } + + return doc; +} diff --git a/vendor/netsurf/wrapper/wrapper.h b/vendor/netsurf/wrapper/wrapper.h new file mode 100644 index 00000000..05904ef1 --- /dev/null +++ b/vendor/netsurf/wrapper/wrapper.h @@ -0,0 +1,8 @@ +#ifndef wrapper_dom_h_ +#define wrapper_dom_h_ + +#include + +dom_document *wr_create_doc_dom_from_file(char *filename); + +#endif /* wrapper_dom_h_ */