SGML-SPGroveBuilder

 view release on metacpan or  search on metacpan

SPGroveNew.cc  view on Meta::CPAN

		      as_string(att_ptr->name), att_ptr->name.len,
		      notation_ref, 0);
	  } else {
	    SV *token = newSVpv(as_string(att_ptr->tokens), att_ptr->tokens.len);
	    hv_store (attributes,
		      as_string(att_ptr->name), att_ptr->name.len,
		      token, 0);
	  }
	}
        break;
      case Attribute::cdata:
	{
	  AV *att_data = newAV();
	  size_t nCdataChunks = att_ptr->nCdataChunks;
	  const SGMLApplication::Attribute::CdataChunk *cdataChunk
	    = att_ptr->cdataChunks;

	  if (attributes == (HV*)&sv_undef) {
	    attributes = newHV();
	  }

	  // XXX we can optimize by using a C array and av_make instead of push
	  while (nCdataChunks-- > 0) {
	    SV *data = NULL;

	    if (cdataChunk->isSdata) {
	      SV *sdata_a[2];
	      sdata_a[0] = newSVpv(as_string(cdataChunk->data),
				   cdataChunk->data.len);
	      sdata_a[1] = newSVpv(as_string(cdataChunk->entityName),
				   cdataChunk->entityName.len);
	      AV *sdata = av_make(2, &sdata_a[0]);
	      SvREFCNT_dec (sdata_a[0]);
	      SvREFCNT_dec (sdata_a[1]);
	      data = newRV_noinc((SV*)sdata);
	      sv_bless (data, sdata_stash_);
	    } else if (!cdataChunk->isNonSgml) {
	      data = newSVpv(as_string(cdataChunk->data), cdataChunk->data.len);
	    } else {
	      // XXX we need to do better than this
	      fprintf (stderr, "SPGroveNew: isNonSGML in cdata attribute\n");
	    }
	    if (data != NULL) {
	      av_push (att_data, data);
	    }
	    cdataChunk ++;
	  }

	  hv_store (attributes,
		    as_string(att_ptr->name), att_ptr->name.len,
		    newRV_noinc((SV*)att_data), 0);
	}
	break;
      default: {
	  // XXX this is a CANT_HAPPEN
	  av_push(errors_, newSVpv("SPGroveNew: invalid attribute type", 0));

SPGroveNew.cc  view on Meta::CPAN

{
  char *name = as_string(entity->name);
  SV **entity_def = hv_fetch(entities_, name, entity->name.len, 0);
  if (!entity_def) {
    HV *new_entity = newHV();
    hv_store(new_entity, "name", 4, newSVpv(name, entity->name.len), 0);

    char *type = 0;
    HV *stash;
    switch (entity->dataType) {
    case Entity::cdata:  type = "CDATA"; stash = extentity_stash_; break;
    case Entity::sdata:  type = "SDATA"; stash = extentity_stash_; break;
    case Entity::ndata:  type = "NDATA"; stash = extentity_stash_; break;
    case Entity::subdoc: stash = subdocentity_stash_; break;
    default: {
        av_push(errors_, newSVpv("SPGroveNew: data type not handled", 0));
      }
    }
    if (type) {
      hv_store(new_entity, "type", 4, newSVpv(type, 5), 0);
    }



( run in 0.606 second using v1.01-cache-2.11-cpan-454fe037f31 )