#include <yxml.h>
#include <string.h>
typedef enum {
YXMLS_string,
YXMLS_attr0,
YXMLS_attr1,
YXMLS_attr2,
YXMLS_attr3,
YXMLS_attr4,
YXMLS_cd0,
YXMLS_cd1,
YXMLS_cd2,
YXMLS_comment0,
YXMLS_comment1,
YXMLS_comment2,
YXMLS_comment3,
YXMLS_comment4,
YXMLS_dt0,
YXMLS_dt1,
YXMLS_dt2,
YXMLS_dt3,
YXMLS_dt4,
YXMLS_elem0,
YXMLS_elem1,
YXMLS_elem2,
YXMLS_elem3,
YXMLS_enc0,
YXMLS_enc1,
YXMLS_enc2,
YXMLS_enc3,
YXMLS_etag0,
YXMLS_etag1,
YXMLS_etag2,
YXMLS_init,
YXMLS_le0,
YXMLS_le1,
YXMLS_le2,
YXMLS_le3,
YXMLS_lee1,
YXMLS_lee2,
YXMLS_leq0,
YXMLS_misc0,
YXMLS_misc1,
YXMLS_misc2,
YXMLS_misc2a,
YXMLS_misc3,
YXMLS_pi0,
YXMLS_pi1,
YXMLS_pi2,
YXMLS_pi3,
YXMLS_pi4,
YXMLS_std0,
YXMLS_std1,
YXMLS_std2,
YXMLS_std3,
YXMLS_ver0,
YXMLS_ver1,
YXMLS_ver2,
YXMLS_ver3,
YXMLS_xmldecl0,
YXMLS_xmldecl1,
YXMLS_xmldecl2,
YXMLS_xmldecl3,
YXMLS_xmldecl4,
YXMLS_xmldecl5,
YXMLS_xmldecl6,
YXMLS_xmldecl7,
YXMLS_xmldecl8,
YXMLS_xmldecl9
} yxml_state_t;
#define yxml_isChar(c) 1
#define yxml_isSP(c) (c == 0x20 || c == 0x09 || c == 0x0a)
#define yxml_isAlpha(c) ((c|32)-'a' < 26)
#define yxml_isNum(c) (c-'0' < 10)
#define yxml_isHex(c) (yxml_isNum(c) || (c|32)-'a' < 6)
#define yxml_isEncName(c) (yxml_isAlpha(c) || yxml_isNum(c) || c == '.' || c == '_' || c == '-')
#define yxml_isNameStart(c) (yxml_isAlpha(c) || c == ':' || c == '_' || c >= 128)
#define yxml_isName(c) (yxml_isNameStart(c) || yxml_isNum(c) || c == '-' || c == '.')
#define yxml_isAttValue(c) (yxml_isChar(c) && c != x->quote && c != '<' && c != '&')
#define yxml_isRef(c) (yxml_isNum(c) || yxml_isAlpha(c) || c == '#')
#define INTFROM5CHARS(a, b, c, d, e) ((((uint64_t)(a))<<32) | (((uint64_t)(b))<<24) | (((uint64_t)(c))<<16) | (((uint64_t)(d))<<8) | (uint64_t)(e))
static inline void yxml_setchar(char *dest, unsigned ch) {
unsigned char _ch = ch;
memcpy(dest, &_ch, 1);
}
static void yxml_setutf8(char *dest, unsigned ch) {
if(ch <= 0x007F)
yxml_setchar(dest++, ch);
else if(ch <= 0x07FF) {
yxml_setchar(dest++, 0xC0 | (ch>>6));
yxml_setchar(dest++, 0x80 | (ch & 0x3F));
} else if(ch <= 0xFFFF) {
yxml_setchar(dest++, 0xE0 | (ch>>12));
yxml_setchar(dest++, 0x80 | ((ch>>6) & 0x3F));
yxml_setchar(dest++, 0x80 | (ch & 0x3F));
} else {
yxml_setchar(dest++, 0xF0 | (ch>>18));
yxml_setchar(dest++, 0x80 | ((ch>>12) & 0x3F));
yxml_setchar(dest++, 0x80 | ((ch>>6) & 0x3F));
yxml_setchar(dest++, 0x80 | (ch & 0x3F));
}
*dest = 0;
}
static inline yxml_ret_t yxml_datacontent(yxml_t *x, unsigned ch) {
yxml_setchar(x->data, ch);
x->data[1] = 0;
return YXML_CONTENT;
}
static inline yxml_ret_t yxml_datapi1(yxml_t *x, unsigned ch) {
yxml_setchar(x->data, ch);
x->data[1] = 0;
return YXML_PICONTENT;
}
static inline yxml_ret_t yxml_datapi2(yxml_t *x, unsigned ch) {
x->data[0] = '?';
yxml_setchar(x->data+1, ch);
x->data[2] = 0;
return YXML_PICONTENT;
}
static inline yxml_ret_t yxml_datacd1(yxml_t *x, unsigned ch) {
x->data[0] = ']';
yxml_setchar(x->data+1, ch);
x->data[2] = 0;
return YXML_CONTENT;
}
static inline yxml_ret_t yxml_datacd2(yxml_t *x, unsigned ch) {
x->data[0] = ']';
x->data[1] = ']';
yxml_setchar(x->data+2, ch);
x->data[3] = 0;
return YXML_CONTENT;
}
static inline yxml_ret_t yxml_dataattr(yxml_t *x, unsigned ch) {
yxml_setchar(x->data, ch == 0x9 || ch == 0xa ? 0x20 : ch);
x->data[1] = 0;
return YXML_ATTRVAL;
}
static yxml_ret_t yxml_pushstack(yxml_t *x, char **res, unsigned ch) {
if(x->stacklen+2 >= x->stacksize)
return YXML_ESTACK;
x->stacklen++;
*res = (char *)x->stack+x->stacklen;
x->stack[x->stacklen] = ch;
x->stacklen++;
x->stack[x->stacklen] = 0;
return YXML_OK;
}
static yxml_ret_t yxml_pushstackc(yxml_t *x, unsigned ch) {
if(x->stacklen+1 >= x->stacksize)
return YXML_ESTACK;
x->stack[x->stacklen] = ch;
x->stacklen++;
x->stack[x->stacklen] = 0;
return YXML_OK;
}
static void yxml_popstack(yxml_t *x) {
do
x->stacklen--;
while(x->stack[x->stacklen]);
}
static inline yxml_ret_t yxml_elemstart (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->elem, ch); }
static inline yxml_ret_t yxml_elemname (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
static inline yxml_ret_t yxml_elemnameend(yxml_t *x, unsigned ch) { return YXML_ELEMSTART; }
static yxml_ret_t yxml_selfclose(yxml_t *x, unsigned ch) {
yxml_popstack(x);
if(x->stacklen) {
x->elem = (char *)x->stack+x->stacklen-1;
while(*(x->elem-1))
x->elem--;
return YXML_ELEMEND;
}
x->elem = (char *)x->stack;
x->state = YXMLS_misc3;
return YXML_ELEMEND;
}
static inline yxml_ret_t yxml_elemclose(yxml_t *x, unsigned ch) {
if(*((unsigned char *)x->elem) != ch)
return YXML_ECLOSE;
x->elem++;
return YXML_OK;
}
static inline yxml_ret_t yxml_elemcloseend(yxml_t *x, unsigned ch) {
if(*x->elem)
return YXML_ECLOSE;
return yxml_selfclose(x, ch);
}
static inline yxml_ret_t yxml_attrstart (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->attr, ch); }
static inline yxml_ret_t yxml_attrname (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
static inline yxml_ret_t yxml_attrnameend(yxml_t *x, unsigned ch) { return YXML_ATTRSTART; }
static inline yxml_ret_t yxml_attrvalend (yxml_t *x, unsigned ch) { yxml_popstack(x); return YXML_ATTREND; }
static inline yxml_ret_t yxml_pistart (yxml_t *x, unsigned ch) { return yxml_pushstack(x, &x->pi, ch); }
static inline yxml_ret_t yxml_piname (yxml_t *x, unsigned ch) { return yxml_pushstackc(x, ch); }
static inline yxml_ret_t yxml_piabort (yxml_t *x, unsigned ch) { yxml_popstack(x); return YXML_OK; }
static inline yxml_ret_t yxml_pinameend(yxml_t *x, unsigned ch) {
return (x->pi[0]|32) == 'x' && (x->pi[1]|32) == 'm' && (x->pi[2]|32) == 'l' && !x->pi[3] ? YXML_ESYN : YXML_PISTART;
}
static inline yxml_ret_t yxml_pivalend (yxml_t *x, unsigned ch) { yxml_popstack(x); x->pi = (char *)x->stack; return YXML_PIEND; }
static inline yxml_ret_t yxml_refstart(yxml_t *x, unsigned ch) {
memset(x->data, 0, sizeof(x->data));
x->reflen = 0;
return YXML_OK;
}
static yxml_ret_t yxml_ref(yxml_t *x, unsigned ch) {
if(x->reflen >= sizeof(x->data)-1)
return YXML_EREF;
yxml_setchar(x->data+x->reflen, ch);
x->reflen++;
return YXML_OK;
}
static yxml_ret_t yxml_refend(yxml_t *x, yxml_ret_t ret) {
unsigned char *r = (unsigned char *)x->data;
unsigned ch = 0;
if(*r == '#') {
if(r[1] == 'x')
for(r += 2; yxml_isHex((unsigned)*r); r++)
ch = (ch<<4) + (*r <= '9' ? *r-'0' : (*r|32)-'a' + 10);
else
for(r++; yxml_isNum((unsigned)*r); r++)
ch = (ch*10) + (*r-'0');
if(*r)
ch = 0;
} else {
uint64_t i = INTFROM5CHARS(r[0], r[1], r[2], r[3], r[4]);
ch =
i == INTFROM5CHARS('l','t', 0, 0, 0) ? '<' :
i == INTFROM5CHARS('g','t', 0, 0, 0) ? '>' :
i == INTFROM5CHARS('a','m','p', 0, 0) ? '&' :
i == INTFROM5CHARS('a','p','o','s',0) ? '\'':
i == INTFROM5CHARS('q','u','o','t',0) ? '"' : 0;
}
if(!ch || ch > 0x10FFFF || ch == 0xFFFE || ch == 0xFFFF || (ch-0xDFFF) < 0x7FF)
return YXML_EREF;
yxml_setutf8(x->data, ch);
return ret;
}
static inline yxml_ret_t yxml_refcontent(yxml_t *x, unsigned ch) { return yxml_refend(x, YXML_CONTENT); }
static inline yxml_ret_t yxml_refattrval(yxml_t *x, unsigned ch) { return yxml_refend(x, YXML_ATTRVAL); }
void yxml_init(yxml_t *x, void *stack, size_t stacksize) {
memset(x, 0, sizeof(*x));
x->line = 1;
x->stack = (unsigned char*)stack;
x->stacksize = stacksize;
*x->stack = 0;
x->elem = x->pi = x->attr = (char *)x->stack;
x->state = YXMLS_init;
}
yxml_ret_t yxml_parse(yxml_t *x, int _ch) {
unsigned ch = (unsigned)(_ch+256) & 0xff;
if(!ch)
return YXML_ESYN;
x->total++;
if(x->ignore == ch) {
x->ignore = 0;
return YXML_OK;
}
x->ignore = (ch == 0xd) * 0xa;
if(ch == 0xa || ch == 0xd) {
ch = 0xa;
x->line++;
x->byte = 0;
}
x->byte++;
switch((yxml_state_t)x->state) {
case YXMLS_string:
if(ch == *x->string) {
x->string++;
if(!*x->string)
x->state = x->nextstate;
return YXML_OK;
}
break;
case YXMLS_attr0:
if(yxml_isName(ch))
return yxml_attrname(x, ch);
if(yxml_isSP(ch)) {
x->state = YXMLS_attr1;
return yxml_attrnameend(x, ch);
}
if(ch == (unsigned char)'=') {
x->state = YXMLS_attr2;
return yxml_attrnameend(x, ch);
}
break;
case YXMLS_attr1:
if(yxml_isSP(ch))
return YXML_OK;
if(ch == (unsigned char)'=') {
x->state = YXMLS_attr2;
return YXML_OK;
}
break;
case YXMLS_attr2:
if(yxml_isSP(ch))
return YXML_OK;
if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
x->state = YXMLS_attr3;
x->quote = ch;
return YXML_OK;
}
break;
case YXMLS_attr3:
if(yxml_isAttValue(ch))
return yxml_dataattr(x, ch);
if(ch == (unsigned char)'&') {
x->state = YXMLS_attr4;
return yxml_refstart(x, ch);
}
if(x->quote == ch) {
x->state = YXMLS_elem2;
return yxml_attrvalend(x, ch);
}
break;
case YXMLS_attr4:
if(yxml_isRef(ch))
return yxml_ref(x, ch);
if(ch == (unsigned char)'\x3b') {
x->state = YXMLS_attr3;
return yxml_refattrval(x, ch);
}
break;
case YXMLS_cd0:
if(ch == (unsigned char)']') {
x->state = YXMLS_cd1;
return YXML_OK;
}
if(yxml_isChar(ch))
return yxml_datacontent(x, ch);
break;
case YXMLS_cd1:
if(ch == (unsigned char)']') {
x->state = YXMLS_cd2;
return YXML_OK;
}
if(yxml_isChar(ch)) {
x->state = YXMLS_cd0;
return yxml_datacd1(x, ch);
}
break;
case YXMLS_cd2:
if(ch == (unsigned char)']')
return yxml_datacontent(x, ch);
if(ch == (unsigned char)'>') {
x->state = YXMLS_misc2;
return YXML_OK;
}
if(yxml_isChar(ch)) {
x->state = YXMLS_cd0;
return yxml_datacd2(x, ch);
}
break;
case YXMLS_comment0:
if(ch == (unsigned char)'-') {
x->state = YXMLS_comment1;
return YXML_OK;
}
break;
case YXMLS_comment1:
if(ch == (unsigned char)'-') {
x->state = YXMLS_comment2;
return YXML_OK;
}
break;
case YXMLS_comment2:
if(ch == (unsigned char)'-') {
x->state = YXMLS_comment3;
return YXML_OK;
}
if(yxml_isChar(ch))
return YXML_OK;
break;
case YXMLS_comment3:
if(ch == (unsigned char)'-') {
x->state = YXMLS_comment4;
return YXML_OK;
}
if(yxml_isChar(ch)) {
x->state = YXMLS_comment2;
return YXML_OK;
}
break;
case YXMLS_comment4:
if(ch == (unsigned char)'>') {
x->state = x->nextstate;
return YXML_OK;
}
break;
case YXMLS_dt0:
if(ch == (unsigned char)'>') {
x->state = YXMLS_misc1;
return YXML_OK;
}
if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
x->state = YXMLS_dt1;
x->quote = ch;
x->nextstate = YXMLS_dt0;
return YXML_OK;
}
if(ch == (unsigned char)'<') {
x->state = YXMLS_dt2;
return YXML_OK;
}
if(yxml_isChar(ch))
return YXML_OK;
break;
case YXMLS_dt1:
if(x->quote == ch) {
x->state = x->nextstate;
return YXML_OK;
}
if(yxml_isChar(ch))
return YXML_OK;
break;
case YXMLS_dt2:
if(ch == (unsigned char)'?') {
x->state = YXMLS_pi0;
x->nextstate = YXMLS_dt0;
return YXML_OK;
}
if(ch == (unsigned char)'!') {
x->state = YXMLS_dt3;
return YXML_OK;
}
break;
case YXMLS_dt3:
if(ch == (unsigned char)'-') {
x->state = YXMLS_comment1;
x->nextstate = YXMLS_dt0;
return YXML_OK;
}
if(yxml_isChar(ch)) {
x->state = YXMLS_dt4;
return YXML_OK;
}
break;
case YXMLS_dt4:
if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
x->state = YXMLS_dt1;
x->quote = ch;
x->nextstate = YXMLS_dt4;
return YXML_OK;
}
if(ch == (unsigned char)'>') {
x->state = YXMLS_dt0;
return YXML_OK;
}
if(yxml_isChar(ch))
return YXML_OK;
break;
case YXMLS_elem0:
if(yxml_isName(ch))
return yxml_elemname(x, ch);
if(yxml_isSP(ch)) {
x->state = YXMLS_elem1;
return yxml_elemnameend(x, ch);
}
if(ch == (unsigned char)'/') {
x->state = YXMLS_elem3;
return yxml_elemnameend(x, ch);
}
if(ch == (unsigned char)'>') {
x->state = YXMLS_misc2;
return yxml_elemnameend(x, ch);
}
break;
case YXMLS_elem1:
if(yxml_isSP(ch))
return YXML_OK;
if(ch == (unsigned char)'/') {
x->state = YXMLS_elem3;
return YXML_OK;
}
if(ch == (unsigned char)'>') {
x->state = YXMLS_misc2;
return YXML_OK;
}
if(yxml_isNameStart(ch)) {
x->state = YXMLS_attr0;
return yxml_attrstart(x, ch);
}
break;
case YXMLS_elem2:
if(yxml_isSP(ch)) {
x->state = YXMLS_elem1;
return YXML_OK;
}
if(ch == (unsigned char)'/') {
x->state = YXMLS_elem3;
return YXML_OK;
}
if(ch == (unsigned char)'>') {
x->state = YXMLS_misc2;
return YXML_OK;
}
break;
case YXMLS_elem3:
if(ch == (unsigned char)'>') {
x->state = YXMLS_misc2;
return yxml_selfclose(x, ch);
}
break;
case YXMLS_enc0:
if(yxml_isSP(ch))
return YXML_OK;
if(ch == (unsigned char)'=') {
x->state = YXMLS_enc1;
return YXML_OK;
}
break;
case YXMLS_enc1:
if(yxml_isSP(ch))
return YXML_OK;
if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
x->state = YXMLS_enc2;
x->quote = ch;
return YXML_OK;
}
break;
case YXMLS_enc2:
if(yxml_isAlpha(ch)) {
x->state = YXMLS_enc3;
return YXML_OK;
}
break;
case YXMLS_enc3:
if(yxml_isEncName(ch))
return YXML_OK;
if(x->quote == ch) {
x->state = YXMLS_xmldecl6;
return YXML_OK;
}
break;
case YXMLS_etag0:
if(yxml_isNameStart(ch)) {
x->state = YXMLS_etag1;
return yxml_elemclose(x, ch);
}
break;
case YXMLS_etag1:
if(yxml_isName(ch))
return yxml_elemclose(x, ch);
if(yxml_isSP(ch)) {
x->state = YXMLS_etag2;
return yxml_elemcloseend(x, ch);
}
if(ch == (unsigned char)'>') {
x->state = YXMLS_misc2;
return yxml_elemcloseend(x, ch);
}
break;
case YXMLS_etag2:
if(yxml_isSP(ch))
return YXML_OK;
if(ch == (unsigned char)'>') {
x->state = YXMLS_misc2;
return YXML_OK;
}
break;
case YXMLS_init:
if(ch == (unsigned char)'\xef') {
x->state = YXMLS_string;
x->nextstate = YXMLS_misc0;
x->string = (unsigned char *)"\xbb\xbf";
return YXML_OK;
}
if(yxml_isSP(ch)) {
x->state = YXMLS_misc0;
return YXML_OK;
}
if(ch == (unsigned char)'<') {
x->state = YXMLS_le0;
return YXML_OK;
}
break;
case YXMLS_le0:
if(ch == (unsigned char)'!') {
x->state = YXMLS_lee1;
return YXML_OK;
}
if(ch == (unsigned char)'?') {
x->state = YXMLS_leq0;
return YXML_OK;
}
if(yxml_isNameStart(ch)) {
x->state = YXMLS_elem0;
return yxml_elemstart(x, ch);
}
break;
case YXMLS_le1:
if(ch == (unsigned char)'!') {
x->state = YXMLS_lee1;
return YXML_OK;
}
if(ch == (unsigned char)'?') {
x->state = YXMLS_pi0;
x->nextstate = YXMLS_misc1;
return YXML_OK;
}
if(yxml_isNameStart(ch)) {
x->state = YXMLS_elem0;
return yxml_elemstart(x, ch);
}
break;
case YXMLS_le2:
if(ch == (unsigned char)'!') {
x->state = YXMLS_lee2;
return YXML_OK;
}
if(ch == (unsigned char)'?') {
x->state = YXMLS_pi0;
x->nextstate = YXMLS_misc2;
return YXML_OK;
}
if(ch == (unsigned char)'/') {
x->state = YXMLS_etag0;
return YXML_OK;
}
if(yxml_isNameStart(ch)) {
x->state = YXMLS_elem0;
return yxml_elemstart(x, ch);
}
break;
case YXMLS_le3:
if(ch == (unsigned char)'!') {
x->state = YXMLS_comment0;
x->nextstate = YXMLS_misc3;
return YXML_OK;
}
if(ch == (unsigned char)'?') {
x->state = YXMLS_pi0;
x->nextstate = YXMLS_misc3;
return YXML_OK;
}
break;
case YXMLS_lee1:
if(ch == (unsigned char)'-') {
x->state = YXMLS_comment1;
x->nextstate = YXMLS_misc1;
return YXML_OK;
}
if(ch == (unsigned char)'D') {
x->state = YXMLS_string;
x->nextstate = YXMLS_dt0;
x->string = (unsigned char *)"OCTYPE";
return YXML_OK;
}
break;
case YXMLS_lee2:
if(ch == (unsigned char)'-') {
x->state = YXMLS_comment1;
x->nextstate = YXMLS_misc2;
return YXML_OK;
}
if(ch == (unsigned char)'[') {
x->state = YXMLS_string;
x->nextstate = YXMLS_cd0;
x->string = (unsigned char *)"CDATA[";
return YXML_OK;
}
break;
case YXMLS_leq0:
if(ch == (unsigned char)'x') {
x->state = YXMLS_xmldecl0;
x->nextstate = YXMLS_misc1;
return yxml_pistart(x, ch);
}
if(yxml_isNameStart(ch)) {
x->state = YXMLS_pi1;
x->nextstate = YXMLS_misc1;
return yxml_pistart(x, ch);
}
break;
case YXMLS_misc0:
if(yxml_isSP(ch))
return YXML_OK;
if(ch == (unsigned char)'<') {
x->state = YXMLS_le0;
return YXML_OK;
}
break;
case YXMLS_misc1:
if(yxml_isSP(ch))
return YXML_OK;
if(ch == (unsigned char)'<') {
x->state = YXMLS_le1;
return YXML_OK;
}
break;
case YXMLS_misc2:
if(ch == (unsigned char)'<') {
x->state = YXMLS_le2;
return YXML_OK;
}
if(ch == (unsigned char)'&') {
x->state = YXMLS_misc2a;
return yxml_refstart(x, ch);
}
if(yxml_isChar(ch))
return yxml_datacontent(x, ch);
break;
case YXMLS_misc2a:
if(yxml_isRef(ch))
return yxml_ref(x, ch);
if(ch == (unsigned char)'\x3b') {
x->state = YXMLS_misc2;
return yxml_refcontent(x, ch);
}
break;
case YXMLS_misc3:
if(yxml_isSP(ch))
return YXML_OK;
if(ch == (unsigned char)'<') {
x->state = YXMLS_le3;
return YXML_OK;
}
break;
case YXMLS_pi0:
if(yxml_isNameStart(ch)) {
x->state = YXMLS_pi1;
return yxml_pistart(x, ch);
}
break;
case YXMLS_pi1:
if(yxml_isName(ch))
return yxml_piname(x, ch);
if(ch == (unsigned char)'?') {
x->state = YXMLS_pi4;
return yxml_pinameend(x, ch);
}
if(yxml_isSP(ch)) {
x->state = YXMLS_pi2;
return yxml_pinameend(x, ch);
}
break;
case YXMLS_pi2:
if(ch == (unsigned char)'?') {
x->state = YXMLS_pi3;
return YXML_OK;
}
if(yxml_isChar(ch))
return yxml_datapi1(x, ch);
break;
case YXMLS_pi3:
if(ch == (unsigned char)'>') {
x->state = x->nextstate;
return yxml_pivalend(x, ch);
}
if(yxml_isChar(ch)) {
x->state = YXMLS_pi2;
return yxml_datapi2(x, ch);
}
break;
case YXMLS_pi4:
if(ch == (unsigned char)'>') {
x->state = x->nextstate;
return yxml_pivalend(x, ch);
}
break;
case YXMLS_std0:
if(yxml_isSP(ch))
return YXML_OK;
if(ch == (unsigned char)'=') {
x->state = YXMLS_std1;
return YXML_OK;
}
break;
case YXMLS_std1:
if(yxml_isSP(ch))
return YXML_OK;
if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
x->state = YXMLS_std2;
x->quote = ch;
return YXML_OK;
}
break;
case YXMLS_std2:
if(ch == (unsigned char)'y') {
x->state = YXMLS_string;
x->nextstate = YXMLS_std3;
x->string = (unsigned char *)"es";
return YXML_OK;
}
if(ch == (unsigned char)'n') {
x->state = YXMLS_string;
x->nextstate = YXMLS_std3;
x->string = (unsigned char *)"o";
return YXML_OK;
}
break;
case YXMLS_std3:
if(x->quote == ch) {
x->state = YXMLS_xmldecl8;
return YXML_OK;
}
break;
case YXMLS_ver0:
if(yxml_isSP(ch))
return YXML_OK;
if(ch == (unsigned char)'=') {
x->state = YXMLS_ver1;
return YXML_OK;
}
break;
case YXMLS_ver1:
if(yxml_isSP(ch))
return YXML_OK;
if(ch == (unsigned char)'\'' || ch == (unsigned char)'"') {
x->state = YXMLS_string;
x->quote = ch;
x->nextstate = YXMLS_ver2;
x->string = (unsigned char *)"1.";
return YXML_OK;
}
break;
case YXMLS_ver2:
if(yxml_isNum(ch)) {
x->state = YXMLS_ver3;
return YXML_OK;
}
break;
case YXMLS_ver3:
if(yxml_isNum(ch))
return YXML_OK;
if(x->quote == ch) {
x->state = YXMLS_xmldecl4;
return YXML_OK;
}
break;
case YXMLS_xmldecl0:
if(ch == (unsigned char)'m') {
x->state = YXMLS_xmldecl1;
return yxml_piname(x, ch);
}
if(yxml_isName(ch)) {
x->state = YXMLS_pi1;
return yxml_piname(x, ch);
}
if(ch == (unsigned char)'?') {
x->state = YXMLS_pi4;
return yxml_pinameend(x, ch);
}
if(yxml_isSP(ch)) {
x->state = YXMLS_pi2;
return yxml_pinameend(x, ch);
}
break;
case YXMLS_xmldecl1:
if(ch == (unsigned char)'l') {
x->state = YXMLS_xmldecl2;
return yxml_piname(x, ch);
}
if(yxml_isName(ch)) {
x->state = YXMLS_pi1;
return yxml_piname(x, ch);
}
if(ch == (unsigned char)'?') {
x->state = YXMLS_pi4;
return yxml_pinameend(x, ch);
}
if(yxml_isSP(ch)) {
x->state = YXMLS_pi2;
return yxml_pinameend(x, ch);
}
break;
case YXMLS_xmldecl2:
if(yxml_isSP(ch)) {
x->state = YXMLS_xmldecl3;
return yxml_piabort(x, ch);
}
if(yxml_isName(ch)) {
x->state = YXMLS_pi1;
return yxml_piname(x, ch);
}
break;
case YXMLS_xmldecl3:
if(yxml_isSP(ch))
return YXML_OK;
if(ch == (unsigned char)'v') {
x->state = YXMLS_string;
x->nextstate = YXMLS_ver0;
x->string = (unsigned char *)"ersion";
return YXML_OK;
}
break;
case YXMLS_xmldecl4:
if(yxml_isSP(ch)) {
x->state = YXMLS_xmldecl5;
return YXML_OK;
}
if(ch == (unsigned char)'?') {
x->state = YXMLS_xmldecl9;
return YXML_OK;
}
break;
case YXMLS_xmldecl5:
if(yxml_isSP(ch))
return YXML_OK;
if(ch == (unsigned char)'?') {
x->state = YXMLS_xmldecl9;
return YXML_OK;
}
if(ch == (unsigned char)'e') {
x->state = YXMLS_string;
x->nextstate = YXMLS_enc0;
x->string = (unsigned char *)"ncoding";
return YXML_OK;
}
if(ch == (unsigned char)'s') {
x->state = YXMLS_string;
x->nextstate = YXMLS_std0;
x->string = (unsigned char *)"tandalone";
return YXML_OK;
}
break;
case YXMLS_xmldecl6:
if(yxml_isSP(ch)) {
x->state = YXMLS_xmldecl7;
return YXML_OK;
}
if(ch == (unsigned char)'?') {
x->state = YXMLS_xmldecl9;
return YXML_OK;
}
break;
case YXMLS_xmldecl7:
if(yxml_isSP(ch))
return YXML_OK;
if(ch == (unsigned char)'?') {
x->state = YXMLS_xmldecl9;
return YXML_OK;
}
if(ch == (unsigned char)'s') {
x->state = YXMLS_string;
x->nextstate = YXMLS_std0;
x->string = (unsigned char *)"tandalone";
return YXML_OK;
}
break;
case YXMLS_xmldecl8:
if(yxml_isSP(ch))
return YXML_OK;
if(ch == (unsigned char)'?') {
x->state = YXMLS_xmldecl9;
return YXML_OK;
}
break;
case YXMLS_xmldecl9:
if(ch == (unsigned char)'>') {
x->state = YXMLS_misc1;
return YXML_OK;
}
break;
}
return YXML_ESYN;
}
yxml_ret_t yxml_eof(yxml_t *x) {
if(x->state != YXMLS_misc3)
return YXML_EEOF;
return YXML_OK;
}