XML-SAX-ExpatXS

 view release on metacpan or  search on metacpan

ExpatXS.xs  view on Meta::CPAN

  hv_store(thing, "Target", 6, newUTF8SVpv((char*)target, 0), TargetHash);
  if (data)
    hv_store(thing, "Data", 4, newUTF8SVpv((char*)data, 0), DataHash);

  ENTER;
  SAVETMPS;

  PUSHMARK(sp);
  EXTEND(sp, 3);
  PUSHs(cbv->self_sv);
  PUSHs(sv_2mortal(newRV_noinc((SV*)thing)));
  PUTBACK;
  perl_call_method("processing_instruction", G_DISCARD);

  FREETMPS;
  LEAVE;

}  /* End processingInstruction */

static void
commenthandle(void *userData, const char *string)
{
  dSP;
  CallbackVector * cbv = (CallbackVector*) userData;
  HV *thing = newHV();

  xse_characters(userData, cbv->chrbuffer);

  hv_store(thing, "Data", 4, newUTF8SVpv((char*)string, 0), DataHash);

  ENTER;
  SAVETMPS;

  PUSHMARK(sp);
  EXTEND(sp, 1);
  /* PUSHs(cbv->self_sv); */
  PUSHs(sv_2mortal(newRV_noinc((SV*)thing)));
  PUTBACK;
  perl_call_sv(cbv->comment_sv, G_DISCARD);
  /* perl_call_method("comment", G_DISCARD); */

  FREETMPS;
  LEAVE;

}  /* End commenthandler */

static void
startCdata(void *userData)
{
    dSP;
    CallbackVector* cbv = (CallbackVector*) userData;

    xse_characters(userData, cbv->chrbuffer);

    ENTER;
    SAVETMPS;

    PUSHMARK(sp);
    XPUSHs(cbv->self_sv);
    PUTBACK;
    perl_call_method("start_cdata", G_DISCARD);

    FREETMPS;
    LEAVE;
}  /* End startCdata */

static void
endCdata(void *userData)
{
    dSP;
    CallbackVector* cbv = (CallbackVector*) userData;

    xse_characters(userData, cbv->chrbuffer);

    ENTER;
    SAVETMPS;

    PUSHMARK(sp);
    XPUSHs(cbv->self_sv);
    PUTBACK;
    perl_call_method("end_cdata", G_DISCARD);

    FREETMPS;
    LEAVE;
}  /* End endCdata */

static void
nsStart(void *userdata, const XML_Char *prefix, const XML_Char *uri){
  dSP;
  CallbackVector* cbv = (CallbackVector*) userdata;
  HV *nsatt = newHV();

  xse_characters(userdata, cbv->chrbuffer);
  if (cbv->feat_locator) XML_DefaultCurrent(cbv->p);	

  /* NS declarations are reported as common attributes or not */
  if (cbv->feat_nsatts) {
    char *keyname;

    keyname = (char *) mymalloc(prefix ? (strlen(prefix) + 37) : 37);

    if (!cbv->atts_ready) {
      cbv->atts = newHV();
      cbv->atts_ready = 1;
    }     

    if (prefix) {
      char *a_name;

      a_name = (char *) mymalloc(strlen(prefix) + 7);
      strcpy(a_name, "xmlns:");
      strcat(a_name, prefix);

      strcpy(keyname, (cbv->feat_perlxmlns || cbv->feat_xmlns) 
             ? "{http://www.w3.org/2000/xmlns/}" : "{}");

      hv_store(nsatt, "Name", 4, newUTF8SVpv(a_name, strlen(a_name)), NameHash);
      hv_store(nsatt, "Prefix", 6, newUTF8SVpv("xmlns", 5), PrefixHash);
      hv_store(nsatt, "LocalName", 9, 
               newUTF8SVpv((char*)prefix, strlen(prefix)), LocalNameHash);
      hv_store(nsatt, "NamespaceURI", 12, (cbv->feat_perlxmlns || cbv->feat_xmlns) ?
               newUTF8SVpv("http://www.w3.org/2000/xmlns/", 29) 
               : SvREFCNT_inc(empty_sv), NamespaceURIHash);

      myfree(a_name);

    } else {

      strcpy(keyname, cbv->feat_xmlns ? "{http://www.w3.org/2000/xmlns/}" : "{}");

      hv_store(nsatt, "Name", 4, newUTF8SVpv("xmlns", 5), NameHash);
      hv_store(nsatt, "Prefix", 6, SvREFCNT_inc(empty_sv), PrefixHash);
      hv_store(nsatt, "LocalName", 9, newUTF8SVpv("xmlns", 5), LocalNameHash);
      hv_store(nsatt, "NamespaceURI", 12, cbv->feat_xmlns ?
               newUTF8SVpv("http://www.w3.org/2000/xmlns/", 29) 
               : SvREFCNT_inc(empty_sv), NamespaceURIHash);
    }

    strcat(keyname, prefix ? prefix : "xmlns");

    hv_store(nsatt, "Value", 5, 



( run in 1.601 second using v1.01-cache-2.11-cpan-600a1bdf6e4 )