|
XMLAPI void xml_set (XML * xml, const char * name, const char * value)
{
ATTR * attr;
char * holder;
if (!xml) return;
if (!value) value = "";
attr = xml->attrs;
while (attr) {
if (!strcmp (attr->name, name)) break;
attr = attr->next;
}
if (attr) {
holder = xml_strdup (value);
FREE ((void *) (attr->value));
attr->value = holder;
attr->valsize = strlen (value) + 1;
return;
}
if (xml->attrs == NULL) {
attr = (ATTR *) MALLOC (sizeof (struct _attr));
xml->attrs = attr;
} else {
attr = xml->attrs;
while (attr->next) attr = attr->next;
attr->next = (ATTR *) MALLOC (sizeof (struct _attr));
attr = attr->next;
}
attr->next = NULL;
attr->name = xml_strdup (name);
if (value) {
attr->value = xml_strdup (value);
attr->valsize = strlen (value) + 1;
} else {
attr->value = xml_strdup ("");
attr->valsize = 1;
}
}
XMLAPI void xml_setf (XML * xml, const char *name, const char *format, ...)
{
ATTR * attr;
va_list args;
char * value;
if (!xml) return;
va_start (args, format);
value = xml_string_formatv (format, args);
va_end (args);
attr = xml->attrs;
while (attr) {
if (!strcmp (attr->name, name)) break;
attr = attr->next;
}
if (attr) {
FREE ((void *) (attr->value));
attr->value = value;
attr->valsize = 0;
return;
}
if (xml->attrs == NULL) {
attr = (ATTR *) MALLOC (sizeof (struct _attr));
xml->attrs = attr;
} else {
attr = xml->attrs;
while (attr->next) attr = attr->next;
attr->next = (ATTR *) MALLOC (sizeof (struct _attr));
attr = attr->next;
}
attr->next = NULL;
attr->name = xml_strdup (name);
attr->value = value;
attr->valsize = 0;
}
XMLAPI void xml_setnum (XML * xml, const char *attr, int number)
{
char buf[sizeof(number) * 3 + 1];
sprintf (buf, "%d", number);
xml_set (xml, attr, buf);
}
XMLAPI void xml_set_nodup (XML * xml, const char * name, char * value)
{
ATTR * attr;
if (!xml) return;
if (!value) {
xml_set (xml, name, "");
return;
}
attr = xml->attrs;
while (attr) {
if (!strcmp (attr->name, name)) break;
attr = attr->next;
}
if (attr) {
FREE ((void *) (attr->value));
attr->value = value;
attr->valsize = 0;
return;
}
if (xml->attrs == NULL) {
attr = (ATTR *) MALLOC (sizeof (struct _attr));
xml->attrs = attr;
} else {
attr = xml->attrs;
while (attr->next) attr = attr->next;
attr->next = (ATTR *) MALLOC (sizeof (struct _attr));
attr = attr->next;
}
attr->next = NULL;
attr->name = xml_strdup (name);
if (value) {
attr->value = value;
attr->valsize = 0;
} else {
attr->value = xml_strdup (value);
attr->valsize = 1;
}
}
XMLAPI void xml_attrcat (XML * xml, const char * name, const char * value)
{
ATTR * attr;
int len;
attr = xml->attrs;
while (attr) {
if (!strcmp (attr->name, name)) break;
attr = attr->next;
}
if (!attr) xml_set (xml, name, value);
else {
if (value) {
len = strlen (attr->value) + strlen (value) + 1;
if (len > attr->valsize) {
while (attr->valsize < len) attr->valsize += 256;
attr->value = (char *) REALLOC (attr->value, attr->valsize);
}
strcat (attr->value, value);
}
}
}
XMLAPI void xml_attrncat (XML * xml, const char * name, const char * value, int length)
{
ATTR * attr;
int len;
attr = xml->attrs;
while (attr) {
if (!strcmp (attr->name, name)) break;
attr = attr->next;
}
if (!attr) {
xml_set (xml, name, "");
attr = xml->attrs;
while (attr) {
if (!strcmp (attr->name, name)) break;
attr = attr->next;
}
}
if (!attr) return; /* This is probably a dumb way to handle low-mem situations, but... */
if (value) {
len = strlen (attr->value) + length + 1;
if (len > attr->valsize) {
while (attr->valsize < len) attr->valsize += 256;
attr->value = (char *) REALLOC (attr->value, attr->valsize);
}
strncat (attr->value, value, length);
}
}
XMLAPI void xml_unset (XML * xml, const char * name)
{
ATTR * prev;
ATTR * attr;
attr = xml->attrs;
prev = NULL;
while (attr) {
if (attr->name && !strcmp (attr->name, name)) break;
prev = attr;
attr = attr->next;
}
if (!attr) return;
if (prev) prev->next = attr->next;
else xml->attrs = attr->next;
FREE ((void *) (attr->value));
FREE ((void *) (attr));
}
|