[ADD/WIP] Begin XMPPwerk

The fuck is a stanza? Presence? Why did Prosody not tell me I'm an idiot
when I clearly made a MALFORMED XML document? This and much more, in the
next commit!
This commit is contained in:
LDA 2024-06-16 11:08:18 +02:00
commit 868f0e4d9c
7 changed files with 207 additions and 11 deletions

View file

@ -1,12 +1,82 @@
#include <XML.h>
#include <Cytoplasm/Log.h>
/* TODO: The rest of all that. */
XMLElement *
XMLDecode(Stream *stream, bool autofree)
{
/* TODO: Use the existing SAX parser to decode everything */
return NULL;
#define push(x) ArrayAdd(stack, x)
#define pop(x) ArrayDelete(stack, ArraySize(stack) - 1)
#define peek(x) ArrayGet(stack, ArraySize(stack) - 1)
XMLexer *lexer;
XMLEvent *event;
XMLElement *ret = NULL;
XMLElement *top;
char *key, *val;
Array *stack;
if (!stream)
{
return NULL;
}
lexer = XMLCreateLexer(stream, autofree);
stack = ArrayCreate();
while ((event = XMLCrank(lexer)) && (!ret || ArraySize(stack)))
{
switch (event->type)
{
case XML_LEXER_STARTELEM:
/* Create a new element that will populated. */
top = XMLCreateTag(event->element);
Log(LOG_INFO, "<%s>", top->name);
XMLAddChild(peek(), top);
while (HashMapIterate(event->attrs, &key, (void **) &val))
{
XMLAddAttr(top, key, val);
}
if (!ret)
{
/* If we didn't have any element before, this one is
* going to be our top of the stack */
ret = top;
}
push(top);
break;
case XML_LEXER_ELEM:
/* Create a new element that will populated. */
top = XMLCreateTag(event->element);
XMLAddChild(peek(), top);
Log(LOG_INFO, "<%s />", top->name);
while (HashMapIterate(event->attrs, &key, (void **) &val))
{
XMLAddAttr(top, key, val);
}
if (!ret)
{
/* If we didn't have any element before, this one is
* going to be our top of the stack */
ret = top;
}
push(top);
/* Fallthrough */
case XML_LEXER_ENDELEM:
/* Pop out an element out of the DOM. */
Log(LOG_INFO, "</>");
pop();
break;
default: break;
}
XMLFreeEvent(event);
event = NULL;
}
XMLFreeEvent(event);
ArrayFree(stack);
XMLFreeLexer(lexer);
return ret;
}
void