summaryrefslogtreecommitdiff
path: root/BaseTools/Source/C/PyUtility
diff options
context:
space:
mode:
Diffstat (limited to 'BaseTools/Source/C/PyUtility')
-rw-r--r--BaseTools/Source/C/PyUtility/Makefile12
-rw-r--r--BaseTools/Source/C/PyUtility/PyUtility.c92
-rw-r--r--BaseTools/Source/C/PyUtility/setup.py42
3 files changed, 146 insertions, 0 deletions
diff --git a/BaseTools/Source/C/PyUtility/Makefile b/BaseTools/Source/C/PyUtility/Makefile
new file mode 100644
index 0000000000..8f50ae1aeb
--- /dev/null
+++ b/BaseTools/Source/C/PyUtility/Makefile
@@ -0,0 +1,12 @@
+!INCLUDE ..\Makefiles\ms.common
+
+APPNAME = GenSec
+
+LIBS = $(LIB_PATH)\Common.lib
+
+OBJECTS = PyUtility.obj
+
+#CFLAGS = $(CFLAGS) /nodefaultlib:libc.lib
+
+!INCLUDE ..\Makefiles\ms.app
+
diff --git a/BaseTools/Source/C/PyUtility/PyUtility.c b/BaseTools/Source/C/PyUtility/PyUtility.c
new file mode 100644
index 0000000000..f06cb9222d
--- /dev/null
+++ b/BaseTools/Source/C/PyUtility/PyUtility.c
@@ -0,0 +1,92 @@
+#include <Python.h>
+#include <Windows.h>
+#include <Common/UefiBaseTypes.h>
+
+/*
+ SaveFileToDisk(FilePath, Content)
+*/
+STATIC
+PyObject*
+SaveFileToDisk (
+ PyObject *Self,
+ PyObject *Args
+ )
+{
+ CHAR8 *File;
+ UINT8 *Data;
+ UINTN DataLength;
+ UINTN WriteBytes;
+ UINTN Status;
+ HANDLE FileHandle;
+ PyObject *ReturnValue = Py_False;
+
+ Status = PyArg_ParseTuple(
+ Args,
+ "ss#",
+ &File,
+ &Data,
+ &DataLength
+ );
+ if (Status == 0) {
+ return NULL;
+ }
+
+ FileHandle = CreateFile(
+ File,
+ GENERIC_WRITE,
+ FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_SHARE_DELETE,
+ NULL,
+ CREATE_ALWAYS,
+ FILE_ATTRIBUTE_NORMAL,
+ NULL
+ );
+ if (FileHandle == INVALID_HANDLE_VALUE) {
+ PyErr_SetString(PyExc_Exception, "File creation failure");
+ return NULL;
+ }
+
+ while (WriteFile(FileHandle, Data, DataLength, &WriteBytes, NULL)) {
+ if (DataLength <= WriteBytes) {
+ DataLength = 0;
+ break;
+ }
+
+ Data += WriteBytes;
+ DataLength -= WriteBytes;
+ }
+
+ if (DataLength != 0) {
+ // file saved unsuccessfully
+ PyErr_SetString(PyExc_Exception, "File write failure");
+ goto Done;
+ }
+
+ //
+ // Flush buffer may slow down the whole build performance (average 10s slower)
+ //
+ //if (!FlushFileBuffers(FileHandle)) {
+ // PyErr_SetString(PyExc_Exception, "File flush failure");
+ // goto Done;
+ //}
+
+ // success!
+ ReturnValue = Py_True;
+
+Done:
+ CloseHandle(FileHandle);
+ return ReturnValue;
+}
+
+STATIC INT8 SaveFileToDiskDocs[] = "SaveFileToDisk(): Make sure the file is saved to disk\n";
+
+STATIC PyMethodDef PyUtility_Funcs[] = {
+ {"SaveFileToDisk", (PyCFunction)SaveFileToDisk, METH_VARARGS, SaveFileToDiskDocs},
+ {NULL, NULL, 0, NULL}
+};
+
+PyMODINIT_FUNC
+initPyUtility(VOID) {
+ Py_InitModule3("PyUtility", PyUtility_Funcs, "Utilties Module Implemented C Language");
+}
+
+
diff --git a/BaseTools/Source/C/PyUtility/setup.py b/BaseTools/Source/C/PyUtility/setup.py
new file mode 100644
index 0000000000..ff78af3d58
--- /dev/null
+++ b/BaseTools/Source/C/PyUtility/setup.py
@@ -0,0 +1,42 @@
+## @file
+# package and install PyEfiCompressor extension
+#
+# Copyright (c) 2008, Intel Corporation
+#
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+
+##
+# Import Modules
+#
+from distutils.core import setup, Extension
+import os
+
+if 'BASE_TOOLS_PATH' not in os.environ:
+ raise "Please define BASE_TOOLS_PATH to the root of base tools tree"
+
+BaseToolsDir = os.environ['BASE_TOOLS_PATH']
+setup(
+ name="PyUtility",
+ version="0.01",
+ ext_modules=[
+ Extension(
+ 'PyUtility',
+ sources=[
+ 'PyUtility.c'
+ ],
+ include_dirs=[
+ os.path.join(BaseToolsDir, 'Source', 'C', 'Include'),
+ os.path.join(BaseToolsDir, 'Source', 'C', 'Include', 'Ia32'),
+ os.path.join(BaseToolsDir, 'Source', 'C', 'Common')
+ ],
+ )
+ ],
+ )
+