Changed the interface parameters
[people/mcb30/basetools.git] / Source / C / PyEfiCompressor / EfiCompressor.c
index 39569e4..38a81c3 100644 (file)
@@ -8,62 +8,62 @@ STATIC
 PyObject*\r
 UefiDecompress(\r
   PyObject    *Self,\r
-  PyObject    *Args,\r
-  PyObject    *Keywords\r
-  ) \r
+  PyObject    *Args\r
+  )\r
 {\r
-  PyTypeObject  *SrcData;\r
+  PyObject      *SrcData;\r
   UINT32        SrcDataSize;\r
   UINT32        DstDataSize;\r
-  UINT          Status;\r
+  UINTN         Status;\r
   UINT8         *SrcBuf;\r
   UINT8         *DstBuf;\r
   UINT8         *TmpBuf;\r
   Py_ssize_t    SegNum;\r
   Py_ssize_t    Index;\r
 \r
-  Status = PyArg_ParseTupleAndKeywords(\r
+  Status = PyArg_ParseTuple(\r
             Args,\r
-            Keywords,\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(SrcData, NULL);\r
-  TmpBuf = SrcBuf\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(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
@@ -85,66 +85,66 @@ STATIC
 PyObject*\r
 FrameworkDecompress(\r
   PyObject    *Self,\r
-  PyObject    *Args,\r
-  PyObject    *Keywords\r
+  PyObject    *Args\r
   )\r
 {\r
-  PyTypeObject  *SrcData;\r
+  PyObject      *SrcData;\r
   UINT32        SrcDataSize;\r
   UINT32        DstDataSize;\r
-  UINT          Status;\r
+  UINTN         Status;\r
   UINT8         *SrcBuf;\r
   UINT8         *DstBuf;\r
   UINT8         *TmpBuf;\r
   Py_ssize_t    SegNum;\r
   Py_ssize_t    Index;\r
 \r
-  Status = PyArg_ParseTupleAndKeywords(\r
+  Status = PyArg_ParseTuple(\r
             Args,\r
-            Keywords,\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(SrcData, NULL);\r
-  TmpBuf = SrcBuf\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(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
@@ -157,13 +157,13 @@ ERROR:
   return NULL;\r
 }\r
 \r
+\r
 STATIC\r
 PyObject*\r
 UefiCompress(\r
   PyObject    *Self,\r
-  PyObject    *Args,\r
-  PyObject    *Keywords\r
-  ) \r
+  PyObject    *Args\r
+  )\r
 {\r
   return NULL;\r
 }\r
@@ -173,26 +173,25 @@ STATIC
 PyObject*\r
 FrameworkCompress(\r
   PyObject    *Self,\r
-  PyObject    *Args,\r
-  PyObject    *Keywords\r
+  PyObject    *Args\r
   )\r
 {\r
   return NULL;\r
 }\r
 \r
-STATIC CHAR DecompressDocs[] = "Decompress(): Decompress data using UEFI standard algorithm\n";\r
-STATIC CHAR CompressDocs[] = "Compress(): Compress data using UEFI standard algorithm\n";\r
+STATIC INT8 DecompressDocs[] = "Decompress(): Decompress data using UEFI standard algorithm\n";\r
+STATIC INT8 CompressDocs[] = "Compress(): Compress data using UEFI standard algorithm\n";\r
 \r
 STATIC PyMethodDef EfiCompressor_Funcs[] = {\r
-  {"UefiDecompress", (PyCFunction)UefiDecompress, METH_KEYWORDS, DecompressDocs},\r
-  {"UefiCompress", (PyCFunction)UefiCompress, METH_KEYWORDS, DecompressDocs},\r
-  {"FrameworkDecompress", (PyCFunction)FrameworkDecompress, METH_KEYWORDS, DecompressDocs},\r
-  {"FrameworkCompress", (PyCFunction)FrameworkCompress, METH_KEYWORDS, DecompressDocs},\r
+  {"UefiDecompress", (PyCFunction)UefiDecompress, METH_VARARGS, DecompressDocs},\r
+  {"UefiCompress", (PyCFunction)UefiCompress, METH_VARARGS, DecompressDocs},\r
+  {"FrameworkDecompress", (PyCFunction)FrameworkDecompress, METH_VARARGS, DecompressDocs},\r
+  {"FrameworkCompress", (PyCFunction)FrameworkCompress, METH_VARARGS, DecompressDocs},\r
   {NULL, NULL, 0, NULL}\r
 };\r
 \r
 PyMODINIT_FUNC\r
-InitEfiCompressor(VOID) {\r
+initEfiCompressor(VOID) {\r
   Py_InitModule3("EfiCompressor", EfiCompressor_Funcs, "EFI Compression Algorithm Extension Module");\r
 }\r
 \r