summaryrefslogtreecommitdiffstats
path: root/dmidecode.c
diff options
context:
space:
mode:
authornima <nima@abc39116-655e-4be6-ad55-d661dc543056>2008-07-25 23:35:30 +0000
committernima <nima@abc39116-655e-4be6-ad55-d661dc543056>2008-07-25 23:35:30 +0000
commit8671ea0ba8caa35428afeee68efa53671c839815 (patch)
tree9b6990d44ce137d132d90be7e1ee583210118eaf /dmidecode.c
parent3ca138e7776d5356fa6ac1b58101d64b6f3c3fa0 (diff)
downloadpython-dmidecode-8671ea0ba8caa35428afeee68efa53671c839815.tar.gz
python-dmidecode-8671ea0ba8caa35428afeee68efa53671c839815.tar.xz
python-dmidecode-8671ea0ba8caa35428afeee68efa53671c839815.zip
Completed `case 0'.
git-svn-id: svn://svn.autonomy.net.au/python-dmidecode@24 abc39116-655e-4be6-ad55-d661dc543056
Diffstat (limited to 'dmidecode.c')
-rw-r--r--dmidecode.c123
1 files changed, 74 insertions, 49 deletions
diff --git a/dmidecode.c b/dmidecode.c
index ccfae01..dabc47c 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -213,14 +213,13 @@ const char *dmi_dump(struct dmi_header *h, char *_) {
** 3.3.1 BIOS Information (Type 0)
*/
-static const char* dmi_bios_runtime_size(u32 code, char* _) {
- if(code&0x000003FF) sprintf(_, "%u bytes", code);
- else sprintf(_, "%u kB", code>>10);
- return _;
+static PyObject* dmi_bios_runtime_size(u32 code) {
+ if(code&0x000003FF) return PyString_FromFormat("%u bytes", code);
+ else return PyString_FromFormat("%u kB", code>>10);
}
/* 3.3.1.1 */
-static const char* dmi_bios_characteristics(u64 code, char *_) {
+static PyObject* dmi_bios_characteristics(u64 code) {
static const char *characteristics[] = {
"BIOS characteristics not supported", /* 3 */
"ISA is supported",
@@ -253,56 +252,52 @@ static const char* dmi_bios_characteristics(u64 code, char *_) {
"NEC PC-98" /* 31 */
};
- /*
- ** TODO: This isn't very clear what this bit is supposed to mean
- */
+ PyObject *data;
if(code.l&(1<<3)) {
- sprintf(_, characteristics[0]);
+ data = PyString_FromString(characteristics[0]);
} else {
int i;
- catsprintf(_, NULL);
+ data = PyDict_New();
for(i=4; i<=31; i++)
- if(code.l&(1<<i))
- catsprintf(_, "%s|", characteristics[i-3]);
+ PyDict_SetItemString(data, characteristics[i-3], code.l&(1<<i)?Py_True:Py_False);
}
- return _;
+ return data;
}
/* 3.3.1.2.1 */
-static const char* dmi_bios_characteristics_x1(u8 code, char *_) {
+static PyObject* dmi_bios_characteristics_x1(u8 code) {
static const char *characteristics[] = {
- "ACPI is supported", /* 0 */
- "USB legacy is supported",
- "AGP is supported",
- "I2O boot is supported",
- "LS-120 boot is supported",
- "ATAPI Zip drive boot is supported",
- "IEEE 1394 boot is supported",
- "Smart battery is supported" /* 7 */
+ "ACPI", /* 0 */
+ "USB legacy",
+ "AGP",
+ "I2O boot",
+ "LS-120 boot",
+ "ATAPI Zip drive boot",
+ "IEEE 1394 boot",
+ "Smart battery" /* 7 */
};
int i;
- catsprintf(_, NULL);
+ PyObject *data = PyDict_New();
for(i=0; i<=7; i++)
- if(code&(1<<i))
- catsprintf(_, "%s|", characteristics[i]);
- return _;
+ PyDict_SetItemString(data, characteristics[i], code&(1<<i)?Py_True:Py_False);
+ return data;
+
}
/* 3.3.1.2.2 */
-static const char* dmi_bios_characteristics_x2(u8 code, char *_) {
+static PyObject* dmi_bios_characteristics_x2(u8 code) {
static const char *characteristics[]={
- "BIOS boot specification is supported", /* 0 */
- "Function key-initiated network boot is supported",
- "Targeted content distribution is supported" /* 2 */
+ "BIOS boot specification", /* 0 */
+ "Function key-initiated network boot",
+ "Targeted content distribution" /* 2 */
};
int i;
- catsprintf(_, NULL);
+ PyObject *data = PyDict_New();
for(i=0; i<=2; i++)
- if(code&(1<<i))
- catsprintf(_, "%s|", characteristics[i]);
- return _;
+ PyDict_SetItemString(data, characteristics[i], code&(1<<i)?Py_True:Py_False);
+ return data;
}
/*******************************************************************************
@@ -2663,14 +2658,21 @@ void dmi_decode(struct dmi_header *h, u16 ver, PyObject* pydata) {
switch(h->type) {
case 0: /* 3.3.1 BIOS Information */
-
- dmiAppendObject(++minor, "BIOS Information", NULL);
+ NEW_METHOD = 1;
+ caseData = PyDict_New();
if(h->length<0x12) break;
+ _val = dmi_string_py(h, data[0x04]);
+ PyDict_SetItemString(caseData, "Vendor", _val);
+ Py_DECREF(_val);
- dmiAppendObject(++minor, "Vendor", dmi_string(h, data[0x04]));
- dmiAppendObject(++minor, "Version", dmi_string(h, data[0x05]));
- dmiAppendObject(++minor, "Release Date", dmi_string(h, data[0x08]));
+ _val = dmi_string_py(h, data[0x05]);
+ PyDict_SetItemString(caseData, "Version", _val);
+ Py_DECREF(_val);
+
+ _val = dmi_string_py(h, data[0x08]);
+ PyDict_SetItemString(caseData, "Release Date", _val);
+ Py_DECREF(_val);
/*
* On IA-64, the BIOS base address will read 0 because
@@ -2679,24 +2681,47 @@ void dmi_decode(struct dmi_header *h, u16 ver, PyObject* pydata) {
*/
if(WORD(data+0x06)!=0) {
- dmiAppendObject(++minor, "Address", "0x%04X0", WORD(data+0x06));
- dmiAppendObject(++minor, "Runtime Size", dmi_bios_runtime_size((0x10000-WORD(data+0x06))<<4, _));
+ _val = PyString_FromFormat("0x%04X0", WORD(data+0x06));
+ PyDict_SetItemString(caseData, "Address", _val);
+ Py_DECREF(_val);
+
+ _val = dmi_bios_runtime_size((0x10000-WORD(data+0x06))<<4);
+ PyDict_SetItemString(caseData, "Runtime Size", _val);
+ Py_DECREF(_val);
}
- dmiAppendObject(++minor, "ROM Size", "%u kB", (data[0x09]+1)<<6);
- dmiAppendObject(++minor, "Characteristics", dmi_bios_characteristics(QWORD(data+0x0A), _));
+ _val = PyString_FromFormat("%u kB", (data[0x09]+1)<<6);
+ PyDict_SetItemString(caseData, "ROM Size", _val);
+ Py_DECREF(_val);
+
+ //. FIXME
+ _val = dmi_bios_characteristics(QWORD(data+0x0A));
+ PyDict_SetItemString(caseData, "Characteristics", _val);
+ Py_DECREF(_val);
if(h->length<0x13) break;
- dmiAppendObject(++minor, "Characteristics x1", dmi_bios_characteristics_x1(data[0x12], _));
+ _val = dmi_bios_characteristics_x1(data[0x12]);
+ PyDict_SetItemString(caseData, "Characteristics x1", _val);
+ Py_DECREF(_val);
if(h->length<0x14) break;
- dmiAppendObject(++minor, "Characteristics x2", dmi_bios_characteristics_x2(data[0x13], _));
+ _val = dmi_bios_characteristics_x2(data[0x13]);
+ PyDict_SetItemString(caseData, "Characteristics x2", _val);
+ Py_DECREF(_val);
if(h->length<0x18) break;
- if(data[0x14]!=0xFF && data[0x15]!=0xFF)
- dmiAppendObject(++minor, "BIOS Revision", "%u.%u", data[0x14], data[0x15]);
- if(data[0x16]!=0xFF && data[0x17]!=0xFF)
- dmiAppendObject(++minor, "Firmware Revision", "%u.%u", data[0x16], data[0x17]);
+
+ if(data[0x14]!=0xFF && data[0x15]!=0xFF) {
+ _val = PyString_FromFormat("%u.%u", data[0x14], data[0x15]);
+ PyDict_SetItemString(caseData, "BIOS Revision", _val);
+ Py_DECREF(_val);
+ }
+
+ if(data[0x16]!=0xFF && data[0x17]!=0xFF) {
+ _val = PyString_FromFormat("%u.%u", data[0x16], data[0x17]);
+ PyDict_SetItemString(caseData, "Firmware Revision", _val);
+ Py_DECREF(_val);
+ }
break;