141
148
SV * sv = newSVpvn( curnode->value, curnode->vallen );
151
return newSViv( 1 ); //&PL_sv_undef;
147
HV *output = newHV();
148
SV *outputref = newRV( (SV *) output );
151
curnode = curnode->firstchild;
152
for( i = 0; i < length; i++ ) {
153
SV *namesv = newSVpvn( curnode->name, curnode->namelen );
155
SV **cur = hv_fetch( output, curnode->name, curnode->namelen, 0 );
157
if( curnode->namelen > 6 ) {
158
if( !strncmp( curnode->name, "multi_", 6 ) ) {
159
char *subname = &curnode->name[6];
160
int subnamelen = curnode->namelen-6;
161
SV **old = hv_fetch( output, subname, subnamelen, 0 );
162
AV *newarray = newAV();
163
SV *newarrayref = newRV( (SV *) newarray );
154
HV *output = newHV();
155
SV *outputref = newRV( (SV *) output );
158
curnode = curnode->firstchild;
159
for( i = 0; i < length; i++ ) {
160
SV *namesv = newSVpvn( curnode->name, curnode->namelen );
162
SV **cur = hv_fetch( output, curnode->name, curnode->namelen, 0 );
164
if( curnode->namelen > 6 ) {
165
if( !strncmp( curnode->name, "multi_", 6 ) ) {
166
char *subname = &curnode->name[6];
167
int subnamelen = curnode->namelen-6;
168
SV **old = hv_fetch( output, subname, subnamelen, 0 );
169
AV *newarray = newAV();
170
SV *newarrayref = newRV( (SV *) newarray );
172
hv_store( output, subname, subnamelen, newarrayref, 0 );
175
if( SvTYPE( SvRV(*old) ) == SVt_PVHV ) { // check for hash ref
176
SV *newref = newRV( (SV *) SvRV(*old) );
177
hv_delete( output, subname, subnamelen, 0 );
165
178
hv_store( output, subname, subnamelen, newarrayref, 0 );
168
if( SvTYPE( SvRV(*old) ) == SVt_PVHV ) { // check for hash ref
169
SV *newref = newRV( (SV *) SvRV(*old) );
170
hv_delete( output, subname, subnamelen, 0 );
171
hv_store( output, subname, subnamelen, newarrayref, 0 );
172
av_push( newarray, newref );
179
SV *ob = cxml2obj_simple( aTHX_ 0 );
180
hv_store( output, curnode->name, curnode->namelen, ob, 0 );
183
if( SvROK( *cur ) ) {
184
if( SvTYPE( SvRV(*cur) ) == SVt_PVHV ) {
185
AV *newarray = newAV();
186
SV *newarrayref = newRV( (SV *) newarray );
187
SV *newref = newRV( (SV *) SvRV( *cur ) );
188
hv_delete( output, curnode->name, curnode->namelen, 0 );
189
hv_store( output, curnode->name, curnode->namelen, newarrayref, 0 );
190
179
av_push( newarray, newref );
191
av_push( newarray, cxml2obj_simple( aTHX_ 0 ) );
194
AV *av = (AV *) SvRV( *cur );
195
av_push( av, cxml2obj_simple( aTHX_ 0) );
186
SV *ob = cxml2obj_simple();
187
hv_store( output, curnode->name, curnode->namelen, ob, 0 );
190
if( SvROK( *cur ) ) {
191
if( SvTYPE( SvRV(*cur) ) == SVt_PVHV ) {
199
192
AV *newarray = newAV();
200
193
SV *newarrayref = newRV( (SV *) newarray );
203
char *ptr = SvPV(*cur, len);
204
SV *newsv = newSVpvn( ptr, len );
206
av_push( newarray, newsv );
194
SV *newref = newRV( (SV *) SvRV( *cur ) );
207
195
hv_delete( output, curnode->name, curnode->namelen, 0 );
208
196
hv_store( output, curnode->name, curnode->namelen, newarrayref, 0 );
209
av_push( newarray, cxml2obj_simple( aTHX_ 0 ) );
212
if( i != ( length - 1 ) ) curnode = curnode->next;
214
curnode = curnode->parent;
218
curatt = curnode->firstatt;
219
for( i = 0; i < numatts; i++ ) {
220
attval = newSVpvn( curatt->value, curatt->vallen );
221
hv_store( output, curatt->name, curatt->namelen, attval, 0 );
222
if( i != ( numatts - 1 ) ) curatt = curatt->next;
197
av_push( newarray, newref );
198
av_push( newarray, cxml2obj_simple() );
201
AV *av = (AV *) SvRV( *cur );
202
av_push( av, cxml2obj_simple() );
206
AV *newarray = newAV();
207
SV *newarrayref = newRV( (SV *) newarray );
210
char *ptr = SvPV(*cur, len);
211
SV *newsv = newSVpvn( ptr, len );
213
av_push( newarray, newsv );
214
hv_delete( output, curnode->name, curnode->namelen, 0 );
215
hv_store( output, curnode->name, curnode->namelen, newarrayref, 0 );
216
av_push( newarray, cxml2obj_simple() );
219
if( i != ( length - 1 ) ) curnode = curnode->next;
221
curnode = curnode->parent;
225
curatt = curnode->firstatt;
226
for( i = 0; i < numatts; i++ ) {
227
attval = newSVpvn( curatt->value, curatt->vallen );
228
hv_store( output, curatt->name, curatt->namelen, attval, 0 );
229
if( i != ( numatts - 1 ) ) curatt = curatt->next;
230
236
struct parserc *parser = 0;
232
238
MODULE = XML::Bare PACKAGE = XML::Bare
239
243
curnode = parser->pcurnode;
241
244
if( curnode->err ) RETVAL = newSViv( curnode->err );
242
else RETVAL = cxml2obj(aTHX_ 0);
245
else RETVAL = cxml2obj();
264
//printf("About to parse\n");
266
262
PERL_HASH(vhash, "value", 5);
263
PERL_HASH(ahash, "_att", 4);
267
264
PERL_HASH(chash, "comment", 7);
268
265
PERL_HASH(phash, "_pos", 4);
269
266
PERL_HASH(ihash, "_i", 2 );
267
PERL_HASH(zhash, "_z", 2 );
268
PERL_HASH(cdhash, "_cdata", 6 );
270
269
parser = (struct parserc *) malloc( sizeof( struct parserc ) );
271
270
root = parserc_parse( parser, text );
273
//printf("Returned from parser\n");
276
//root = parser->pcurnode;
277
//this is wrong because parsing may halt in the middle; root= above is correct
280
//printf("C Parsing done\b");
284
273
c_parsefile(filename)
287
276
PERL_HASH(vhash, "value", 5);
277
PERL_HASH(ahash, "_att", 4);
288
278
PERL_HASH(chash, "comment", 7);
289
279
PERL_HASH(phash, "_pos", 4);
290
280
PERL_HASH(ihash, "_i", 2 );
281
PERL_HASH(zhash, "_z", 2 );
282
PERL_HASH(cdhash, "_cdata", 6 );
292
284
unsigned long len;