From ee081ca70322cd01d0642fdb1860e6bfbfb48e85 Mon Sep 17 00:00:00 2001 From: steven-vd Date: Sun, 16 Aug 2026 15:00:32 +0200 Subject: Initial commit --- examples/c89.c | 33 ++++++++++++++++++++++++++ examples/nolibc.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ examples/simple.c | 27 +++++++++++++++++++++ 3 files changed, 131 insertions(+) create mode 100644 examples/c89.c create mode 100644 examples/nolibc.c create mode 100644 examples/simple.c (limited to 'examples') 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 +#include +#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 = "Hello, World!"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 = "Hello, World!"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 +#include +#define ASSERT assert +#define IMXML_SIMD_DEFAULT SSE2 +#define IMXML_IMPLEMENTATION +#include "imxml.h" + +int main (void) { + ImxmlCharSequence const xml = "Hello, World!"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); +} + -- cgit v1.2.3