summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
Diffstat (limited to 'examples')
-rw-r--r--examples/c89.c33
-rw-r--r--examples/nolibc.c71
-rw-r--r--examples/simple.c27
3 files changed, 131 insertions, 0 deletions
diff --git a/examples/c89.c b/examples/c89.c
new file mode 100644
index 0000000..4b0eaf6
--- /dev/null
+++ b/examples/c89.c
@@ -0,0 +1,33 @@
+#include <assert.h>
+#include <stdio.h>
+#define ASSERT assert
+#define IMXML_SIMD_DEFAULT SSE2
+#define IMXML_IMPLEMENTATION
+#include "imxml.h"
+
+int main (void) {
+ ImxmlString s, from, to, msg;
+ XmlContent content;
+ ImxmlCharSequence const xml = "<msg from=\"John\" to=\"Jane\">Hello, World!</msg>"IMXML_LIT_PAD;
+ XmlParser p = {0};
+ p.head = xml;
+
+ imxml_strlit89(s, "msg");
+ assert(xml_tag_expect_str(&p, s));
+ imxml_strlit89(s, "from");
+ assert(xml_attr_expect_str(&p, s));
+ from = xml_value(&p);
+ imxml_strlit89(s, "to");
+ assert(xml_attr_expect_str(&p, s));
+ to = xml_value(&p);
+
+ content = xml_content(&p);
+ assert(content.type == XML_CONTENT_TEXT);
+ msg = content.data;
+ assert(xml_content(&p).type == XML_CONTENT_TAG);
+
+ printf("%.*s->%.*s: '%.*s'\n", (int)from.count, from.items, (int)to.count, to.items, (int)msg.count, msg.items);
+
+ return 0;
+}
+
diff --git a/examples/nolibc.c b/examples/nolibc.c
new file mode 100644
index 0000000..1a68383
--- /dev/null
+++ b/examples/nolibc.c
@@ -0,0 +1,71 @@
+#define assert(X) do { if (!(X)) __asm__("int3"); } while (0)
+
+#define IMXML_SIMD_DEFAULT SCALAR
+#define IMXML_NO_SUPPORT_SINGLE_QUOTES
+#define IMXML_NO_SUPPORT_COMMENTS
+#define IMXML_NO_SUPPORT_CDATA
+#define IMXML_NO_SUPPORT_ENTITIES
+#define IMXML_NO_SUPPORT_NAMESPACES
+#define THREADLOCAL
+#define IMXML_NO_CHECK_BOUNDS
+
+#define IMXML_IMPLEMENTATION
+#include "imxml.h"
+
+// some compilers require memset to be present
+void* memset (void* s, int c, size_t n) {
+ for (size_t i = 0; i < n; ++i) {
+ ((char*)s)[i] = c;
+ }
+ return s;
+}
+
+static void write (ImxmlString s) {
+ long ret;
+ __asm__ volatile(
+ "syscall"
+ : "=a"(ret)
+ : "a"(1), "D"(1), "S"(s.items), "d"(s.count)
+ : "rcx", "r11", "memory"
+ );
+}
+
+void start (void) {
+ static ImxmlCharSequence xml = "<msg from=\"John\" to=\"Jane\">Hello, World!</msg>"IMXML_LIT_PAD;
+
+ XmlParser p = {
+ .head = xml,
+ };
+
+ assert(xml_tag_expect(&p, "msg"));
+ assert(xml_attr_expect(&p, "from"));
+ ImxmlString const from = xml_value(&p);
+ assert(xml_attr_expect(&p, "to"));
+ ImxmlString const to = xml_value(&p);
+
+ XmlContent content = xml_content(&p);
+ assert(content.type == XML_CONTENT_TEXT);
+ ImxmlString const msg = content.data;
+
+ write(from);
+ write(imxml_strlit("->"));
+ write(to);
+ write(imxml_strlit(": "));
+ write(msg);
+ write(imxml_strlit("\n"));
+
+ __asm__ volatile(
+ "syscall\n"
+ :
+ : "a"(60), "D"(0)
+ : "rcx", "r11", "memory"
+ );
+}
+
+void _start (void) {
+ __asm__ volatile (
+ "andq $-16, %rsp\n" // required because the compiler emits aligned stack loads later
+ "call start\n"
+ );
+}
+
diff --git a/examples/simple.c b/examples/simple.c
new file mode 100644
index 0000000..caacc83
--- /dev/null
+++ b/examples/simple.c
@@ -0,0 +1,27 @@
+#include <assert.h>
+#include <stdio.h>
+#define ASSERT assert
+#define IMXML_SIMD_DEFAULT SSE2
+#define IMXML_IMPLEMENTATION
+#include "imxml.h"
+
+int main (void) {
+ ImxmlCharSequence const xml = "<msg from=\"John\" to=\"Jane\">Hello, World!</msg>"IMXML_LIT_PAD;
+ XmlParser p = {
+ .head = xml,
+ };
+
+ assert(xml_tag_expect(&p, "msg"));
+ assert(xml_attr_expect(&p, "from"));
+ ImxmlString const from = xml_value(&p);
+ assert(xml_attr_expect(&p, "to"));
+ ImxmlString const to = xml_value(&p);
+
+ XmlContent content = xml_content(&p);
+ assert(content.type == XML_CONTENT_TEXT);
+ ImxmlString msg = content.data;
+ assert(xml_content(&p).type == XML_CONTENT_TAG);
+
+ printf("%.*s->%.*s: '%.*s'\n", (int)from.count, from.items, (int)to.count, to.items, (int)msg.count, msg.items);
+}
+