~ubuntu-branches/ubuntu/lucid/libxml-libxml-perl/lucid

« back to all changes in this revision

Viewing changes to perl-libxml-sax.c

  • Committer: Bazaar Package Importer
  • Author(s): gregor herrmann, gregor herrmann, Damyan Ivanov
  • Date: 2008-11-29 10:43:03 UTC
  • mfrom: (1.2.5 upstream)
  • mto: This revision was merged to the branch mainline in revision 6.
  • Revision ID: james.westby@ubuntu.com-20081129104303-z1jg50ymutx3kgos
Tags: 1.69.ds-1
[ gregor herrmann ]
* New upstream release.
* Set Standards-Version to 3.8.0; add debian/README.source to document quilt
  usage.
* Add a debian/repack.sh script that creates the .ds version from the
  upstream tarball: it removes the debian/ directory and the lines
  referencing it in MANIFEST. Mention the repackaging in
  debian/README.source. Add get-orig-source target to debian/rules.
* debian/watch: extended regexp for matching upstream releases.
* Refresh patch fix_manpage_typos and add a short description.
* Set debhelper compatibility level to 7; adapt
  debian/{control,compat,rules}.
* debian/copyright: switch to new format.
* debian/control:
  - switch Vcs-Browser field to ViewSVN
  - add /me to Uploaders
  - wrap long lines
  - mention module name in long description
  - remove -1 revision from versioned build dependency
  - add ${misc:Depends} to Depends:

[ Damyan Ivanov ]
* add no_linking_with_libm.patch, avoiding unneeded linkage with libm

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/**
2
2
 * perl-libxml-sax.c
3
 
 * $Id: perl-libxml-sax.c 688 2007-10-20 18:10:34Z pajas $
 
3
 * $Id: perl-libxml-sax.c 730 2008-10-30 13:20:10Z pajas $
4
4
 */
5
5
 
6
6
#ifdef __cplusplus
26
26
}
27
27
#endif
28
28
 
 
29
 
 
30
/* 
 
31
   we must call CLEAR_SERROR_HANDLER upon each excurse from 
 
32
   perl
 
33
*/
 
34
#define WITH_SERRORS
 
35
 
 
36
#ifdef WITH_SERRORS
 
37
#define CLEAR_SERROR_HANDLER /*xmlSetStructuredErrorFunc(NULL,NULL);*/
 
38
#else
 
39
#define CLEAR_SERROR_HANDLER
 
40
#endif
 
41
 
29
42
#define NSDELIM ':'
30
43
/* #define NSDEFAULTURI "http://www.w3.org/XML/1998/namespace" */ 
31
44
#define NSDEFAULTURI "http://www.w3.org/2000/xmlns/"
123
136
    SV ** th;
124
137
    dTHX;
125
138
 
 
139
    CLEAR_SERROR_HANDLER
126
140
    vec = (PmmSAXVector*) xmlMalloc( sizeof(PmmSAXVector) );
127
141
 
128
142
    vec->ns_stack_root = xmlNewDoc(NULL);
204
218
 
205
219
    param = newHV();
206
220
 
207
 
    hv_store(param, "NamespaceURI", 12,
 
221
    (void) hv_store(param, "NamespaceURI", 12,
208
222
             _C2Sv(uri, NULL), NsURIHash);
209
223
 
210
224
    if ( prefix != NULL ) {
211
 
        hv_store(param, "Prefix", 6,
 
225
        (void) hv_store(param, "Prefix", 6,
212
226
                 _C2Sv(prefix, NULL), PrefixHash);
213
227
    }
214
228
    else {
215
 
        hv_store(param, "Prefix", 6,
 
229
        (void) hv_store(param, "Prefix", 6,
216
230
                 _C2Sv((const xmlChar*)"", NULL), PrefixHash);
217
231
    }
218
232
 
232
246
    }
233
247
    FREETMPS ;
234
248
    LEAVE ;
 
249
    CLEAR_SERROR_HANDLER
235
250
}
236
251
 
237
252
void
247
262
    ENTER;
248
263
    SAVETMPS;
249
264
    param = newHV();
250
 
    hv_store(param, "NamespaceURI", 12,
 
265
    (void) hv_store(param, "NamespaceURI", 12,
251
266
             _C2Sv(uri, NULL), NsURIHash);
252
267
 
253
268
    if ( prefix != NULL ) {
254
 
        hv_store(param, "Prefix", 6,
 
269
        (void) hv_store(param, "Prefix", 6,
255
270
                 _C2Sv(prefix, NULL), PrefixHash);
256
271
    }
257
272
    else {
258
 
        hv_store(param, "Prefix", 6,
 
273
        (void) hv_store(param, "Prefix", 6,
259
274
                 _C2Sv((const xmlChar *)"", NULL), PrefixHash);
260
275
    }
261
276
 
277
292
    
278
293
    FREETMPS ;
279
294
    LEAVE ;
 
295
    CLEAR_SERROR_HANDLER
280
296
}
281
297
 
282
298
void 
382
398
    xmlNsPtr ns = NULL;
383
399
 
384
400
    if ( name != NULL && xmlStrlen( name )  ) {
385
 
        hv_store(retval, "Name", 4,
 
401
        (void) hv_store(retval, "Name", 4,
386
402
                 _C2Sv(name, NULL), NameHash);
387
403
 
388
404
        localname = xmlSplitQName(NULL, name, &prefix);
391
407
        if (prefix != NULL) xmlFree(prefix);
392
408
 
393
409
        if ( ns != NULL ) {
394
 
            hv_store(retval, "NamespaceURI", 12,
 
410
            (void) hv_store(retval, "NamespaceURI", 12,
395
411
                     _C2Sv(ns->href, NULL), NsURIHash);
396
412
            if ( ns->prefix ) {
397
 
                hv_store(retval, "Prefix", 6,
 
413
                (void) hv_store(retval, "Prefix", 6,
398
414
                         _C2Sv(ns->prefix, NULL), PrefixHash);
399
415
            }
400
416
            else {
401
 
                hv_store(retval, "Prefix", 6,
 
417
                (void) hv_store(retval, "Prefix", 6,
402
418
                         _C2Sv((const xmlChar *)"",NULL), PrefixHash);
403
419
            }
404
420
 
405
 
            hv_store(retval, "LocalName", 9,
 
421
            (void) hv_store(retval, "LocalName", 9,
406
422
                     _C2Sv(sax->ns_stack->name, NULL), LocalNameHash);
407
423
        }
408
424
        else {
409
 
            hv_store(retval, "NamespaceURI", 12,
 
425
            (void) hv_store(retval, "NamespaceURI", 12,
410
426
                     _C2Sv((const xmlChar *)"",NULL), NsURIHash);
411
 
            hv_store(retval, "Prefix", 6,
 
427
            (void) hv_store(retval, "Prefix", 6,
412
428
                     _C2Sv((const xmlChar *)"",NULL), PrefixHash);
413
 
            hv_store(retval, "LocalName", 9,
 
429
            (void) hv_store(retval, "LocalName", 9,
414
430
                     _C2Sv(name, NULL), LocalNameHash);
415
431
        }
416
432
    }
471
487
            if ( name != NULL && xmlStrlen( name ) ) {
472
488
                localname = xmlSplitQName(NULL, name, &prefix);
473
489
 
474
 
                hv_store(atV, "Name", 4,
 
490
                (void) hv_store(atV, "Name", 4,
475
491
                         _C2Sv(name, NULL), NameHash);
476
492
                if ( value != NULL ) {
477
 
                    hv_store(atV, "Value", 5,
 
493
                    (void) hv_store(atV, "Value", 5,
478
494
                             _C2Sv(value, NULL), ValueHash);
479
495
                }
480
496
 
483
499
                    PmmAddNamespace( sax, NULL, value, handler);  
484
500
                    /* nsURI = (const xmlChar*)NSDEFAULTURI; */
485
501
                    nsURI = NULL;
486
 
                    hv_store(atV, "Name", 4,
 
502
                    (void) hv_store(atV, "Name", 4,
487
503
                             _C2Sv(name, NULL), NameHash);
488
504
 
489
 
                    hv_store(atV, "Prefix", 6,
 
505
                    (void) hv_store(atV, "Prefix", 6,
490
506
                             _C2Sv((const xmlChar *)"", NULL), PrefixHash);
491
 
                    hv_store(atV, "LocalName", 9,
 
507
                    (void) hv_store(atV, "LocalName", 9,
492
508
                             _C2Sv(name,NULL), LocalNameHash);
493
 
                    hv_store(atV, "NamespaceURI", 12,
 
509
                    (void) hv_store(atV, "NamespaceURI", 12,
494
510
                             _C2Sv((const xmlChar *)"", NULL), NsURIHash);
495
511
                    
496
512
                }
502
518
 
503
519
                    nsURI = (const xmlChar*)NSDEFAULTURI;
504
520
         
505
 
                    hv_store(atV, "Prefix", 6,
 
521
                    (void) hv_store(atV, "Prefix", 6,
506
522
                             _C2Sv(prefix, NULL), PrefixHash);
507
 
                    hv_store(atV, "LocalName", 9,
 
523
                    (void) hv_store(atV, "LocalName", 9,
508
524
                             _C2Sv(localname, NULL), LocalNameHash);
509
 
                    hv_store(atV, "NamespaceURI", 12,
 
525
                    (void) hv_store(atV, "NamespaceURI", 12,
510
526
                             _C2Sv((const xmlChar *)NSDEFAULTURI,NULL),
511
527
                             NsURIHash);
512
528
                }
514
530
                          && (ns = PmmGetNsMapping( sax->ns_stack, prefix ) ) ) {
515
531
                    nsURI = ns->href;
516
532
 
517
 
                    hv_store(atV, "NamespaceURI", 12,
 
533
                    (void) hv_store(atV, "NamespaceURI", 12,
518
534
                             _C2Sv(ns->href, NULL), NsURIHash);
519
 
                    hv_store(atV, "Prefix", 6,
 
535
                    (void) hv_store(atV, "Prefix", 6,
520
536
                             _C2Sv(ns->prefix, NULL), PrefixHash);
521
 
                    hv_store(atV, "LocalName", 9,
 
537
                    (void) hv_store(atV, "LocalName", 9,
522
538
                             _C2Sv(localname, NULL), LocalNameHash);
523
539
                }
524
540
                else {
525
541
                    nsURI = NULL;
526
 
                    hv_store(atV, "NamespaceURI", 12,
 
542
                    (void) hv_store(atV, "NamespaceURI", 12,
527
543
                             _C2Sv((const xmlChar *)"", NULL), NsURIHash);
528
 
                    hv_store(atV, "Prefix", 6,
 
544
                    (void) hv_store(atV, "Prefix", 6,
529
545
                             _C2Sv((const xmlChar *)"", NULL), PrefixHash);
530
 
                    hv_store(atV, "LocalName", 9,
 
546
                    (void) hv_store(atV, "LocalName", 9,
531
547
                             _C2Sv(name, NULL), LocalNameHash);
532
548
                }
533
549
 
536
552
 
537
553
                len = xmlStrlen( keyname );
538
554
                PERL_HASH( atnameHash, (const char *)keyname, len );
539
 
                hv_store(retval,
 
555
                (void) hv_store(retval,
540
556
                         (const char *)keyname,
541
557
                         len,
542
558
                         newRV_noinc((SV*)atV),
567
583
    HV * retval = newHV();
568
584
 
569
585
    if ( data != NULL && xmlStrlen( data ) ) {
570
 
        hv_store(retval, "Data", 4,
 
586
        (void) hv_store(retval, "Data", 4,
571
587
                 _C2Sv_len(data, len), DataHash);
572
588
    }
573
589
 
582
598
    HV * retval = newHV();
583
599
 
584
600
    if ( target != NULL && xmlStrlen( target ) ) {
585
 
        hv_store(retval, "Target", 6,
 
601
        (void) hv_store(retval, "Target", 6,
586
602
                 _C2Sv(target, NULL), TargetHash);
587
603
 
588
604
        if ( data != NULL && xmlStrlen( data ) ) {
589
 
            hv_store(retval, "Data", 4,
 
605
            (void) hv_store(retval, "Data", 4,
590
606
                     _C2Sv(data, NULL), DataHash);
591
607
        }
592
608
        else {
593
 
            hv_store(retval, "Data", 4,
 
609
            (void) hv_store(retval, "Data", 4,
594
610
                     _C2Sv((const xmlChar *)"", NULL), DataHash);
595
611
        }
596
612
    }
606
622
{
607
623
    HV * retval = newHV();
608
624
    if ( name != NULL && xmlStrlen( name ) ) {
609
 
      hv_store(retval, "Name", 4,
 
625
      (void) hv_store(retval, "Name", 4,
610
626
               _C2Sv(name, NULL), NameHash);
611
627
    }
612
628
    if ( publicId != NULL && xmlStrlen( publicId ) ) {
613
 
      hv_store(retval, "PublicId", 8,
 
629
      (void) hv_store(retval, "PublicId", 8,
614
630
               _C2Sv(publicId, NULL), PublicIdHash);
615
631
    }
616
632
    if ( systemId != NULL && xmlStrlen( systemId ) ) {
617
 
      hv_store(retval, "SystemId", 8,
 
633
      (void) hv_store(retval, "SystemId", 8,
618
634
               _C2Sv(systemId, NULL), SystemIdHash);
619
635
    }
620
636
    return retval;
658
674
 
659
675
        empty = newHV();
660
676
        if ( ctxt->version != NULL ) {
661
 
            hv_store(empty, "Version", 7,
 
677
            (void) hv_store(empty, "Version", 7,
662
678
                     _C2Sv(ctxt->version, NULL), VersionHash);
663
679
        }
664
680
        else {
665
 
            hv_store(empty, "Version", 7,
 
681
            (void) hv_store(empty, "Version", 7,
666
682
                     _C2Sv((const xmlChar *)"1.0", NULL), VersionHash);
667
683
        }
668
684
        
669
685
        if ( ctxt->input->encoding != NULL ) {
670
 
            hv_store(empty, "Encoding", 8,
 
686
            (void) hv_store(empty, "Encoding", 8,
671
687
                     _C2Sv(ctxt->input->encoding, NULL), EncodingHash);
672
688
        }
673
689
 
677
693
        PUTBACK;
678
694
        
679
695
        call_method( "xml_decl", G_SCALAR | G_EVAL | G_DISCARD );
 
696
        CLEAR_SERROR_HANDLER
680
697
        sv_2mortal(rv);
681
698
        if (SvTRUE(ERRSV)) {
682
699
            STRLEN n_a;
686
703
        FREETMPS ;
687
704
        LEAVE ;
688
705
    }
689
 
 
 
706
    CLEAR_SERROR_HANDLER
690
707
    return 1;
691
708
}
692
709
 
714
731
    
715
732
    FREETMPS ;
716
733
    LEAVE ;
717
 
 
 
734
    CLEAR_SERROR_HANDLER
718
735
    return 1;
719
736
}
720
737
 
741
758
    element  = PmmGenElementSV(aTHX_ sax, name);
742
759
 
743
760
    arv = newRV_noinc((SV*)attrhash);
744
 
    hv_store( element,
 
761
    (void) hv_store( element,
745
762
              "Attributes",
746
763
              10,
747
764
              arv,
764
781
    
765
782
    FREETMPS ;
766
783
    LEAVE ;
767
 
 
768
 
 
 
784
    CLEAR_SERROR_HANDLER
769
785
    return 1;
770
786
}
771
787
 
804
820
    LEAVE ;
805
821
 
806
822
    PmmNarrowNsStack(sax, handler);
807
 
 
 
823
    CLEAR_SERROR_HANDLER
808
824
    return 1;
809
825
}
810
826
 
853
869
        LEAVE ;
854
870
 
855
871
    }
856
 
 
 
872
    CLEAR_SERROR_HANDLER;
857
873
    return 1;
858
874
}
859
875
 
894
910
        FREETMPS ;
895
911
        LEAVE ;
896
912
    }
897
 
 
 
913
    CLEAR_SERROR_HANDLER
898
914
    return 1;
899
915
}
900
916
 
959
975
        LEAVE ;
960
976
 
961
977
    }
962
 
 
 
978
    CLEAR_SERROR_HANDLER
963
979
    return 1;
964
980
 
965
981
}
1001
1017
        FREETMPS ;
1002
1018
        LEAVE ;
1003
1019
    }
 
1020
    CLEAR_SERROR_HANDLER
1004
1021
    return 1;
1005
1022
}
1006
1023
 
1054
1071
        FREETMPS ;
1055
1072
        LEAVE ;
1056
1073
    }
 
1074
    CLEAR_SERROR_HANDLER
1057
1075
    return;
1058
1076
}
1059
1077
 
1160
1178
    
1161
1179
    FREETMPS ;
1162
1180
    LEAVE ;
1163
 
 
 
1181
    CLEAR_SERROR_HANDLER
1164
1182
    return 1;
1165
1183
}
1166
1184
 
1173
1191
 
1174
1192
    va_list args;
1175
1193
    SV * svMessage;
 
1194
 
1176
1195
#if LIBXML_VERSION > 20600
1177
1196
    xmlErrorPtr last_err = xmlCtxtGetLastError( ctxt );
1178
1197
#endif    
1191
1210
    va_start(args, msg);
1192
1211
    sv_vsetpvfn(svMessage, msg, xmlStrlen((const xmlChar *)msg), &args, NULL, 0, NULL);
1193
1212
    va_end(args);
1194
 
 
1195
 
    sv_catsv( sax->saved_error, svMessage );
1196
 
 
 
1213
    if (SvOK(sax->saved_error)) {
 
1214
      sv_catsv( sax->saved_error, svMessage );
 
1215
    } else {
 
1216
      sv_setsv( sax->saved_error, svMessage );
 
1217
    }
1197
1218
    XPUSHs(sv_2mortal(svMessage));
1198
1219
    XPUSHs(sv_2mortal(newSViv(ctxt->input->line)));
1199
1220
    XPUSHs(sv_2mortal(newSViv(ctxt->input->col)));
1220
1241
    
1221
1242
    FREETMPS ;
1222
1243
    LEAVE ;
 
1244
    CLEAR_SERROR_HANDLER
1223
1245
    return 1;
1224
1246
}
1225
1247
 
1248
1270
    PUSHMARK(SP) ;
1249
1271
    XPUSHs(sax->parser);
1250
1272
 
1251
 
    sv_catsv( sax->saved_error, svMessage );
 
1273
    if (SvOK(sax->saved_error)) {
 
1274
      sv_catsv( sax->saved_error, svMessage );
 
1275
    } else {
 
1276
      sv_setsv( sax->saved_error, svMessage );
 
1277
    }
1252
1278
 
1253
1279
    XPUSHs(sv_2mortal(svMessage));
1254
1280
    XPUSHs(sv_2mortal(newSViv(ctxt->input->line)));
1263
1289
    
1264
1290
    FREETMPS ;
1265
1291
    LEAVE ;
 
1292
    CLEAR_SERROR_HANDLER
1266
1293
    return 1;
1267
1294
}
1268
1295