--- expat-1.95.1/lib/xmlparse.c Mon Oct 23 04:47:35 2000 +++ expat-1.95.1.triplet/lib/xmlparse.c Wed Jan 3 22:13:16 2001 @@ -1724,6 +1724,32 @@ while ((*to++ = *from++) != 0) ; } + if (ns && ns_triplets && tag->name.localPart && tag->bindings) { + int nameLen = 0; + int prefixLen = 0; + const XML_Char* prefix; + XML_Char *uri; + BINDING* b = tag->bindings; + while (b) { + if (b->uri == tag->name.str) break; + b = b->nextTagBinding; + } + if (b && b->prefix->name) { + prefix = b->prefix->name; + for (nameLen = 0; tag->name.str[nameLen++];) + ; + for (prefixLen = 0; prefix[prefixLen++];) + ; + uri = MALLOC((nameLen + prefixLen) * sizeof(XML_Char)); + memcpy(uri, tag->name.str, nameLen * sizeof(XML_Char)); + if (namespaceSeparator) + uri[nameLen - 1] = namespaceSeparator; + memcpy(uri + nameLen * sizeof(XML_Char), prefix, + prefixLen * sizeof(XML_Char)); + FREE((XML_Char*)tag->name.str); + tag->name.str = uri; + } + } endElementHandler(handlerArg, tag->name.str); } else if (defaultHandler) @@ -1873,6 +1899,7 @@ int i; int n; int nPrefixes = 0; + int prefixLen = 0; BINDING *binding; const XML_Char *localPart; @@ -2076,6 +2103,11 @@ for (i = 0; localPart[i++];) ; n = i + binding->uriLen; + if (ns && ns_triplets && binding->prefix->name) { + for (prefixLen = 0; binding->prefix->name[prefixLen++];) + ; + n += prefixLen; + } if (n > binding->uriAlloc) { TAG *p; XML_Char *uri = MALLOC((n + EXPAND_SPARE) * sizeof(XML_Char)); @@ -2090,6 +2122,16 @@ binding->uri = uri; } memcpy(binding->uri + binding->uriLen, localPart, i * sizeof(XML_Char)); + + if (ns && ns_triplets && binding->prefix->name) { + const XML_Char *s = binding->prefix->name; + if (namespaceSeparator) { + *(binding->uri + binding->uriLen + ((i - 1) * sizeof(XML_Char))) = + namespaceSeparator; + } + memcpy(binding->uri + binding->uriLen + (i * sizeof(XML_Char)), + binding->prefix->name, prefixLen * sizeof(XML_Char)); + } tagNamePtr->str = binding->uri; return XML_ERROR_NONE; }