]> git.cworth.org Git - apitrace/blobdiff - windows.py
Reorder wglapi's functions to match wgl.spec.
[apitrace] / windows.py
index d9b915b8a72d9f82a9f74137d37113350a8fa636..208961f8bc40a80ede41911f7501dd8cbfd9056c 100644 (file)
@@ -1,42 +1,49 @@
-#############################################################################
+##########################################################################
 #
-# Copyright 2008 Tungsten Graphics, Inc.
+# Copyright 2008-2009 VMware, Inc.
+# All Rights Reserved.
 #
-# This program is free software: you can redistribute it and/or modify it
-# under the terms of the GNU Lesser General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
 #
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
 #
-# You should have received a copy of the GNU Lesser General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
 #
-#############################################################################
+##########################################################################/
 
 """windows.h"""
 
 from base import *
 
-SHORT = Intrinsic("SHORT", "%i")
-USHORT = Intrinsic("USHORT", "%u")
-INT = Intrinsic("INT", "%i")
-UINT = Intrinsic("UINT", "%u")
-LONG = Intrinsic("LONG", "%li")
-ULONG = Intrinsic("ULONG", "%lu")
-FLOAT = Intrinsic("FLOAT", "%f")
+SHORT = Alias("SHORT", Short)
+USHORT = Alias("USHORT", UShort)
+INT = Alias("INT", Int)
+UINT = Alias("UINT", UInt)
+LONG = Alias("LONG", Long)
+ULONG = Alias("ULONG", ULong)
+LONGLONG = Alias("LONGLONG", LongLong)
+FLOAT = Alias("FLOAT", Float)
 
-INT32 = Intrinsic("INT32", "%i")
-UINT32 = Intrinsic("UINT32", "%i")
+INT32 = Literal("INT32", "UInt")
+UINT32 = Literal("UINT32", "UInt")
 
-BYTE = Intrinsic("BYTE", "0x%02lx")
-WORD = Intrinsic("WORD", "0x%04lx")
-DWORD = Intrinsic("DWORD", "0x%08lx")
+BYTE = Literal("BYTE", "UInt", base=16)
+WORD = Literal("WORD", "UInt", base=16)
+DWORD = Literal("DWORD", "UInt", base=16)
 
-BOOL = Intrinsic("BOOL", "%i")
+BOOL = Alias("BOOL", Bool)
 
 LPLONG = Pointer(LONG)
 LPWORD = Pointer(WORD)
@@ -44,19 +51,26 @@ LPDWORD = Pointer(DWORD)
 LPBOOL = Pointer(BOOL)
 LPSIZE = LPDWORD
 
-LPSTR = String
-LPWSTR = String
+LPSTR = CString
+LPCSTR = Const(CString)
+LPWSTR = WString
+LPCWSTR = Const(WString)
 
-LARGE_INTEGER = Intrinsic("LARGE_INTEGER", "0x%llx")
+LARGE_INTEGER = Struct("LARGE_INTEGER", [
+    (LONGLONG, 'QuadPart'),
+])
+
+SIZE_T = Alias("SIZE_T", SizeT)
 
 HRESULT = Alias("HRESULT", Int)
 
-PVOID = Intrinsic("PVOID", "%p")
+VOID = Void
+PVOID = Opaque("PVOID")
 LPVOID = PVOID
-HANDLE = Intrinsic("HANDLE", "%p")
-HWND = Intrinsic("HWND", "%p")
-HDC = Intrinsic("HDC", "%p")
-HMONITOR = Intrinsic("HMONITOR", "%p")
+HANDLE = Opaque("HANDLE")
+HWND = Opaque("HWND")
+HDC = Opaque("HDC")
+HMONITOR = Opaque("HMONITOR")
 
 GUID = Struct("GUID", [
     (DWORD, "Data1"),
@@ -126,16 +140,34 @@ RGNDATA = Struct("RGNDATA", [
 ])
 LPRGNDATA = Pointer(RGNDATA)
 
+HMODULE = Opaque("HMODULE")
 
 IUnknown = Interface("IUnknown")
 
 IUnknown.methods = (
-       Method(HRESULT, "QueryInterface", ((REFIID, "riid"), (Pointer(Pointer(Void)), "ppvObj"))),
+       Method(HRESULT, "QueryInterface", ((REFIID, "riid"), (Pointer(OpaquePointer(Void)), "ppvObj"))),
        Method(ULONG, "AddRef", ()),
        Method(ULONG, "Release", ()),
 )
 
 
+class DllFunction(Function):
+
+    def get_true_pointer(self):
+        ptype = self.pointer_type()
+        pvalue = self.pointer_value()
+        print '    if(!g_hDll) {'
+        print '        g_hDll = LoadLibrary(g_szDll);'
+        print '        if(!g_hDll)'
+        self.fail_impl()
+        print '    }'
+        print '    if(!%s) {' % (pvalue,)
+        print '        %s = (%s)GetProcAddress(g_hDll, "%s");' % (pvalue, ptype, self.name)
+        print '        if(!%s)' % (pvalue,)
+        self.fail_impl()
+        print '    }'
+
+
 class Dll:
 
     def __init__(self, name):
@@ -156,6 +188,9 @@ class Dll:
         print
         print 'BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved);'
         print
+        for function in self.functions:
+            function.wrap_decl()
+        print
 
     def wrap_impl(self):
         print r'BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {'
@@ -164,6 +199,7 @@ class Dll:
         print r'        if(!GetSystemDirectory(g_szDll, MAX_PATH))'
         print r'            return FALSE;'
         print r'        _tcscat(g_szDll, TEXT("\\%s.dll"));' % self.name
+        print r'        Log::Open("%s");' % self.name
         print r'    case DLL_THREAD_ATTACH:'
         print r'        return TRUE;'
         print r'    case DLL_THREAD_DETACH:'
@@ -182,38 +218,6 @@ class Dll:
         print r'}'
         print
         for function in self.functions:
-            type = 'P' + function.name
-            print function.prototype() + ' {'
-            if 1:
-                print '    Log::Close();'
-                print '    Log::Open("%s");' % self.name
-            #print '    Log::ReOpen();'
-            print '    typedef ' + function.prototype('* %s' % type) + ';'
-            print '    %s pFunction;' % type
-            if function.type is Void:
-                result = ''
-            else:
-                print '    %s result;' % function.type
-                result = 'result = '
-            print '    if(!g_hDll) {'
-            print '        g_hDll = LoadLibrary(g_szDll);'
-            print '        if(!g_hDll)'
-            print '            ExitProcess(0);'
-            print '    }'
-            print '    pFunction = (%s)GetProcAddress( g_hDll, "%s");' % (type, function.name)
-            print '    if(!pFunction)'
-            print '        ExitProcess(0);'
-            print '    Log::BeginCall("%s");' % (function.name)
-            print '    %spFunction(%s);' % (result, ', '.join([str(name) for type, name in function.args]))
-            print '    Log::EndCall();'
-            for type, name in function.args:
-                if type.isoutput():
-                    type.wrap_instance(name)
-            if function.type is not Void:
-                function.type.wrap_instance('result')
-            if function.type is not Void:
-                print '    return result;'
-            print '}'
-            print
+            function.wrap_impl()
         print