summaryrefslogtreecommitdiffstats
path: root/src/xmlpythonizer.c
diff options
context:
space:
mode:
authorDavid Sommerseth <davids@redhat.com>2009-04-30 16:07:43 +0200
committerDavid Sommerseth <davids@redhat.com>2009-04-30 16:07:43 +0200
commitcea1270777d0a5bd42284011307fe183a67f8ada (patch)
tree484fe523e3d8ccb36aa0bd6ba437926b3b6ab7c2 /src/xmlpythonizer.c
parent6453a1131547b71c4a21a978fd9588d67d056233 (diff)
downloadpython-dmidecode-cea1270777d0a5bd42284011307fe183a67f8ada.tar.gz
python-dmidecode-cea1270777d0a5bd42284011307fe183a67f8ada.tar.xz
python-dmidecode-cea1270777d0a5bd42284011307fe183a67f8ada.zip
Rewritten dmixml_GetXPathContent(...) and _get_key_value(...)
This rewrite was to handle XPATH_NUMBER more correctly. Now these functions needs an preallocated memory buffer for the result.
Diffstat (limited to 'src/xmlpythonizer.c')
-rw-r--r--src/xmlpythonizer.c69
1 files changed, 43 insertions, 26 deletions
diff --git a/src/xmlpythonizer.c b/src/xmlpythonizer.c
index 0b6c54e..6287ea2 100644
--- a/src/xmlpythonizer.c
+++ b/src/xmlpythonizer.c
@@ -333,29 +333,36 @@ xmlXPathObject *_get_xpath_values(xmlXPathContext *xpctx, const char *xpath) {
return xp_obj;
}
-inline char *_get_key_value(ptzMAP *map_p, xmlXPathContext *xpctx, int idx) {
- char *key = NULL;
+char *_get_key_value(char *key, size_t buflen, ptzMAP *map_p, xmlXPathContext *xpctx, int idx) {
xmlXPathObject *xpobj = NULL;
+ memset(key, 0, buflen);
+
switch( map_p->type_key ) {
case ptzCONST:
- key = map_p->key;
+ strncpy(key, map_p->key, buflen-1);
break;
case ptzSTR:
case ptzINT:
case ptzFLOAT:
xpobj = _get_xpath_values(xpctx, map_p->key);
- key = dmixml_GetXPathContent(xpobj, idx);
- if( xpobj != NULL ) {
+ if( xpobj == NULL ) {
+ return NULL;
+ }
+ if( dmixml_GetXPathContent(key, buflen, xpobj, idx) == NULL ) {
xmlXPathFreeObject(xpobj);
+ return NULL;
}
+ xmlXPathFreeObject(xpobj);
break;
default:
fprintf(stderr, "Unknown key type: %i\n", map_p->type_key);
- break;
+ return NULL;
}
+ // We consider to have a key, if the first byte is a readable
+ // character (usually starting at 0x20/32d)
return key;
}
@@ -368,29 +375,34 @@ inline char *_get_key_value(ptzMAP *map_p, xmlXPathContext *xpctx, int idx) {
inline void _add_xpath_result(PyObject *pydat, xmlXPathContext *xpctx, ptzMAP *map_p, xmlXPathObject *value) {
int i = 0;
char *key = NULL;
+ char *val = NULL;
assert( pydat != NULL && value != NULL );
+ key = (char *) malloc(258);
+ assert( key != NULL );
+
+ val = (char *) malloc(4098);
+ assert( val != NULL );
+
switch( value->type ) {
case XPATH_NODESET:
for( i = 0; i < value->nodesetval->nodeNr; i++ ) {
- key = _get_key_value(map_p, xpctx, i);
- if( key != NULL ) {
- char *val = NULL;
- val = dmixml_GetXPathContent(value, i);
+ if( _get_key_value(key, 256, map_p, xpctx, i) != NULL ) {
+ dmixml_GetXPathContent(val, 4097, value, i);
PyADD_DICT_VALUE(pydat, key, StringToPyObj(map_p->type_value, val));
}
}
break;
default:
- key = _get_key_value(map_p, xpctx, 0);
- if( key != NULL ) {
- char *val = NULL;
- val = dmixml_GetXPathContent(value, 0);
+ if( _get_key_value(key, 256, map_p, xpctx, 0) != NULL ) {
+ dmixml_GetXPathContent(val, 4097, value, 0);
PyADD_DICT_VALUE(pydat, key, StringToPyObj(map_p->type_value, val));
}
break;
}
+ free(key);
+ free(val);
}
// Internal XML parser routine, which traverses the given mapping table,
@@ -399,18 +411,20 @@ PyObject *_do_pythonizeXML(ptzMAP *in_map, xmlXPathContext *xpctx, int lvl) {
ptzMAP *map_p = NULL;
PyObject *retdata = NULL;
int i = 0;
+ char *key = NULL;
+
+ key = (char *) malloc(258);
+ assert( key != NULL );
retdata = PyDict_New();
for( map_p = in_map; map_p != NULL; map_p = map_p->next ) {
xmlXPathObject *xpobj = NULL;
- char *key = NULL;
PyObject *value = NULL;
// Get 'value' value
switch( map_p->type_value ) {
case ptzCONST:
- key = _get_key_value(map_p, xpctx, 0);
- if( key != NULL ) {
+ if( _get_key_value(key, 256, map_p, xpctx, 0) != NULL ) {
value = PyString_FromString(map_p->value);
PyADD_DICT_VALUE(retdata, key, value);
}
@@ -434,21 +448,23 @@ PyObject *_do_pythonizeXML(ptzMAP *in_map, xmlXPathContext *xpctx, int lvl) {
xpobj = _get_xpath_values(xpctx, map_p->value);
value = PyList_New(0);
if( xpobj != NULL ) {
- for( i = 0; i < xpobj->nodesetval->nodeNr; i++ ) {
- char *valstr = dmixml_GetXPathContent(xpobj, i);
- PyList_Append(value, StringToPyObj(map_p->type_value, valstr));
- free(valstr);
+ if( _get_key_value(key, 256, map_p, xpctx, 0) != NULL ) {
+ for( i = 0; i < xpobj->nodesetval->nodeNr; i++ ) {
+ char *valstr = NULL;
+ valstr = (char *) malloc(4098);
+ dmixml_GetXPathContent(valstr, 4097, xpobj, i);
+ PyList_Append(value, StringToPyObj(map_p->type_value, valstr));
+ free(valstr);
+ }
+ xmlXPathFreeObject(xpobj);
+ PyADD_DICT_VALUE(retdata, key, value);
}
- xmlXPathFreeObject(xpobj);
- key = _get_key_value(map_p, xpctx, 0);
- PyADD_DICT_VALUE(retdata, key, value);
}
break;
case ptzDICT:
// Traverse the children to get the value of this element
- key = _get_key_value(map_p, xpctx, 0);
- if( key != NULL ) {
+ if( _get_key_value(key, 256, map_p, xpctx, 0) != NULL ) {
value = _do_pythonizeXML(map_p->child, xpctx, lvl+1);
Py_DECREF(value);
PyADD_DICT_VALUE(retdata, key, value);
@@ -461,6 +477,7 @@ PyObject *_do_pythonizeXML(ptzMAP *in_map, xmlXPathContext *xpctx, int lvl) {
break;
}
}
+ free(key);
Py_INCREF(retdata);
return retdata;
}