[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

@ -4,7 +4,6 @@
#include <Cytoplasm/Memory.h>
#include <Cytoplasm/Array.h>
#include <Cytoplasm/Str.h>
#include <Cytoplasm/Log.h>
#include <string.h>
#include <ctype.h>
@ -24,7 +23,8 @@ struct XMLexer {
XML_STATE_ATTR,
XML_STATE_ATTRHEAD_PROP,
XML_STATE_ATTRTAIL
XML_STATE_ATTRTAIL,
XML_STATE_PI
} state;
struct {
@ -161,6 +161,17 @@ XMLCrank(XMLexer *lexer)
lexer->state = XML_STATE_ATTRTAIL;
break;
}
else if (XMLookahead(lexer, "<?", true))
{
if (lexer->data.str)
{
XMLFreeEvent(event);
event = XMLCreateData(lexer);
}
lexer->state = XML_STATE_PI;
break;
}
else if (XMLookahead(lexer, "<", true))
{
if (lexer->data.str)
@ -189,6 +200,14 @@ XMLCrank(XMLexer *lexer)
return NULL;
}
break;
case XML_STATE_PI:
if (XMLookahead(lexer, "?>", true))
{
lexer->state = XML_STATE_NONE;
break;
}
XMLGetc(lexer);
break;
case XML_STATE_ATTR:
attrname = XMLParseName(lexer);
if (!attrname)
@ -250,7 +269,6 @@ XMLFreeEvent(XMLEvent *event)
void *val;
while (HashMapIterate(event->attrs, &key, &val))
{
Log(LOG_INFO, "Trying to free %s", val);
Free(val);
}
HashMapFree(event->attrs);
@ -640,6 +658,8 @@ XMLParseAttQuote(XMLexer *lexer)
point = XMLInitialiseBuffer(lexer);
/* TODO: My Prosody is actually trolling me.
* GIVE ME A FUCKING STREAM ID YOU RETARD. */
while ((c = XMLGetc(lexer)))
{
if (!IsNormalQ(c))