|
char * _xml_string_tackon (char * buffer, int * cursize, int * curptr, const char * data)
{
int len;
if (!data) return (buffer);
if (!*data) return (buffer);
len = strlen (data);
if (len + *curptr + 1 > *cursize) {
*cursize += 256;
buffer = (char *) REALLOC ((void *) buffer, *cursize);
}
*curptr += len;
strcat (buffer, data);
return (buffer);
}
char * _xml_string_tackonn (char * buffer, int * cursize, int * curptr, const char * data, int len)
{
if (!len) return (buffer);
if (len + *curptr + 1 > *cursize) {
*cursize += 256;
buffer = (char *) REALLOC ((void *) buffer, *cursize);
}
strncpy (buffer + *curptr, data, len);
*curptr += len;
buffer[*curptr] = '\0';
return (buffer);
}
char * _xml_string_format (const char * format, va_list args)
{
char * buffer = (char *) MALLOC (256);
int cursize = 256;
int curptr = 0;
char * colon;
char * strarg;
int intarg;
char numbuf[sizeof (int) * 3 + 1];
while (colon = strchr (format, '%')) {
buffer = _xml_string_tackonn (buffer, &cursize, &curptr, format, colon - format);
format = colon;
format ++;
switch (*format) {
case 's':
strarg = va_arg (args, char *);
buffer = _xml_string_tackon (buffer, &cursize, &curptr, strarg);
break;
case 'd':
intarg = va_arg (args, int);
sprintf (numbuf, "%d", intarg);
buffer = _xml_string_tackon (buffer, &cursize, &curptr, numbuf);
break;
default:
buffer = _xml_string_tackonn (buffer, &cursize, &curptr, format, 1);
break;
}
format ++;
}
buffer = _xml_string_tackon (buffer, &cursize, &curptr, format);
return (buffer);
}
char * _xml_string_append (char * buffer, int * cursize, int * curptr, XML * xml)
{
ATTR * attr;
ELEMENTLIST * list;
if (xml->name == NULL) {
buffer = _xml_string_tackon (buffer, cursize, curptr, xml->attrs->value);
return (buffer);
}
buffer = _xml_string_tackon (buffer, cursize, curptr, "<");
buffer = _xml_string_tackon (buffer, cursize, curptr, xml->name);
attr = xml->attrs;
while (attr != NULL) {
buffer = _xml_string_tackon (buffer, cursize, curptr, " ");
buffer = _xml_string_tackon (buffer, cursize, curptr, attr->name);
buffer = _xml_string_tackon (buffer, cursize, curptr, "=\"");
buffer = _xml_string_tackon (buffer, cursize, curptr, attr->value);
buffer = _xml_string_tackon (buffer, cursize, curptr, "\"");
attr = attr->next;
}
if (xml->children == NULL) {
buffer = _xml_string_tackon (buffer, cursize, curptr, "/>");
return (buffer);
} else buffer = _xml_string_tackon (buffer, cursize, curptr, ">");
list = xml->children;
while (list) {
buffer = _xml_string_append (buffer, cursize, curptr, list->element);
list = list->next;
}
buffer = _xml_string_tackon (buffer, cursize, curptr, "</");
buffer = _xml_string_tackon (buffer, cursize, curptr, xml->name);
buffer = _xml_string_tackon (buffer, cursize, curptr, ">");
return (buffer);
}
XMLAPI char * xml_string (XML * xml)
{
char * ret;
int cursize;
int curptr;
ret = (char *) MALLOC (256);
*ret = '\0';
cursize = 256;
curptr = 0;
return (_xml_string_append (ret, &cursize, &curptr, xml));
}
XMLAPI char * xml_stringcontent (XML * xml)
{
char * ret;
int cursize;
int curptr;
ELEMENTLIST * list;
ret = (char *) MALLOC (256);
*ret = '\0';
cursize = 256;
curptr = 0;
list = xml->children;
while (list) {
ret = _xml_string_append (ret, &cursize, &curptr, list->element);
list = list->next;
}
return (ret);
}
char * _xml_string_appendhtml (char * buffer, int * cursize, int * curptr, XML * xml)
{
ATTR * attr;
ELEMENTLIST * list;
if (xml->name == NULL) {
buffer = _xml_string_tackon (buffer, cursize, curptr, xml->attrs->value);
return (buffer);
}
buffer = _xml_string_tackon (buffer, cursize, curptr, "<");
buffer = _xml_string_tackon (buffer, cursize, curptr, xml->name);
attr = xml->attrs;
while (attr != NULL) {
buffer = _xml_string_tackon (buffer, cursize, curptr, " ");
buffer = _xml_string_tackon (buffer, cursize, curptr, attr->name);
buffer = _xml_string_tackon (buffer, cursize, curptr, "=\"");
buffer = _xml_string_tackon (buffer, cursize, curptr, attr->value);
buffer = _xml_string_tackon (buffer, cursize, curptr, "\"");
attr = attr->next;
}
buffer = _xml_string_tackon (buffer, cursize, curptr, ">");
if (xml->children == NULL) {
if (!strcmp (xml->name, "p") ||
!strcmp (xml->name, "a")) {
buffer = _xml_string_tackon (buffer, cursize, curptr, "</");
buffer = _xml_string_tackon (buffer, cursize, curptr, xml->name);
buffer = _xml_string_tackon (buffer, cursize, curptr, ">");
}
return (buffer);
}
list = xml->children;
while (list) {
buffer = _xml_string_appendhtml (buffer, cursize, curptr, list->element);
list = list->next;
}
if (!strcmp (xml->name, "li") ||
!strcmp (xml->name, "opt")) {
/* Do nothing. */
} else {
buffer = _xml_string_tackon (buffer, cursize, curptr, "</");
buffer = _xml_string_tackon (buffer, cursize, curptr, xml->name);
buffer = _xml_string_tackon (buffer, cursize, curptr, ">");
}
return (buffer);
}
XMLAPI char * xml_stringhtml (XML * xml)
{
char * ret;
int cursize;
int curptr;
ret = (char *) MALLOC (256);
*ret = '\0';
cursize = 256;
curptr = 0;
return (_xml_string_appendhtml (ret, &cursize, &curptr, xml));
}
XMLAPI char * xml_stringcontenthtml (XML * xml)
{
char * ret;
int cursize;
int curptr;
ELEMENTLIST * list;
ret = (char *) MALLOC (256);
*ret = '\0';
cursize = 256;
curptr = 0;
list = xml->children;
while (list) {
ret = _xml_string_appendhtml (ret, &cursize, &curptr, list->element);
list = list->next;
}
return (ret);
}
|