aboutsummaryrefslogtreecommitdiff
path: root/core/encoding/xml/debug_print.odin
diff options
context:
space:
mode:
authorjason <jkercher@rlcsystems.com>2022-05-16 13:49:57 -0400
committerjason <jkercher@rlcsystems.com>2022-05-16 13:49:57 -0400
commitfff23e2bbbd1574debce9e0dee894f3cc84a04c4 (patch)
tree4055ea217375d34693861b39fc284e411f7c0366 /core/encoding/xml/debug_print.odin
parent97d1a6787189d7630650612f44c393f7a635019a (diff)
parent33895b6d927c70167f3bfa64c6cc1c15c4e428c5 (diff)
merge from upstream and convert to ^File types
Diffstat (limited to 'core/encoding/xml/debug_print.odin')
-rw-r--r--core/encoding/xml/debug_print.odin86
1 files changed, 86 insertions, 0 deletions
diff --git a/core/encoding/xml/debug_print.odin b/core/encoding/xml/debug_print.odin
new file mode 100644
index 000000000..e9a1cb160
--- /dev/null
+++ b/core/encoding/xml/debug_print.odin
@@ -0,0 +1,86 @@
+/*
+ An XML 1.0 / 1.1 parser
+
+ Copyright 2021-2022 Jeroen van Rijn <nom@duclavier.com>.
+ Made available under Odin's BSD-3 license.
+
+ A from-scratch XML implementation, loosely modeled on the [spec](https://www.w3.org/TR/2006/REC-xml11-20060816).
+
+ List of contributors:
+ Jeroen van Rijn: Initial implementation.
+*/
+package xml
+
+import "core:io"
+import "core:fmt"
+
+/*
+ Just for debug purposes.
+*/
+print :: proc(writer: io.Writer, doc: ^Document) -> (written: int, err: io.Error) {
+ if doc == nil { return }
+ using fmt
+
+ written += wprintf(writer, "[XML Prolog]\n")
+
+ for attr in doc.prologue {
+ written += wprintf(writer, "\t%v: %v\n", attr.key, attr.val)
+ }
+
+ written += wprintf(writer, "[Encoding] %v\n", doc.encoding)
+
+ if len(doc.doctype.ident) > 0 {
+ written += wprintf(writer, "[DOCTYPE] %v\n", doc.doctype.ident)
+
+ if len(doc.doctype.rest) > 0 {
+ wprintf(writer, "\t%v\n", doc.doctype.rest)
+ }
+ }
+
+ for comment in doc.comments {
+ written += wprintf(writer, "[Pre-root comment] %v\n", comment)
+ }
+
+ if len(doc.elements) > 0 {
+ wprintln(writer, " --- ")
+ print_element(writer, doc, 0)
+ wprintln(writer, " --- ")
+ }
+
+ return written, .None
+}
+
+print_element :: proc(writer: io.Writer, doc: ^Document, element_id: Element_ID, indent := 0) -> (written: int, err: io.Error) {
+ using fmt
+
+ tab :: proc(writer: io.Writer, indent: int) {
+ for _ in 0..=indent {
+ wprintf(writer, "\t")
+ }
+ }
+
+ tab(writer, indent)
+
+ element := doc.elements[element_id]
+
+ if element.kind == .Element {
+ wprintf(writer, "<%v>\n", element.ident)
+ if len(element.value) > 0 {
+ tab(writer, indent + 1)
+ wprintf(writer, "[Value] %v\n", element.value)
+ }
+
+ for attr in element.attribs {
+ tab(writer, indent + 1)
+ wprintf(writer, "[Attr] %v: %v\n", attr.key, attr.val)
+ }
+
+ for child in element.children {
+ print_element(writer, doc, child, indent + 1)
+ }
+ } else if element.kind == .Comment {
+ wprintf(writer, "[COMMENT] %v\n", element.value)
+ }
+
+ return written, .None
+} \ No newline at end of file