UefiDecompress(\r
PyObject *Self,\r
PyObject *Args\r
- ) \r
+ )\r
{\r
- PyTypeObject *SrcData;\r
+ PyObject *SrcData;\r
UINT32 SrcDataSize;\r
UINT32 DstDataSize;\r
UINTN Status;\r
\r
Status = PyArg_ParseTuple(\r
Args,\r
- "0ii",\r
+ "Oi",\r
&SrcData,\r
- &SrcDataSize,\r
- &DstDataSize\r
+ &SrcDataSize\r
);\r
if (Status == 0) {\r
return NULL;\r
}\r
\r
- if (SrcData->tp_as_buffer == NULL\r
- || SrcData->tp_as_buffer->bf_getreadbuffer == NULL\r
- || SrcData->tp_as_buffer->bf_getsegcount == NULL) {\r
+ if (SrcData->ob_type->tp_as_buffer == NULL\r
+ || SrcData->ob_type->tp_as_buffer->bf_getreadbuffer == NULL\r
+ || SrcData->ob_type->tp_as_buffer->bf_getsegcount == NULL) {\r
+ PyErr_SetString(PyExc_Exception, "First argument is not a buffer\n");\r
return NULL;\r
}\r
\r
// Because some Python objects which support "buffer" protocol have more than one\r
// memory segment, we have to copy them into a contiguous memory.\r
- SrcBuf = malloc(SrcDataSize);\r
- DstBuf = malloc(DstDataSize);\r
- if (SrcBuf == NULL || DstBuf == NULL) {\r
+ SrcBuf = PyMem_Malloc(SrcDataSize);\r
+ if (SrcBuf == NULL) {\r
+ PyErr_SetString(PyExc_Exception, "Not enough memory\n");\r
goto ERROR;\r
}\r
\r
- SegNum = SrcData->tp_as_buffer->bf_getsegcount((PyObject *)SrcData, NULL);\r
+ SegNum = SrcData->ob_type->tp_as_buffer->bf_getsegcount((PyObject *)SrcData, NULL);\r
TmpBuf = SrcBuf;\r
for (Index = 0; Index < SegNum; ++Index) {\r
VOID *BufSeg;\r
Py_ssize_t Len;\r
\r
- Len = SrcData->tp_as_buffer->bf_getreadbuffer((PyObject *)SrcData, Index, &BufSeg);\r
+ Len = SrcData->ob_type->tp_as_buffer->bf_getreadbuffer((PyObject *)SrcData, Index, &BufSeg);\r
if (Len < 0) {\r
+ PyErr_SetString(PyExc_Exception, "Buffer segment is not available\n");\r
goto ERROR;\r
}\r
memcpy(TmpBuf, BufSeg, Len);\r
TmpBuf += Len;\r
}\r
\r
- Status = Extract((VOID *)SrcBuf, SrcDataSize, (VOID *)DstBuf, DstDataSize, 1);\r
+ Status = Extract((VOID *)SrcBuf, SrcDataSize, (VOID **)&DstBuf, &DstDataSize, 1);\r
if (Status != EFI_SUCCESS) {\r
+ PyErr_SetString(PyExc_Exception, "Failed to decompress\n");\r
goto ERROR;\r
}\r
\r
PyObject *Args\r
)\r
{\r
- PyTypeObject *SrcData;\r
+ PyObject *SrcData;\r
UINT32 SrcDataSize;\r
UINT32 DstDataSize;\r
UINTN Status;\r
\r
Status = PyArg_ParseTuple(\r
Args,\r
- "0ii",\r
+ "Oi",\r
&SrcData,\r
- &SrcDataSize,\r
- &DstDataSize\r
+ &SrcDataSize\r
);\r
if (Status == 0) {\r
return NULL;\r
}\r
\r
- if (SrcData->tp_as_buffer == NULL\r
- || SrcData->tp_as_buffer->bf_getreadbuffer == NULL\r
- || SrcData->tp_as_buffer->bf_getsegcount == NULL) {\r
+ if (SrcData->ob_type->tp_as_buffer == NULL\r
+ || SrcData->ob_type->tp_as_buffer->bf_getreadbuffer == NULL\r
+ || SrcData->ob_type->tp_as_buffer->bf_getsegcount == NULL) {\r
+ PyErr_SetString(PyExc_Exception, "First argument is not a buffer\n");\r
return NULL;\r
}\r
\r
// Because some Python objects which support "buffer" protocol have more than one\r
// memory segment, we have to copy them into a contiguous memory.\r
- SrcBuf = malloc(SrcDataSize);\r
- DstBuf = malloc(DstDataSize);\r
- if (SrcBuf == NULL || DstBuf == NULL) {\r
+ SrcBuf = PyMem_Malloc(SrcDataSize);\r
+ if (SrcBuf == NULL) {\r
+ PyErr_SetString(PyExc_Exception, "Not enough memory\n");\r
goto ERROR;\r
}\r
\r
- SegNum = SrcData->tp_as_buffer->bf_getsegcount((PyObject *)SrcData, NULL);\r
+ SegNum = SrcData->ob_type->tp_as_buffer->bf_getsegcount((PyObject *)SrcData, NULL);\r
TmpBuf = SrcBuf;\r
for (Index = 0; Index < SegNum; ++Index) {\r
VOID *BufSeg;\r
Py_ssize_t Len;\r
\r
- Len = SrcData->tp_as_buffer->bf_getreadbuffer((PyObject *)SrcData, Index, &BufSeg);\r
+ Len = SrcData->ob_type->tp_as_buffer->bf_getreadbuffer((PyObject *)SrcData, Index, &BufSeg);\r
if (Len < 0) {\r
+ PyErr_SetString(PyExc_Exception, "Buffer segment is not available\n");\r
goto ERROR;\r
}\r
memcpy(TmpBuf, BufSeg, Len);\r
TmpBuf += Len;\r
}\r
\r
- Status = Extract((VOID *)SrcBuf, SrcDataSize, (VOID *)DstBuf, DstDataSize, 2);\r
+ Status = Extract((VOID *)SrcBuf, SrcDataSize, (VOID **)&DstBuf, &DstDataSize, 2);\r
if (Status != EFI_SUCCESS) {\r
+ PyErr_SetString(PyExc_Exception, "Failed to decompress\n");\r
goto ERROR;\r
}\r
\r
- return PyBuffer_FromMemory(DstBuf, (Py_ssize_t)DstDataSize);\r
+ return PyString_FromStringAndSize((CONST INT8*)DstBuf, (Py_ssize_t)DstDataSize);\r
\r
ERROR:\r
if (SrcBuf != NULL) {\r
return NULL;\r
}\r
\r
+\r
STATIC\r
PyObject*\r
UefiCompress(\r
PyObject *Self,\r
PyObject *Args\r
- ) \r
+ )\r
{\r
return NULL;\r
}\r