summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Sommerseth <davids@redhat.com>2009-06-15 18:39:49 +0200
committerDavid Sommerseth <davids@redhat.com>2009-06-15 18:39:49 +0200
commit655799b06376c503086e43a0225298d170e08dbf (patch)
tree011f0b886a2a82441951cc30d96a73f1cfc9f8e2
parente9a6b7f9ec31c1227be982fb8f2bb0ee8bf97710 (diff)
downloadpython-dmidecode-655799b06376c503086e43a0225298d170e08dbf.tar.gz
python-dmidecode-655799b06376c503086e43a0225298d170e08dbf.tar.xz
python-dmidecode-655799b06376c503086e43a0225298d170e08dbf.zip
Added new function: dmixml_FindNodeByAttr_NoCase(...)
This function will ignore the case of the string of the value to be found. This improves the behaviour mentioned in commit 20030e42b4d3f7283f6143641cb009a8dbf1da24. At the moment, the immediate advantage is that the pymap.xml is not strictly bound to if the type IDs in hex are in upper and/or lower case. Both cases and mixed cases will now work.
-rw-r--r--src/dmixml.c16
-rw-r--r--src/dmixml.h35
-rw-r--r--src/xmlpythonizer.c2
3 files changed, 46 insertions, 7 deletions
diff --git a/src/dmixml.c b/src/dmixml.c
index 1092872..5d9f1a1 100644
--- a/src/dmixml.c
+++ b/src/dmixml.c
@@ -213,20 +213,24 @@ char *dmixml_GetAttrValue(xmlNode *node, const char *key) {
}
/**
- * Retrieve a pointer to an XML node based on tag name and a specified attribute value. To get
- * a hit, tag name and the attribute must be found and the value of the attribute must match as well.
- * The function will traverse all children nodes of the given input node, but it will not go deeper.
+ * Internal function - Retrieve a pointer to an XML node based on tag name and a specified attribute
+ * value. To get a hit, tag name and the attribute must be found and the value of the attribute must
+ * match as well. The function will traverse all children nodes of the given input node, but it will
+ * not go deeper.
* @author David Sommerseth <davids@redhat.com>
* @author Nima Talebi <nima@autonomy.net.au>
* @param xmlNode* Pointer to the XML node of where to start searching
* @param const char* Tag name the function will search for
* @param const char* Attribute to check for in the tag
* @param const char* Value of the attribute which must match to have a hit
+ * @param int Be case sensitive or not. 1 == case sensitive, 0 == case insensitive
* @return xmlNode* Pointer to the found XML node, NULL if no tag was found.
*/
-xmlNode *dmixml_FindNodeByAttr(xmlNode *node, const char *tagkey, const char *attrkey, const char *val) {
+xmlNode *__dmixml_FindNodeByAttr(xmlNode *node, const char *tagkey, const char *attrkey,
+ const char *val, int casesens) {
xmlNode *ptr_n = NULL;
xmlChar *tag_s = NULL;
+ int (*compare_func) (const char *, const char *);
assert( node != NULL );
if( node->children == NULL ) {
@@ -236,12 +240,14 @@ xmlNode *dmixml_FindNodeByAttr(xmlNode *node, const char *tagkey, const char *at
tag_s = xmlCharStrdup(tagkey);
assert( tag_s != NULL );
+ compare_func = (casesens == 1 ? strcmp : strcasecmp);
+
foreach_xmlnode(node->children, ptr_n) {
// To return the correct node, we need to check node type,
// tag name and the attribute value of the given attribute.
if( (ptr_n->type == XML_ELEMENT_NODE)
&& (xmlStrcmp(ptr_n->name, tag_s) == 0)
- && (strcmp(dmixml_GetAttrValue(ptr_n, attrkey), val) == 0 ) ) {
+ && (compare_func(dmixml_GetAttrValue(ptr_n, attrkey), val) == 0 ) ) {
goto exit;
}
}
diff --git a/src/dmixml.h b/src/dmixml.h
index c78d8b0..3dc32e5 100644
--- a/src/dmixml.h
+++ b/src/dmixml.h
@@ -37,7 +37,40 @@ xmlNode *dmixml_AddTextChild(xmlNode *node, const char *tagname, const char *fmt
xmlNode *dmixml_AddTextContent(xmlNode *node, const char *fmt, ...);
char *dmixml_GetAttrValue(xmlNode *node, const char *key);
-xmlNode *dmixml_FindNodeByAttr(xmlNode *node, const char *tagkey, const char *attrkey, const char *val);
+
+xmlNode *__dmixml_FindNodeByAttr(xmlNode *, const char *, const char *, const char *, int);
+
+/**
+ * Retrieve a pointer to an XML node based on tag name and a specified attribute value. To get
+ * a hit, tag name and the attribute must be found and the value of the attribute must match as well.
+ * The function will traverse all children nodes of the given input node, but it will not go deeper.
+ * Matching is case sensitive.
+ * @author David Sommerseth <davids@redhat.com>
+ * @author Nima Talebi <nima@autonomy.net.au>
+ * @param xmlNode* Pointer to the XML node of where to start searching
+ * @param const char* Tag name the function will search for
+ * @param const char* Attribute to check for in the tag
+ * @param const char* Value of the attribute which must match to have a hit
+ * @return xmlNode* Pointer to the found XML node, NULL if no tag was found.
+ */
+#define dmixml_FindNodeByAttr(n, t, a, v) __dmixml_FindNodeByAttr(n, t, a, v, 1)
+
+/**
+ * Retrieve a pointer to an XML node based on tag name and a specified attribute value. To get
+ * a hit, tag name and the attribute must be found and the value of the attribute must match as well.
+ * The function will traverse all children nodes of the given input node, but it will not go deeper.
+ * Matching is case INsensitive.
+ * @author David Sommerseth <davids@redhat.com>
+ * @author Nima Talebi <nima@autonomy.net.au>
+ * @param xmlNode* Pointer to the XML node of where to start searching
+ * @param const char* Tag name the function will search for
+ * @param const char* Attribute to check for in the tag
+ * @param const char* Value of the attribute which must match to have a hit
+ * @return xmlNode* Pointer to the found XML node, NULL if no tag was found.
+ */
+#define dmixml_FindNodeByAttr_NoCase(n, t, a, v) __dmixml_FindNodeByAttr(n, t, a, v, 0)
+
+
xmlNode *dmixml_FindNode(xmlNode *, const char *key);
inline char *dmixml_GetContent(xmlNode *node);
inline char *dmixml_GetNodeContent(xmlNode *node, const char *key);
diff --git a/src/xmlpythonizer.c b/src/xmlpythonizer.c
index a9282e2..47590dd 100644
--- a/src/xmlpythonizer.c
+++ b/src/xmlpythonizer.c
@@ -458,7 +458,7 @@ ptzMAP *_dmimap_parse_mapping_node_typeid(xmlNode *mapnode, const char *typeid)
assert( mapnode != NULL);
// Find the <TypeMap> tag with our type ID
- node = dmixml_FindNodeByAttr(mapnode, "TypeMap", "id", typeid);
+ node = dmixml_FindNodeByAttr_NoCase(mapnode, "TypeMap", "id", typeid);
if( node == NULL ) {
// No exception handling possible here, as we don't return PyObject
fprintf(stderr,"** WARNING: Could not find any XML->Python "