⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mxml-attr.c

📁 适用于嵌入式系统的XML解析库, 规模比libxml2小得多.
💻 C
字号:
/* * "$Id: mxml-attr.c 308 2007-09-15 20:04:56Z mike $" * * Attribute support code for Mini-XML, a small XML-like file parsing library. * * Copyright 2003-2007 by Michael Sweet. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * Contents: * *   mxmlElementDeleteAttr() - Delete an attribute. *   mxmlElementGetAttr()    - Get an attribute. *   mxmlElementSetAttr()    - Set an attribute. *   mxmlElementSetAttrf()   - Set an attribute with a formatted value. *   mxml_set_attr()         - Set or add an attribute name/value pair. *//* * Include necessary headers... */#include "config.h"#include "mxml.h"/* * Local functions... */static int	mxml_set_attr(mxml_node_t *node, const char *name,		              char *value);/* * 'mxmlElementDeleteAttr()' - Delete an attribute. * * @since Mini-XML 2.4@ */voidmxmlElementDeleteAttr(mxml_node_t *node,/* I - Element */                      const char  *name)/* I - Attribute name */{  int		i;			/* Looping var */  mxml_attr_t	*attr;			/* Cirrent attribute */#ifdef DEBUG  fprintf(stderr, "mxmlElementDeleteAttr(node=%p, name=\"%s\")\n",          node, name ? name : "(null)");#endif /* DEBUG */ /*  * Range check input...  */  if (!node || node->type != MXML_ELEMENT || !name)    return; /*  * Look for the attribute...  */  for (i = node->value.element.num_attrs, attr = node->value.element.attrs;       i > 0;       i --, attr ++)  {#ifdef DEBUG    printf("    %s=\"%s\"\n", attr->name, attr->value);#endif /* DEBUG */    if (!strcmp(attr->name, name))    {     /*      * Delete this attribute...      */      free(attr->name);      free(attr->value);      i --;      if (i > 0)        memmove(attr, attr + 1, i * sizeof(mxml_attr_t));      node->value.element.num_attrs --;      return;    }  }}/* * 'mxmlElementGetAttr()' - Get an attribute. * * This function returns NULL if the node is not an element or the * named attribute does not exist. */const char *				/* O - Attribute value or NULL */mxmlElementGetAttr(mxml_node_t *node,	/* I - Element node */                   const char  *name)	/* I - Name of attribute */{  int		i;			/* Looping var */  mxml_attr_t	*attr;			/* Cirrent attribute */#ifdef DEBUG  fprintf(stderr, "mxmlElementGetAttr(node=%p, name=\"%s\")\n",          node, name ? name : "(null)");#endif /* DEBUG */ /*  * Range check input...  */  if (!node || node->type != MXML_ELEMENT || !name)    return (NULL); /*  * Look for the attribute...  */  for (i = node->value.element.num_attrs, attr = node->value.element.attrs;       i > 0;       i --, attr ++)  {#ifdef DEBUG    printf("    %s=\"%s\"\n", attr->name, attr->value);#endif /* DEBUG */    if (!strcmp(attr->name, name))    {#ifdef DEBUG      printf("    Returning \"%s\"!\n", attr->value);#endif /* DEBUG */      return (attr->value);    }  } /*  * Didn't find attribute, so return NULL...  */#ifdef DEBUG  puts("    Returning NULL!\n");#endif /* DEBUG */  return (NULL);}/* * 'mxmlElementSetAttr()' - Set an attribute. * * If the named attribute already exists, the value of the attribute * is replaced by the new string value. The string value is copied * into the element node. This function does nothing if the node is * not an element. */voidmxmlElementSetAttr(mxml_node_t *node,	/* I - Element node */                   const char  *name,	/* I - Name of attribute */                   const char  *value)	/* I - Attribute value */{  char	*valuec;			/* Copy of value */#ifdef DEBUG  fprintf(stderr, "mxmlElementSetAttr(node=%p, name=\"%s\", value=\"%s\")\n",          node, name ? name : "(null)", value ? value : "(null)");#endif /* DEBUG */ /*  * Range check input...  */  if (!node || node->type != MXML_ELEMENT || !name)    return;  if (value)    valuec = strdup(value);  else    valuec = NULL;  if (mxml_set_attr(node, name, valuec))    free(valuec);}/* * 'mxmlElementSetAttrf()' - Set an attribute with a formatted value. * * If the named attribute already exists, the value of the attribute * is replaced by the new formatted string. The formatted string value is * copied into the element node. This function does nothing if the node * is not an element. * * @since Mini-XML 2.3@ */voidmxmlElementSetAttrf(mxml_node_t *node,	/* I - Element node */                    const char  *name,	/* I - Name of attribute */                    const char  *format,/* I - Printf-style attribute value */		    ...)		/* I - Additional arguments as needed */{  va_list	ap;			/* Argument pointer */  char		*value;			/* Value */#ifdef DEBUG  fprintf(stderr,          "mxmlElementSetAttrf(node=%p, name=\"%s\", format=\"%s\", ...)\n",          node, name ? name : "(null)", format ? format : "(null)");#endif /* DEBUG */ /*  * Range check input...  */  if (!node || node->type != MXML_ELEMENT || !name || !format)    return; /*  * Format the value...  */  va_start(ap, format);  value = _mxml_vstrdupf(format, ap);  va_end(ap);  if (!value)    mxml_error("Unable to allocate memory for attribute '%s' in element %s!",               name, node->value.element.name);  else if (mxml_set_attr(node, name, value))    free(value);}/* * 'mxml_set_attr()' - Set or add an attribute name/value pair. */static int				/* O - 0 on success, -1 on failure */mxml_set_attr(mxml_node_t *node,	/* I - Element node */              const char  *name,	/* I - Attribute name */              char        *value)	/* I - Attribute value */{  int		i;			/* Looping var */  mxml_attr_t	*attr;			/* New attribute */ /*  * Look for the attribute...  */  for (i = node->value.element.num_attrs, attr = node->value.element.attrs;       i > 0;       i --, attr ++)    if (!strcmp(attr->name, name))    {     /*      * Free the old value as needed...      */      if (attr->value)        free(attr->value);      attr->value = value;      return (0);    } /*  * Add a new attribute...  */  if (node->value.element.num_attrs == 0)    attr = malloc(sizeof(mxml_attr_t));  else    attr = realloc(node->value.element.attrs,                   (node->value.element.num_attrs + 1) * sizeof(mxml_attr_t));  if (!attr)  {    mxml_error("Unable to allocate memory for attribute '%s' in element %s!",               name, node->value.element.name);    return (-1);  }  node->value.element.attrs = attr;  attr += node->value.element.num_attrs;  if ((attr->name = strdup(name)) == NULL)  {    mxml_error("Unable to allocate memory for attribute '%s' in element %s!",               name, node->value.element.name);    return (-1);  }  attr->value = value;  node->value.element.num_attrs ++;  return (0);}/* * End of "$Id: mxml-attr.c 308 2007-09-15 20:04:56Z mike $". */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -