Add AWK hxpipe parser lib
authorSiraaj Khandkar <siraaj@khandkar.net>
Mon, 16 Mar 2020 13:34:06 +0000 (09:34 -0400)
committerSiraaj Khandkar <siraaj@khandkar.net>
Mon, 16 Mar 2020 13:34:06 +0000 (09:34 -0400)
home/lib/parse_hxpipe.awk [new file with mode: 0644]

diff --git a/home/lib/parse_hxpipe.awk b/home/lib/parse_hxpipe.awk
new file mode 100644 (file)
index 0000000..ab07779
--- /dev/null
@@ -0,0 +1,62 @@
+# API:
+#   XmlPath    : string
+#   XmlAttr    : dict : [XmlPath, string] -> string
+#   XmlPayload : string
+
+/^[\(\)]/ {
+    update_node()
+    next
+}
+
+/^A/ && $2 == "CDATA" {
+    update_node_attributes()
+    next
+}
+
+/^-/ {
+    XmlPayload = substr($0, 2, length($0))
+}
+
+function path_to_string(path, depth,    p, i) {
+    p = ""
+    for (i = 1; i <= depth; i++) {
+        p = p "/" path[i]
+    }
+    return p
+}
+
+function update_node(    paren, name, key, val, path, attr) {
+    paren = substr($1, 1, 1)
+    name = substr($1, 2, length($1) - 1)
+    if (paren == "(") {
+        _depth++
+        _path[_depth] = name
+        XmlPath = path_to_string(_path, _depth)
+        for (key in _hxpipe_curr_attrs) {
+            val = _hxpipe_curr_attrs[key]
+            XmlAttr[XmlPath, key] = val
+        }
+    } else if (paren == ")") {
+        delete _hxpipe_curr_attrs
+        XmlPayload = ""
+        for (key in XmlAttr) {
+            split(key, k, SUBSEP)
+            path = k[1]
+            attr = k[2]
+            if (path == XmlPath) delete XmlAttr[key]
+        }
+        _depth--
+        XmlPath = path_to_string(_path, _depth)
+    } else {
+        printf("ERROR in input line %d - not a parenthesis: \"%s\"\n", NR, paren) > "/dev/stderr"
+        exit 1
+    }
+}
+
+function update_node_attributes(    key, val, s) {
+    key = substr($1, 2, length($1))
+    val = $0
+    s = " +"
+    sub("^" $1 s $2 s, "", val)
+    _hxpipe_curr_attrs[key] = val
+}
This page took 0.022269 seconds and 4 git commands to generate.