📄 sflxml.c
字号:
xml_prev_sibling (XML_ITEM *item)
{
ASSERT (item);
if ((LIST *) item-> prev != & item-> parent-> children)
return item-> prev;
else
return NULL;
}
/* ---------------------------------------------------------------------[<]-
Function: xml_parent
Synopsis: Returns the parent of the specified item, or NULL if this is
the root item.
---------------------------------------------------------------------[>]-*/
XML_ITEM *
xml_parent (XML_ITEM *item)
{
ASSERT (item);
return (item-> parent);
}
/* ---------------------------------------------------------------------[<]-
Function: xml_put_attr_ic
Synopsis: Sets, modifies, or deletes an attribute for the
specified item. The attribute name must be supplied. If the value is
NULL, the first attribute with the specified name is deleted. Otherwise
it is either created or modified accordingly. If the paramater
'ignore_case' is TRUE, the case of the attribute name is insignificant.
Returns the number of attribute nodes created (-1, 0, or 1).
---------------------------------------------------------------------[>]-*/
int
xml_put_attr_ic (
XML_ITEM *item,
const char *name,
const char *value,
Bool ignore_case)
{
int
feedback = 0;
XML_ATTR
*attr;
ASSERT (item);
ASSERT (name);
attr = xml_attr_ic (item, name, ignore_case);
if (attr)
if (value) /* Value specified - update attr */
{
mem_free (attr-> value);
attr-> value = mem_strdup (value);
}
else
{
xml_free_attr (attr); /* No value - delete attribute */
feedback = -1;
}
else
if (value) /* Value specified - update attr */
{
list_create (attr, sizeof (XML_ATTR));
if (attr)
{
attr-> name = mem_strdup (name);
attr-> value = mem_strdup (value);
attr-> parent = item;
list_relink_before (attr, &item-> attrs);
feedback = 1;
}
}
return (feedback);
}
/* ---------------------------------------------------------------------[<]-
Function: xml_attr_ic
Synopsis: Searches for the attribute with the specified name; if
found, returns the address of the attribute node, otherwise returns
NULL. If the paramater 'ignore_case' is TRUE, the case of the
attribute name is insignificant.
---------------------------------------------------------------------[>]-*/
XML_ATTR *
xml_attr_ic (
XML_ITEM *item,
const char *name,
Bool ignore_case)
{
XML_ATTR
*attr;
ASSERT (item);
ASSERT (name);
if (ignore_case)
{
FORLIST (attr, item-> attrs)
if (attr-> name ? lexcmp (attr-> name, name) == 0 : FALSE)
return (attr);
}
else
{
FORLIST (attr, item-> attrs)
if (attr-> name ? streq (attr-> name, name) : FALSE)
return (attr);
}
return (NULL);
}
/* ---------------------------------------------------------------------[<]-
Function: xml_attr_name
Synopsis: Extracts the name of a specified XML attr. The returned string
should NOT be modified. To manipulate it, first make a copy first.
---------------------------------------------------------------------[>]-*/
char *
xml_attr_name (XML_ATTR *attr)
{
ASSERT (attr);
return attr-> name;
}
/* ---------------------------------------------------------------------[<]-
Function: xml_attr_value
Synopsis: Extracts the value of a specified XML attr. The returned string
should NOT be modified. To manipulate it, first make a copy first.
---------------------------------------------------------------------[>]-*/
char *
xml_attr_value (XML_ATTR *attr)
{
ASSERT (attr);
return attr-> value;
}
/* ---------------------------------------------------------------------[<]-
Function: xml_get_attr_ic
Synopsis: Returns the value for the specified attribute, if it exists.
Otherwise returns the default value. If the paramater 'ignore_case'
is TRUE, the case of the attribute name is insignificant.
---------------------------------------------------------------------[>]-*/
char *
xml_get_attr_ic (
XML_ITEM *item,
const char *name,
const char *deflt,
Bool ignore_case)
{
XML_ATTR
*attr;
ASSERT (item);
ASSERT (name);
attr = xml_attr_ic (item, name, ignore_case);
if (attr)
return (attr-> value);
else
return ((char *) deflt);
}
/* ---------------------------------------------------------------------[<]-
Function: xml_free_attr
Synopsis: Frees all memory used by an XML_ATTR node.
---------------------------------------------------------------------[>]-*/
void
xml_free_attr (
XML_ATTR *attr)
{
ASSERT (attr);
list_unlink (attr);
mem_free (attr-> name);
mem_free (attr-> value);
mem_free (attr);
}
/* ---------------------------------------------------------------------[<]-
Function: xml_first_attr
Synopsis: Returns the first attribute of a specified XML item, or NULL
if there are none.
---------------------------------------------------------------------[>]-*/
XML_ATTR *
xml_first_attr (XML_ITEM *item)
{
ASSERT (item);
if (!list_empty (&item-> attrs))
return item-> attrs. next;
else
return NULL;
}
/* ---------------------------------------------------------------------[<]-
Function: xml_last_attr
Synopsis: Returns the last attribute of a specified XML item, or NULL
if there are none.
---------------------------------------------------------------------[>]-*/
XML_ATTR *
xml_last_attr (XML_ITEM *item)
{
ASSERT (item);
if (!list_empty (&item-> attrs))
return item-> attrs. prev;
else
return NULL;
}
/* ---------------------------------------------------------------------[<]-
Function: xml_next_attr
Synopsis: Returns the next attribute following the specified attribute,
or NULL if there are none.
---------------------------------------------------------------------[>]-*/
XML_ATTR *
xml_next_attr (XML_ATTR *attr)
{
ASSERT (attr);
if ((LIST *) attr-> next != & attr-> parent-> attrs)
return attr-> next;
else
return NULL;
}
/* ---------------------------------------------------------------------[<]-
Function: xml_prev_attr
Synopsis: Returns the previous attribute following the specified
attribute, or NULL if there are none.
---------------------------------------------------------------------[>]-*/
XML_ATTR *
xml_prev_attr (XML_ATTR *attr)
{
ASSERT (attr);
if ((LIST *) attr-> prev != & attr-> parent-> attrs)
return attr-> prev;
else
return NULL;
}
/* ---------------------------------------------------------------------[<]-
Function: xml_changed
Synopsis: Returns TRUE if the XML file loaded into the specified list
has in the meantime been changed. Returns FALSE if not.
---------------------------------------------------------------------[>]-*/
Bool
xml_changed (
XML_ITEM *item)
{
char
*filename;
ASSERT (item);
/* Date, time, and name of original XML file are in the list */
filename = xml_get_attr (item, "filename", NULL);
if (filename
&& file_has_changed (filename,
atol (xml_get_attr (item, "filedate", "0")),
atol (xml_get_attr (item, "filetime", "0"))))
return (TRUE);
else
return (FALSE);
}
/* ---------------------------------------------------------------------[<]-
Function: xml_refresh
Synopsis: Refreshes an XML tree created by xml_load (). If the original
file (as specified by the 'filename' attribute of the root item) has
been modified, reloads the whole XML file. Returns TRUE if the XML file
was actually reloaded, or FALSE if the file had not changed or could not
be accessed, or if the XML tree was incorrectly created.
---------------------------------------------------------------------[>]-*/
Bool
xml_refresh (
XML_ITEM **item)
{
char
*filename,
*pathsym;
int
rc;
ASSERT (item);
ASSERT (*item);
if (xml_changed (*item))
{
pathsym = mem_strdup (xml_get_attr (*item, "pathsym", NULL));
filename = mem_strdup (xml_get_attr (*item, "filename", NULL));
xml_free (*item); /* Delete previous XML tree */
rc = xml_load (item, pathsym, filename);
mem_free (pathsym);
mem_free (filename);
return (rc == XML_NOERROR);
}
return (FALSE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -