|
XMLAPI int xml_toutf8_attr (XML * xml, const char * attrname)
{
ATTR * attr;
char * buffer = (char *) MALLOC (256);
int cursize = 256;
int curptr = 0;
char * mark;
char * mark2;
char valbuf[3] = "\0\0";
int count = 0;
if (!xml) return (0);
attr = xml->attrs;
while (attr) {
if (!strcmp (attr->name, attrname)) break;
attr = attr->next;
}
if (!attr) return (0);
if (!attr->value) return (0);
if (!strlen (attr->value)) return (0);
cursize = attr->valsize;
curptr = 0;
buffer = (char *) MALLOC (cursize);
*buffer = '\0';
mark = attr->value;
do {
mark2 = mark; while (*mark2 && (unsigned int) *mark2 < 128) mark2++;
if (*mark2) {
count++;
buffer = _xml_string_tackonn (buffer, &cursize, &curptr, mark, mark2 - mark);
valbuf[0] = 0xC0 + (*(unsigned char *) mark2) / 64;
valbuf[1] = 0x80 + (unsigned int) (*mark2 & 0x3F);
buffer = _xml_string_tackonn (buffer, &cursize, &curptr, valbuf, 2);
mark = mark2 + 1;
} else {
buffer = _xml_string_tackon (buffer, &cursize, &curptr, mark, 0);
}
} while (*mark2);
FREE (attr->value);
attr->value = buffer;
attr->valsize = cursize;
return (count);
}
XMLAPI int xml_toutf8_text (XML * xml)
{
ATTR * attr;
char * buffer = (char *) MALLOC (256);
int cursize = 256;
int curptr = 0;
char * mark;
char * mark2;
char valbuf[3] = "\0\0";
int count = 0;
if (!xml) return (0);
attr = xml->attrs;
if (!attr) return (0);
if (!attr->value) return (0);
if (!strlen (attr->value)) return (0);
cursize = attr->valsize;
curptr = 0;
buffer = (char *) MALLOC (cursize);
*buffer = '\0';
mark = attr->value;
do {
mark2 = mark; while (*mark2 && (*mark2 & 0x007F == *mark2)) mark2++;
if (*mark2) {
count++;
buffer = _xml_string_tackonn (buffer, &cursize, &curptr, mark, mark2 - mark);
valbuf[0] = 0xC0 + (*(unsigned char *) mark2) / 64;
valbuf[1] = 0x80 + (unsigned int) (*mark2 & 0x3F);
buffer = _xml_string_tackonn (buffer, &cursize, &curptr, valbuf, 2);
mark = mark2 + 1;
} else {
buffer = _xml_string_tackon (buffer, &cursize, &curptr, mark, 0);
}
} while (*mark2);
FREE (attr->value);
attr->value = buffer;
attr->valsize = cursize;
return (count);
}
|