XML-Bare-SAX-Parser
view release on metacpan or search on metacpan
parser_engine.c view on Meta::CPAN
curnode = next;
}
curatt = node->firstatt;
while( curatt ) {
nexta = curatt->next;
free( curatt );
curatt = nexta;
}
free( node );
}
struct attc* new_attc( struct nodec *newparent ) {
int size = sizeof( struct attc );
struct attc *self = (struct attc *) malloc( size );
memset( (char *) self, 0, size );
self->parent = newparent;
return self;
}
struct nodec* parserc_parse( struct parserc *self, char *xmlin ) {
char *tagname, *attname, *attval, *val;
struct nodec *root = new_nodec();
int tagname_len = 0;
int attname_len = 0;
int attval_len = 0;
struct nodec *curnode = root;
struct attc *curatt = NULL;
char *cpos = &xmlin[0];
int pos = 0;
register int let;
val_1:
let = *cpos;
switch( let ) {
case 0: goto done;
case '<': goto val_x;
}
if( !curnode->numvals ) {
curnode->value = cpos;
curnode->vallen = 1;
}
curnode->numvals++;
cpos++;
val_x:
let = *cpos;
switch( let ) {
case 0:
goto done;
case '<':
switch( *(cpos+1) ) {
case '!':
if( *(cpos+2) == '[' ) { // <![
//if( !strncmp( cpos+3, "CDATA", 5 ) ) {
if( *(cpos+3) == 'C' &&
*(cpos+4) == 'D' &&
*(cpos+5) == 'A' &&
*(cpos+6) == 'T' &&
*(cpos+7) == 'A' ) {
cpos += 9;
goto cdata;
}
else {
cpos++; cpos++;
goto val_x;//actually goto error...
}
}
else if( *(cpos+2) == '-' && // <!--
*(cpos+3) == '-' ) {
cpos += 4;
goto comment;
}
else {
cpos++;
goto bang;
}
case '?':
cpos+=2;
goto pi;
}
tagname_len = 0; // for safety
cpos++;
goto name_1;
}
if( curnode->numvals == 1 ) curnode->vallen++;
cpos++;
goto val_x;
outside:
if( *cpos == '<' ) {
tagname_len = 0; // for safety
cpos++;
goto name_1;
}
cpos++;
goto outside;
comment_1dash:
cpos++;
let = *cpos;
if( let == '-' ) goto comment_2dash;
goto comment_x;
comment_2dash:
cpos++;
let = *cpos;
if( let == '>' ) goto outside;
goto comment_x;
comment:
let = *cpos;
switch( let ) {
case 0: goto done;
case '-': goto comment_1dash;
}
if( !curnode->numcoms ) {
curnode->comment = cpos;
curnode->comlen = 1;
}
curnode->numcoms++;
cpos++;
comment_x:
let = *cpos;
switch( let ) {
case 0: goto done;
case '-': goto comment_1dash;
}
if( curnode->numcoms == 1 ) curnode->comlen++;
cpos++;
goto comment_x;
pi:
let = *cpos;
if( !let ) goto done;
if( let == '?' && *(cpos+1) == '>' ) {
cpos += 2;
goto val_1;
}
cpos++;
goto pi;
bang:
let = *cpos;
if( !let ) goto done;
if( let == '>' ) {
cpos++;
goto val_1;
}
cpos++;
goto bang;
cdata:
let = *cpos;
if( !let ) goto done;
if( let == ']' && *(cpos+1) == ']' && *(cpos+2) == '>' ) {
cpos += 3;
goto val_1;
}
if( !curnode->numvals ) {
curnode->value = cpos;
curnode->vallen = 0;
curnode->numvals = 1;
}
if( curnode->numvals == 1 ) curnode->vallen++;
cpos++;
goto cdata;
name_1:
let = *cpos;
if( !let ) goto done;
switch( let ) {
case 0:
goto done;
case ' ':
case 0x0d:
case 0x0a:
cpos++;
goto name_1;
case '/':
tagname_len = 0; // needed to reset
cpos++;
goto ename_x;
}
tagname = cpos;
tagname_len = 1;
cpos++;
goto name_x;
name_x:
let = *cpos;
switch( let ) {
case 0:
goto done;
case ' ':
case 0x0d:
case 0x0a:
curnode = nodec_addchildr( curnode, tagname, tagname_len );
attname_len = 0;
cpos++;
goto name_gap;
case '>':
curnode = nodec_addchildr( curnode, tagname, tagname_len );
cpos++;
goto val_1;
case '/':
nodec_addchildr( curnode, tagname, tagname_len );
tagname_len = 0;
cpos+=2;
goto val_1;
}
tagname_len++;
cpos++;
goto name_x;
name_gap:
let = *cpos;
switch( *cpos ) {
case 0:
goto done;
case ' ':
case 0x0d:
case 0x0a:
cpos++;
goto name_gap;
case '>':
( run in 0.895 second using v1.01-cache-2.11-cpan-39bf76dae61 )