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 )