diff options
author | Éric Araujo <merwok@netwok.org> | 2011-05-02 13:12:23 +0200 |
---|---|---|
committer | Éric Araujo <merwok@netwok.org> | 2011-05-02 13:12:23 +0200 |
commit | a4574f0d36898725cc1475c15115fbc3c570c098 (patch) | |
tree | ef4923cb6b672a34955933a27552c556d706e210 /Lib/ctypes | |
parent | 928360dee070381a9d5876cb6a06f9f4bd67634b (diff) | |
parent | b51f16bd9f76110be5547a99962aa23ea9f35656 (diff) | |
download | cpython-a4574f0d36898725cc1475c15115fbc3c570c098.tar.gz |
Merge 3.1
Diffstat (limited to 'Lib/ctypes')
27 files changed, 300 insertions, 342 deletions
diff --git a/Lib/ctypes/__init__.py b/Lib/ctypes/__init__.py index 1283f28a6d..71686e7a1b 100644 --- a/Lib/ctypes/__init__.py +++ b/Lib/ctypes/__init__.py @@ -259,41 +259,31 @@ class c_bool(_SimpleCData): from _ctypes import POINTER, pointer, _pointer_type_cache -try: - from _ctypes import set_conversion_mode -except ImportError: - pass -else: - if _os.name in ("nt", "ce"): - set_conversion_mode("mbcs", "ignore") - else: - set_conversion_mode("ascii", "strict") +class c_wchar_p(_SimpleCData): + _type_ = "Z" - class c_wchar_p(_SimpleCData): - _type_ = "Z" +class c_wchar(_SimpleCData): + _type_ = "u" - class c_wchar(_SimpleCData): - _type_ = "u" +POINTER(c_wchar).from_param = c_wchar_p.from_param #_SimpleCData.c_wchar_p_from_param - POINTER(c_wchar).from_param = c_wchar_p.from_param #_SimpleCData.c_wchar_p_from_param - - def create_unicode_buffer(init, size=None): - """create_unicode_buffer(aString) -> character array - create_unicode_buffer(anInteger) -> character array - create_unicode_buffer(aString, anInteger) -> character array - """ - if isinstance(init, (str, bytes)): - if size is None: - size = len(init)+1 - buftype = c_wchar * size - buf = buftype() - buf.value = init - return buf - elif isinstance(init, int): - buftype = c_wchar * init - buf = buftype() - return buf - raise TypeError(init) +def create_unicode_buffer(init, size=None): + """create_unicode_buffer(aString) -> character array + create_unicode_buffer(anInteger) -> character array + create_unicode_buffer(aString, anInteger) -> character array + """ + if isinstance(init, (str, bytes)): + if size is None: + size = len(init)+1 + buftype = c_wchar * size + buf = buftype() + buf.value = init + return buf + elif isinstance(init, int): + buftype = c_wchar * init + buf = buftype() + return buf + raise TypeError(init) POINTER(c_char).from_param = c_char_p.from_param #_SimpleCData.c_char_p_from_param @@ -459,10 +449,13 @@ _pointer_type_cache[None] = c_void_p if sizeof(c_uint) == sizeof(c_void_p): c_size_t = c_uint + c_ssize_t = c_int elif sizeof(c_ulong) == sizeof(c_void_p): c_size_t = c_ulong + c_ssize_t = c_long elif sizeof(c_ulonglong) == sizeof(c_void_p): c_size_t = c_ulonglong + c_ssize_t = c_longlong # functions diff --git a/Lib/ctypes/test/test_arrays.py b/Lib/ctypes/test/test_arrays.py index d11de28722..f2a9f078c9 100644 --- a/Lib/ctypes/test/test_arrays.py +++ b/Lib/ctypes/test/test_arrays.py @@ -42,7 +42,7 @@ class ArrayTestCase(unittest.TestCase): CharArray = ARRAY(c_char, 3) - ca = CharArray("a", "b", "c") + ca = CharArray(b"a", b"b", b"c") # Should this work? It doesn't: # CharArray("abc") @@ -89,7 +89,7 @@ class ArrayTestCase(unittest.TestCase): def test_from_address(self): # Failed with 0.9.8, reported by JUrner - p = create_string_buffer("foo") + p = create_string_buffer(b"foo") sz = (c_char * 3).from_address(addressof(p)) self.assertEqual(sz[:], b"foo") self.assertEqual(sz[::], b"foo") diff --git a/Lib/ctypes/test/test_bitfields.py b/Lib/ctypes/test/test_bitfields.py index 4eb9571f65..9e0825c7ca 100644 --- a/Lib/ctypes/test/test_bitfields.py +++ b/Lib/ctypes/test/test_bitfields.py @@ -37,14 +37,14 @@ class C_Test(unittest.TestCase): for name in "ABCDEFGHI": b = BITS() setattr(b, name, i) - self.assertEqual((name, i, getattr(b, name)), (name, i, func(byref(b), name))) + self.assertEqual(getattr(b, name), func(byref(b), name.encode('ascii'))) def test_shorts(self): for i in range(256): for name in "MNOPQRS": b = BITS() setattr(b, name, i) - self.assertEqual((name, i, getattr(b, name)), (name, i, func(byref(b), name))) + self.assertEqual(getattr(b, name), func(byref(b), name.encode('ascii'))) signed_int_types = (c_byte, c_short, c_int, c_long, c_longlong) unsigned_int_types = (c_ubyte, c_ushort, c_uint, c_ulong, c_ulonglong) diff --git a/Lib/ctypes/test/test_buffers.py b/Lib/ctypes/test/test_buffers.py index 3f8a587090..c19c05a300 100644 --- a/Lib/ctypes/test/test_buffers.py +++ b/Lib/ctypes/test/test_buffers.py @@ -9,19 +9,7 @@ class StringBufferTestCase(unittest.TestCase): self.assertEqual(sizeof(b), 32 * sizeof(c_char)) self.assertTrue(type(b[0]) is bytes) - b = create_string_buffer("abc") - self.assertEqual(len(b), 4) # trailing nul char - self.assertEqual(sizeof(b), 4 * sizeof(c_char)) - self.assertTrue(type(b[0]) is bytes) - self.assertEqual(b[0], b"a") - self.assertEqual(b[:], b"abc\0") - self.assertEqual(b[::], b"abc\0") - self.assertEqual(b[::-1], b"\0cba") - self.assertEqual(b[::2], b"ac") - self.assertEqual(b[::5], b"a") - - def test_string_conversion(self): - b = create_string_buffer("abc") + b = create_string_buffer(b"abc") self.assertEqual(len(b), 4) # trailing nul char self.assertEqual(sizeof(b), 4 * sizeof(c_char)) self.assertTrue(type(b[0]) is bytes) diff --git a/Lib/ctypes/test/test_bytes.py b/Lib/ctypes/test/test_bytes.py index 374b2d7751..ee49c456e8 100644 --- a/Lib/ctypes/test/test_bytes.py +++ b/Lib/ctypes/test/test_bytes.py @@ -11,34 +11,30 @@ class BytesTest(unittest.TestCase): (c_char * 3)(b"a", b"b", b"c") def test_c_wchar(self): - x = c_wchar(b"x") - x.value = b"y" - c_wchar.from_param(b"x") - (c_wchar * 3)(b"a", b"b", b"c") + x = c_wchar("x") + x.value = "y" + c_wchar.from_param("x") + (c_wchar * 3)("a", "b", "c") def test_c_char_p(self): - c_char_p("foo bar") c_char_p(b"foo bar") def test_c_wchar_p(self): c_wchar_p("foo bar") - c_wchar_p(b"foo bar") def test_struct(self): class X(Structure): _fields_ = [("a", c_char * 3)] - X("abc") x = X(b"abc") - self.assertEqual(x.a, "abc") - self.assertEqual(type(x.a), str) + self.assertEqual(x.a, b"abc") + self.assertEqual(type(x.a), bytes) def test_struct_W(self): class X(Structure): _fields_ = [("a", c_wchar * 3)] - X("abc") - x = X(b"abc") + x = X("abc") self.assertEqual(x.a, "abc") self.assertEqual(type(x.a), str) @@ -49,7 +45,6 @@ class BytesTest(unittest.TestCase): _type_ = "X" BSTR("abc") - BSTR(b"abc") if __name__ == '__main__': unittest.main() diff --git a/Lib/ctypes/test/test_callbacks.py b/Lib/ctypes/test/test_callbacks.py index dabcde65c8..8801ccd106 100644 --- a/Lib/ctypes/test/test_callbacks.py +++ b/Lib/ctypes/test/test_callbacks.py @@ -166,6 +166,40 @@ class SampleCallbacksTestCase(unittest.TestCase): self.assertLess(diff, 0.01, "%s not less than 0.01" % diff) + def test_issue_8959_a(self): + from ctypes.util import find_library + libc_path = find_library("c") + if not libc_path: + return # cannot test + libc = CDLL(libc_path) + + @CFUNCTYPE(c_int, POINTER(c_int), POINTER(c_int)) + def cmp_func(a, b): + return a[0] - b[0] + + array = (c_int * 5)(5, 1, 99, 7, 33) + + libc.qsort(array, len(array), sizeof(c_int), cmp_func) + self.assertEqual(array[:], [1, 5, 7, 33, 99]) + + try: + WINFUNCTYPE + except NameError: + pass + else: + def test_issue_8959_b(self): + from ctypes.wintypes import BOOL, HWND, LPARAM + global windowCount + windowCount = 0 + + @WINFUNCTYPE(BOOL, HWND, LPARAM) + def EnumWindowsCallbackFunc(hwnd, lParam): + global windowCount + windowCount += 1 + return True #Allow windows to keep enumerating + + windll.user32.EnumWindows(EnumWindowsCallbackFunc, 0) + def test_callback_register_int(self): # Issue #8275: buggy handling of callback args under Win64 # NOTE: should be run on release builds as well diff --git a/Lib/ctypes/test/test_cast.py b/Lib/ctypes/test/test_cast.py index 4c4a2e8545..702de3cffa 100644 --- a/Lib/ctypes/test/test_cast.py +++ b/Lib/ctypes/test/test_cast.py @@ -33,17 +33,17 @@ class Test(unittest.TestCase): def test_p2a_objects(self): array = (c_char_p * 5)() self.assertEqual(array._objects, None) - array[0] = "foo bar" + array[0] = b"foo bar" self.assertEqual(array._objects, {'0': b"foo bar"}) p = cast(array, POINTER(c_char_p)) # array and p share a common _objects attribute self.assertTrue(p._objects is array._objects) self.assertEqual(array._objects, {'0': b"foo bar", id(array): array}) - p[0] = "spam spam" + p[0] = b"spam spam" self.assertEqual(p._objects, {'0': b"spam spam", id(array): array}) self.assertTrue(array._objects is p._objects) - p[1] = "foo bar" + p[1] = b"foo bar" self.assertEqual(p._objects, {'1': b'foo bar', '0': b"spam spam", id(array): array}) self.assertTrue(array._objects is p._objects) @@ -71,7 +71,7 @@ class Test(unittest.TestCase): def test_char_p(self): # This didn't work: bad argument to internal function - s = c_char_p("hiho") + s = c_char_p(b"hiho") self.assertEqual(cast(cast(s, c_void_p), c_char_p).value, b"hiho") diff --git a/Lib/ctypes/test/test_cfuncs.py b/Lib/ctypes/test/test_cfuncs.py index 493cbe979c..f4bd3b16c3 100644 --- a/Lib/ctypes/test/test_cfuncs.py +++ b/Lib/ctypes/test/test_cfuncs.py @@ -107,7 +107,7 @@ class CFunctions(unittest.TestCase): def test_ulong_plus(self): self._dll.tf_bL.restype = c_ulong self._dll.tf_bL.argtypes = (c_char, c_ulong) - self.assertEqual(self._dll.tf_bL(' ', 4294967295), 1431655765) + self.assertEqual(self._dll.tf_bL(b' ', 4294967295), 1431655765) self.assertEqual(self.U(), 4294967295) def test_longlong(self): diff --git a/Lib/ctypes/test/test_errno.py b/Lib/ctypes/test/test_errno.py index 0254c3bcda..4690a0d871 100644 --- a/Lib/ctypes/test/test_errno.py +++ b/Lib/ctypes/test/test_errno.py @@ -1,27 +1,31 @@ import unittest, os, errno from ctypes import * from ctypes.util import find_library -import threading +try: + import threading +except ImportError: + threading = None class Test(unittest.TestCase): def test_open(self): libc_name = find_library("c") - if libc_name is not None: - libc = CDLL(libc_name, use_errno=True) - if os.name == "nt": - libc_open = libc._open - else: - libc_open = libc.open + if libc_name is None: + raise unittest.SkipTest("Unable to find C library") + libc = CDLL(libc_name, use_errno=True) + if os.name == "nt": + libc_open = libc._open + else: + libc_open = libc.open - libc_open.argtypes = c_char_p, c_int + libc_open.argtypes = c_char_p, c_int - self.assertEqual(libc_open("", 0), -1) - self.assertEqual(get_errno(), errno.ENOENT) - - self.assertEqual(set_errno(32), errno.ENOENT) - self.assertEqual(get_errno(), 32) + self.assertEqual(libc_open(b"", 0), -1) + self.assertEqual(get_errno(), errno.ENOENT) + self.assertEqual(set_errno(32), errno.ENOENT) + self.assertEqual(get_errno(), 32) + if threading: def _worker(): set_errno(0) @@ -31,7 +35,7 @@ class Test(unittest.TestCase): else: libc_open = libc.open libc_open.argtypes = c_char_p, c_int - self.assertEqual(libc_open("", 0), -1) + self.assertEqual(libc_open(b"", 0), -1) self.assertEqual(get_errno(), 0) t = threading.Thread(target=_worker) @@ -41,36 +45,35 @@ class Test(unittest.TestCase): self.assertEqual(get_errno(), 32) set_errno(0) - if os.name == "nt": - - def test_GetLastError(self): - dll = WinDLL("kernel32", use_last_error=True) - GetModuleHandle = dll.GetModuleHandleA - GetModuleHandle.argtypes = [c_wchar_p] + @unittest.skipUnless(os.name == "nt", 'Test specific to Windows') + def test_GetLastError(self): + dll = WinDLL("kernel32", use_last_error=True) + GetModuleHandle = dll.GetModuleHandleA + GetModuleHandle.argtypes = [c_wchar_p] - self.assertEqual(0, GetModuleHandle("foo")) - self.assertEqual(get_last_error(), 126) + self.assertEqual(0, GetModuleHandle("foo")) + self.assertEqual(get_last_error(), 126) - self.assertEqual(set_last_error(32), 126) - self.assertEqual(get_last_error(), 32) + self.assertEqual(set_last_error(32), 126) + self.assertEqual(get_last_error(), 32) - def _worker(): - set_last_error(0) + def _worker(): + set_last_error(0) - dll = WinDLL("kernel32", use_last_error=False) - GetModuleHandle = dll.GetModuleHandleW - GetModuleHandle.argtypes = [c_wchar_p] - GetModuleHandle("bar") + dll = WinDLL("kernel32", use_last_error=False) + GetModuleHandle = dll.GetModuleHandleW + GetModuleHandle.argtypes = [c_wchar_p] + GetModuleHandle("bar") - self.assertEqual(get_last_error(), 0) + self.assertEqual(get_last_error(), 0) - t = threading.Thread(target=_worker) - t.start() - t.join() + t = threading.Thread(target=_worker) + t.start() + t.join() - self.assertEqual(get_last_error(), 32) + self.assertEqual(get_last_error(), 32) - set_last_error(0) + set_last_error(0) if __name__ == "__main__": unittest.main() diff --git a/Lib/ctypes/test/test_internals.py b/Lib/ctypes/test/test_internals.py index 03d820ec7e..cbf2e0589a 100644 --- a/Lib/ctypes/test/test_internals.py +++ b/Lib/ctypes/test/test_internals.py @@ -23,16 +23,16 @@ class ObjectsTestCase(unittest.TestCase): def test_ints(self): i = 42000123 - rc = grc(i) + refcnt = grc(i) ci = c_int(i) - self.assertEqual(rc, grc(i)) + self.assertEqual(refcnt, grc(i)) self.assertEqual(ci._objects, None) def test_c_char_p(self): s = b"Hello, World" - rc = grc(s) + refcnt = grc(s) cs = c_char_p(s) - self.assertEqual(rc + 1, grc(s)) + self.assertEqual(refcnt + 1, grc(s)) self.assertSame(cs._objects, s) def test_simple_struct(self): @@ -70,19 +70,17 @@ class ObjectsTestCase(unittest.TestCase): class Y(Structure): _fields_ = [("x", X), ("y", X)] - s1 = "Hello, World" - s2 = "Hallo, Welt" + s1 = b"Hello, World" + s2 = b"Hallo, Welt" x = X() x.a = s1 x.b = s2 - self.assertEqual(x._objects, {"0": bytes(s1, "ascii"), - "1": bytes(s2, "ascii")}) + self.assertEqual(x._objects, {"0": s1, "1": s2}) y = Y() y.x = x - self.assertEqual(y._objects, {"0": {"0": bytes(s1, "ascii"), - "1": bytes(s2, "ascii")}}) + self.assertEqual(y._objects, {"0": {"0": s1, "1": s2}}) ## x = y.x ## del y ## print x._b_base_._objects diff --git a/Lib/ctypes/test/test_keeprefs.py b/Lib/ctypes/test/test_keeprefs.py index fafef65d2c..db8adfb4ca 100644 --- a/Lib/ctypes/test/test_keeprefs.py +++ b/Lib/ctypes/test/test_keeprefs.py @@ -13,9 +13,9 @@ class SimpleTestCase(unittest.TestCase): def test_ccharp(self): x = c_char_p() self.assertEqual(x._objects, None) - x.value = "abc" + x.value = b"abc" self.assertEqual(x._objects, b"abc") - x = c_char_p("spam") + x = c_char_p(b"spam") self.assertEqual(x._objects, b"spam") class StructureTestCase(unittest.TestCase): @@ -37,8 +37,8 @@ class StructureTestCase(unittest.TestCase): x = X() self.assertEqual(x._objects, None) - x.a = "spam" - x.b = "foo" + x.a = b"spam" + x.b = b"foo" self.assertEqual(x._objects, {"0": b"spam", "1": b"foo"}) def test_struct_struct(self): diff --git a/Lib/ctypes/test/test_libc.py b/Lib/ctypes/test/test_libc.py index cce409fa1b..56285b5ff8 100644 --- a/Lib/ctypes/test/test_libc.py +++ b/Lib/ctypes/test/test_libc.py @@ -25,7 +25,7 @@ class LibTest(unittest.TestCase): def sort(a, b): return three_way_cmp(a[0], b[0]) - chars = create_string_buffer("spam, spam, and spam") + chars = create_string_buffer(b"spam, spam, and spam") lib.my_qsort(chars, len(chars)-1, sizeof(c_char), comparefunc(sort)) self.assertEqual(chars.raw, b" ,,aaaadmmmnpppsss\x00") diff --git a/Lib/ctypes/test/test_loading.py b/Lib/ctypes/test/test_loading.py index 07b69ec201..4029b463bc 100644 --- a/Lib/ctypes/test/test_loading.py +++ b/Lib/ctypes/test/test_loading.py @@ -97,7 +97,7 @@ class LoaderTest(unittest.TestCase): self.assertEqual(0, advapi32.CloseEventLog(None)) windll.kernel32.GetProcAddress.argtypes = c_void_p, c_char_p windll.kernel32.GetProcAddress.restype = c_void_p - proc = windll.kernel32.GetProcAddress(advapi32._handle, "CloseEventLog") + proc = windll.kernel32.GetProcAddress(advapi32._handle, b"CloseEventLog") self.assertTrue(proc) # This is the real test: call the function via 'call_function' self.assertEqual(0, call_function(proc, (None,))) diff --git a/Lib/ctypes/test/test_objects.py b/Lib/ctypes/test/test_objects.py index 750d9045ce..f075c20893 100644 --- a/Lib/ctypes/test/test_objects.py +++ b/Lib/ctypes/test/test_objects.py @@ -20,7 +20,7 @@ None The memory block stores pointers to strings, and the strings itself assigned from Python must be kept. ->>> array[4] = 'foo bar' +>>> array[4] = b'foo bar' >>> array._objects {'4': b'foo bar'} >>> array[4] @@ -45,7 +45,7 @@ of 'x' ('_b_base_' is either None, or the root object owning the memory block): <ctypes.test.test_objects.X object at 0x...> >>> ->>> x.array[0] = 'spam spam spam' +>>> x.array[0] = b'spam spam spam' >>> x._objects {'0:2': b'spam spam spam'} >>> x.array._b_base_._objects diff --git a/Lib/ctypes/test/test_parameters.py b/Lib/ctypes/test/test_parameters.py index 6a3f33d19c..e83fd9a6fc 100644 --- a/Lib/ctypes/test/test_parameters.py +++ b/Lib/ctypes/test/test_parameters.py @@ -19,7 +19,6 @@ class SimpleTypesTestCase(unittest.TestCase): else: set_conversion_mode(*self.prev_conv_mode) - def test_subclasses(self): from ctypes import c_void_p, c_char_p # ctypes 0.9.5 and before did overwrite from_param in SimpleType_new @@ -58,14 +57,13 @@ class SimpleTypesTestCase(unittest.TestCase): self.assertTrue(c_char_p.from_param(s)._obj is s) # new in 0.9.1: convert (encode) unicode to ascii - self.assertEqual(c_char_p.from_param("123")._obj, b"123") - self.assertRaises(UnicodeEncodeError, c_char_p.from_param, "123\377") - + self.assertEqual(c_char_p.from_param(b"123")._obj, b"123") + self.assertRaises(TypeError, c_char_p.from_param, "123\377") self.assertRaises(TypeError, c_char_p.from_param, 42) # calling c_char_p.from_param with a c_char_p instance # returns the argument itself: - a = c_char_p("123") + a = c_char_p(b"123") self.assertTrue(c_char_p.from_param(a) is a) def test_cw_strings(self): @@ -82,7 +80,7 @@ class SimpleTypesTestCase(unittest.TestCase): # new in 0.9.1: convert (decode) ascii to unicode self.assertEqual(c_wchar_p.from_param("123")._obj, "123") - self.assertRaises(UnicodeDecodeError, c_wchar_p.from_param, b"123\377") + self.assertRaises(TypeError, c_wchar_p.from_param, b"123\377") pa = c_wchar_p.from_param(c_wchar_p("123")) self.assertEqual(type(pa), c_wchar_p) diff --git a/Lib/ctypes/test/test_prototypes.py b/Lib/ctypes/test/test_prototypes.py index d2e4c0b19d..6ef1b1bcaf 100644 --- a/Lib/ctypes/test/test_prototypes.py +++ b/Lib/ctypes/test/test_prototypes.py @@ -127,7 +127,7 @@ class CharPointersTestCase(unittest.TestCase): self.assertEqual(None, func(c_char_p(None))) self.assertEqual(b"123", func(c_buffer(b"123"))) - ca = c_char("a") + ca = c_char(b"a") self.assertEqual(ord(b"a"), func(pointer(ca))[0]) self.assertEqual(ord(b"a"), func(byref(ca))[0]) diff --git a/Lib/ctypes/test/test_python_api.py b/Lib/ctypes/test/test_python_api.py index b74767a4f3..1f4c6039dc 100644 --- a/Lib/ctypes/test/test_python_api.py +++ b/Lib/ctypes/test/test_python_api.py @@ -72,10 +72,10 @@ class PythonAPITestCase(unittest.TestCase): PyOS_snprintf.argtypes = POINTER(c_char), c_size_t, c_char_p buf = c_buffer(256) - PyOS_snprintf(buf, sizeof(buf), "Hello from %s", b"ctypes") + PyOS_snprintf(buf, sizeof(buf), b"Hello from %s", b"ctypes") self.assertEqual(buf.value, b"Hello from ctypes") - PyOS_snprintf(buf, sizeof(buf), "Hello from %s (%d, %d, %d)", b"ctypes", 1, 2, 3) + PyOS_snprintf(buf, sizeof(buf), b"Hello from %s (%d, %d, %d)", b"ctypes", 1, 2, 3) self.assertEqual(buf.value, b"Hello from ctypes (1, 2, 3)") # not enough arguments diff --git a/Lib/ctypes/test/test_random_things.py b/Lib/ctypes/test/test_random_things.py index 7bb9db8049..515acf509a 100644 --- a/Lib/ctypes/test/test_random_things.py +++ b/Lib/ctypes/test/test_random_things.py @@ -18,7 +18,7 @@ if sys.platform == "win32": windll.kernel32.GetProcAddress.restype = c_void_p hdll = windll.kernel32.LoadLibraryA(b"kernel32") - funcaddr = windll.kernel32.GetProcAddress(hdll, "GetModuleHandleA") + funcaddr = windll.kernel32.GetProcAddress(hdll, b"GetModuleHandleA") self.assertEqual(call_function(funcaddr, (None,)), windll.kernel32.GetModuleHandleA(None)) @@ -66,7 +66,7 @@ class CallbackTracbackTestCase(unittest.TestCase): def test_TypeErrorDivisionError(self): cb = CFUNCTYPE(c_int, c_char_p)(callback_func) - out = self.capture_stderr(cb, "spam") + out = self.capture_stderr(cb, b"spam") self.assertEqual(out.splitlines()[-1], "TypeError: " "unsupported operand type(s) for /: 'int' and 'bytes'") diff --git a/Lib/ctypes/test/test_repr.py b/Lib/ctypes/test/test_repr.py index 9a1e2386e6..60a2c80345 100644 --- a/Lib/ctypes/test/test_repr.py +++ b/Lib/ctypes/test/test_repr.py @@ -22,8 +22,8 @@ class ReprTest(unittest.TestCase): self.assertEqual("<X object at", repr(typ(42))[:12]) def test_char(self): - self.assertEqual("c_char(b'x')", repr(c_char('x'))) - self.assertEqual("<X object at", repr(X('x'))[:12]) + self.assertEqual("c_char(b'x')", repr(c_char(b'x'))) + self.assertEqual("<X object at", repr(X(b'x'))[:12]) if __name__ == "__main__": unittest.main() diff --git a/Lib/ctypes/test/test_returnfuncptrs.py b/Lib/ctypes/test/test_returnfuncptrs.py index 11da07b66a..af1caddaab 100644 --- a/Lib/ctypes/test/test_returnfuncptrs.py +++ b/Lib/ctypes/test/test_returnfuncptrs.py @@ -28,10 +28,10 @@ class ReturnFuncPtrTestCase(unittest.TestCase): # _CFuncPtr instances are now callable with an integer argument # which denotes a function address: strchr = CFUNCTYPE(c_char_p, c_char_p, c_char)(addr) - self.assertTrue(strchr("abcdef", "b"), "bcdef") - self.assertEqual(strchr("abcdef", "x"), None) - self.assertRaises(ArgumentError, strchr, "abcdef", 3.0) - self.assertRaises(TypeError, strchr, "abcdef") + self.assertTrue(strchr(b"abcdef", b"b"), "bcdef") + self.assertEqual(strchr(b"abcdef", b"x"), None) + self.assertRaises(ArgumentError, strchr, b"abcdef", 3.0) + self.assertRaises(TypeError, strchr, b"abcdef") if __name__ == "__main__": unittest.main() diff --git a/Lib/ctypes/test/test_sizes.py b/Lib/ctypes/test/test_sizes.py index 0509cbb680..f9b5e97260 100644 --- a/Lib/ctypes/test/test_sizes.py +++ b/Lib/ctypes/test/test_sizes.py @@ -1,8 +1,11 @@ # Test specifically-sized containers. -import unittest from ctypes import * +import sys +import unittest + + class SizesTestCase(unittest.TestCase): def test_8(self): self.assertEqual(1, sizeof(c_int8)) @@ -23,5 +26,9 @@ class SizesTestCase(unittest.TestCase): def test_size_t(self): self.assertEqual(sizeof(c_void_p), sizeof(c_size_t)) + def test_ssize_t(self): + self.assertEqual(sizeof(c_void_p), sizeof(c_ssize_t)) + + if __name__ == "__main__": unittest.main() diff --git a/Lib/ctypes/test/test_stringptr.py b/Lib/ctypes/test/test_stringptr.py index 8b16dcbe75..3d25fa5360 100644 --- a/Lib/ctypes/test/test_stringptr.py +++ b/Lib/ctypes/test/test_stringptr.py @@ -14,7 +14,7 @@ class StringPtrTestCase(unittest.TestCase): # NULL pointer access self.assertRaises(ValueError, getattr, x.str, "contents") - b = c_buffer("Hello, World") + b = c_buffer(b"Hello, World") from sys import getrefcount as grc self.assertEqual(grc(b), 2) x.str = b @@ -63,8 +63,8 @@ class StringPtrTestCase(unittest.TestCase): # So we must keep a reference to buf separately strchr.restype = POINTER(c_char) - buf = c_buffer("abcdef") - r = strchr(buf, "c") + buf = c_buffer(b"abcdef") + r = strchr(buf, b"c") x = r[0], r[1], r[2], r[3], r[4] self.assertEqual(x, (b"c", b"d", b"e", b"f", b"\000")) del buf diff --git a/Lib/ctypes/test/test_strings.py b/Lib/ctypes/test/test_strings.py index 3cd1f84006..1a9bdbc5c0 100644 --- a/Lib/ctypes/test/test_strings.py +++ b/Lib/ctypes/test/test_strings.py @@ -5,23 +5,23 @@ class StringArrayTestCase(unittest.TestCase): def test(self): BUF = c_char * 4 - buf = BUF("a", "b", "c") + buf = BUF(b"a", b"b", b"c") self.assertEqual(buf.value, b"abc") self.assertEqual(buf.raw, b"abc\000") - buf.value = "ABCD" + buf.value = b"ABCD" self.assertEqual(buf.value, b"ABCD") self.assertEqual(buf.raw, b"ABCD") - buf.value = "x" + buf.value = b"x" self.assertEqual(buf.value, b"x") self.assertEqual(buf.raw, b"x\000CD") - buf[1] = "Z" + buf[1] = b"Z" self.assertEqual(buf.value, b"xZCD") self.assertEqual(buf.raw, b"xZCD") - self.assertRaises(ValueError, setattr, buf, "value", "aaaaaaaa") + self.assertRaises(ValueError, setattr, buf, "value", b"aaaaaaaa") self.assertRaises(TypeError, setattr, buf, "value", 42) def test_c_buffer_value(self): @@ -74,6 +74,13 @@ else: buf[1] = "Z" self.assertEqual(buf.value, "xZCD") + @unittest.skipIf(sizeof(c_wchar) < 4, + "sizeof(wchar_t) is smaller than 4 bytes") + def test_nonbmp(self): + u = chr(0x10ffff) + w = c_wchar(u) + self.assertEqual(w.value, u) + class StringTestCase(unittest.TestCase): def XX_test_basic_strings(self): cs = c_string("abcdef") diff --git a/Lib/ctypes/test/test_structures.py b/Lib/ctypes/test/test_structures.py index c58d94989c..536ea50cd8 100644 --- a/Lib/ctypes/test/test_structures.py +++ b/Lib/ctypes/test/test_structures.py @@ -205,15 +205,15 @@ class StructureTestCase(unittest.TestCase): ("age", c_int)] self.assertRaises(TypeError, Person, 42) - self.assertRaises(ValueError, Person, "asldkjaslkdjaslkdj") + self.assertRaises(ValueError, Person, b"asldkjaslkdjaslkdj") self.assertRaises(TypeError, Person, "Name", "HI") # short enough - self.assertEqual(Person("12345", 5).name, "12345") + self.assertEqual(Person(b"12345", 5).name, b"12345") # exact fit - self.assertEqual(Person("123456", 5).name, "123456") + self.assertEqual(Person(b"123456", 5).name, b"123456") # too long - self.assertRaises(ValueError, Person, "1234567", 5) + self.assertRaises(ValueError, Person, b"1234567", 5) def test_conflicting_initializers(self): class POINT(Structure): @@ -267,11 +267,11 @@ class StructureTestCase(unittest.TestCase): ("phone", Phone), ("age", c_int)] - p = Person("Someone", ("1234", "5678"), 5) + p = Person(b"Someone", (b"1234", b"5678"), 5) - self.assertEqual(p.name, "Someone") - self.assertEqual(p.phone.areacode, "1234") - self.assertEqual(p.phone.number, "5678") + self.assertEqual(p.name, b"Someone") + self.assertEqual(p.phone.areacode, b"1234") + self.assertEqual(p.phone.number, b"5678") self.assertEqual(p.age, 5) def test_structures_with_wchar(self): @@ -284,8 +284,8 @@ class StructureTestCase(unittest.TestCase): _fields_ = [("name", c_wchar * 12), ("age", c_int)] - p = PersonW("Someone") - self.assertEqual(p.name, "Someone") + p = PersonW("Someone \xe9") + self.assertEqual(p.name, "Someone \xe9") self.assertEqual(PersonW("1234567890").name, "1234567890") self.assertEqual(PersonW("12345678901").name, "12345678901") @@ -304,13 +304,13 @@ class StructureTestCase(unittest.TestCase): ("phone", Phone), ("age", c_int)] - cls, msg = self.get_except(Person, "Someone", (1, 2)) + cls, msg = self.get_except(Person, b"Someone", (1, 2)) self.assertEqual(cls, RuntimeError) self.assertEqual(msg, "(Phone) <class 'TypeError'>: " "expected string, int found") - cls, msg = self.get_except(Person, "Someone", ("a", "b", "c")) + cls, msg = self.get_except(Person, b"Someone", (b"a", b"b", b"c")) self.assertEqual(cls, RuntimeError) if issubclass(Exception, object): self.assertEqual(msg, diff --git a/Lib/ctypes/test/test_unicode.py b/Lib/ctypes/test/test_unicode.py index b4d3df3d77..c3b2d48771 100644 --- a/Lib/ctypes/test/test_unicode.py +++ b/Lib/ctypes/test/test_unicode.py @@ -7,122 +7,53 @@ except AttributeError: pass else: import _ctypes_test - dll = ctypes.CDLL(_ctypes_test.__file__) - wcslen = dll.my_wcslen - wcslen.argtypes = [ctypes.c_wchar_p] - class UnicodeTestCase(unittest.TestCase): - def setUp(self): - self.prev_conv_mode = ctypes.set_conversion_mode("ascii", "strict") - - def tearDown(self): - ctypes.set_conversion_mode(*self.prev_conv_mode) + def test_wcslen(self): + dll = ctypes.CDLL(_ctypes_test.__file__) + wcslen = dll.my_wcslen + wcslen.argtypes = [ctypes.c_wchar_p] - def test_ascii_strict(self): - ctypes.set_conversion_mode("ascii", "strict") - # no conversions take place with unicode arguments self.assertEqual(wcslen("abc"), 3) self.assertEqual(wcslen("ab\u2070"), 3) - # string args are converted - self.assertEqual(wcslen("abc"), 3) self.assertRaises(ctypes.ArgumentError, wcslen, b"ab\xe4") - def test_ascii_replace(self): - ctypes.set_conversion_mode("ascii", "replace") - self.assertEqual(wcslen("abc"), 3) - self.assertEqual(wcslen("ab\u2070"), 3) - self.assertEqual(wcslen("abc"), 3) - self.assertEqual(wcslen("ab\xe4"), 3) - - def test_ascii_ignore(self): - ctypes.set_conversion_mode("ascii", "ignore") - self.assertEqual(wcslen("abc"), 3) - self.assertEqual(wcslen("ab\u2070"), 3) - # ignore error mode skips non-ascii characters - self.assertEqual(wcslen("abc"), 3) - self.assertEqual(wcslen(b"\xe4\xf6\xfc\xdf"), 0) - - def test_latin1_strict(self): - ctypes.set_conversion_mode("latin-1", "strict") - self.assertEqual(wcslen("abc"), 3) - self.assertEqual(wcslen("ab\u2070"), 3) - self.assertEqual(wcslen("abc"), 3) - self.assertEqual(wcslen("\xe4\xf6\xfc\xdf"), 4) - def test_buffers(self): - ctypes.set_conversion_mode("ascii", "strict") buf = ctypes.create_unicode_buffer("abc") self.assertEqual(len(buf), 3+1) - ctypes.set_conversion_mode("ascii", "replace") - buf = ctypes.create_unicode_buffer(b"ab\xe4\xf6\xfc") - self.assertEqual(buf[:], "ab\uFFFD\uFFFD\uFFFD\0") - self.assertEqual(buf[::], "ab\uFFFD\uFFFD\uFFFD\0") - self.assertEqual(buf[::-1], "\0\uFFFD\uFFFD\uFFFDba") - self.assertEqual(buf[::2], "a\uFFFD\uFFFD") + buf = ctypes.create_unicode_buffer("ab\xe4\xf6\xfc") + self.assertEqual(buf[:], "ab\xe4\xf6\xfc\0") + self.assertEqual(buf[::], "ab\xe4\xf6\xfc\0") + self.assertEqual(buf[::-1], '\x00\xfc\xf6\xe4ba') + self.assertEqual(buf[::2], 'a\xe4\xfc') self.assertEqual(buf[6:5:-1], "") - ctypes.set_conversion_mode("ascii", "ignore") - buf = ctypes.create_unicode_buffer(b"ab\xe4\xf6\xfc") - # is that correct? not sure. But with 'ignore', you get what you pay for.. - self.assertEqual(buf[:], "ab\0\0\0\0") - self.assertEqual(buf[::], "ab\0\0\0\0") - self.assertEqual(buf[::-1], "\0\0\0\0ba") - self.assertEqual(buf[::2], "a\0\0") - self.assertEqual(buf[6:5:-1], "") - - import _ctypes_test func = ctypes.CDLL(_ctypes_test.__file__)._testfunc_p_p class StringTestCase(UnicodeTestCase): def setUp(self): - self.prev_conv_mode = ctypes.set_conversion_mode("ascii", "strict") func.argtypes = [ctypes.c_char_p] func.restype = ctypes.c_char_p def tearDown(self): - ctypes.set_conversion_mode(*self.prev_conv_mode) func.argtypes = None func.restype = ctypes.c_int - def test_ascii_replace(self): - ctypes.set_conversion_mode("ascii", "strict") - self.assertEqual(func("abc"), "abc") - self.assertEqual(func("abc"), "abc") - self.assertRaises(ctypes.ArgumentError, func, "ab\xe4") - - def test_ascii_ignore(self): - ctypes.set_conversion_mode("ascii", "ignore") - self.assertEqual(func("abc"), b"abc") - self.assertEqual(func("abc"), b"abc") - self.assertEqual(func("\xe4\xf6\xfc\xdf"), b"") - - def test_ascii_replace(self): - ctypes.set_conversion_mode("ascii", "replace") - self.assertEqual(func("abc"), b"abc") - self.assertEqual(func("abc"), b"abc") - self.assertEqual(func("\xe4\xf6\xfc\xdf"), b"????") + def test_func(self): + self.assertEqual(func(b"abc\xe4"), b"abc\xe4") def test_buffers(self): - ctypes.set_conversion_mode("ascii", "strict") - buf = ctypes.create_string_buffer("abc") + buf = ctypes.create_string_buffer(b"abc") self.assertEqual(len(buf), 3+1) - ctypes.set_conversion_mode("ascii", "replace") - buf = ctypes.create_string_buffer("ab\xe4\xf6\xfc") - self.assertEqual(buf[:], b"ab???\0") - self.assertEqual(buf[::], b"ab???\0") - self.assertEqual(buf[::-1], b"\0???ba") - self.assertEqual(buf[::2], b"a??") + buf = ctypes.create_string_buffer(b"ab\xe4\xf6\xfc") + self.assertEqual(buf[:], b"ab\xe4\xf6\xfc\0") + self.assertEqual(buf[::], b"ab\xe4\xf6\xfc\0") + self.assertEqual(buf[::-1], b'\x00\xfc\xf6\xe4ba') + self.assertEqual(buf[::2], b'a\xe4\xfc') self.assertEqual(buf[6:5:-1], b"") - ctypes.set_conversion_mode("ascii", "ignore") - buf = ctypes.create_string_buffer("ab\xe4\xf6\xfc") - # is that correct? not sure. But with 'ignore', you get what you pay for.. - self.assertEqual(buf[:], b"ab\0\0\0\0") - self.assertEqual(buf[::], b"ab\0\0\0\0") - self.assertEqual(buf[::-1], b"\0\0\0\0ba") if __name__ == '__main__': unittest.main() diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py index 52bc29614c..1881e89688 100644 --- a/Lib/ctypes/util.py +++ b/Lib/ctypes/util.py @@ -1,4 +1,5 @@ import sys, os +import contextlib # find_library(name) returns the pathname of a library, or None. if os.name == "nt": @@ -117,11 +118,8 @@ elif os.name == "posix": if not f: return None cmd = "/usr/ccs/bin/dump -Lpv 2>/dev/null " + f - f = os.popen(cmd) - try: + with contextlib.closing(os.popen(cmd)) as f: data = f.read() - finally: - f.close() res = re.search(r'\[.*\]\sSONAME\s+([^\s]+)', data) if not res: return None @@ -138,11 +136,8 @@ elif os.name == "posix": rv = f.close() if rv == 10: raise OSError('objdump command not found') - f = os.popen(cmd) - try: + with contextlib.closing(os.popen(cmd)) as f: data = f.read() - finally: - f.close() res = re.search(r'\sSONAME\s+([^\s]+)', data) if not res: return None @@ -166,11 +161,8 @@ elif os.name == "posix": def find_library(name): ename = re.escape(name) expr = r':-l%s\.\S+ => \S*/(lib%s\.\S+)' % (ename, ename) - f = os.popen('/sbin/ldconfig -r 2>/dev/null') - try: + with contextlib.closing(os.popen('/sbin/ldconfig -r 2>/dev/null')) as f: data = f.read() - finally: - f.close() res = re.findall(expr, data) if not res: return _get_soname(_findLib_gcc(name)) @@ -182,20 +174,14 @@ elif os.name == "posix": def _findLib_ldconfig(name): # XXX assuming GLIBC's ldconfig (with option -p) expr = r'/[^\(\)\s]*lib%s\.[^\(\)\s]*' % re.escape(name) - f = os.popen('/sbin/ldconfig -p 2>/dev/null') - try: + with contextlib.closing(os.popen('/sbin/ldconfig -p 2>/dev/null')) as f: data = f.read() - finally: - f.close() res = re.search(expr, data) if not res: # Hm, this works only for libs needed by the python executable. cmd = 'ldd %s 2>/dev/null' % sys.executable - f = os.popen(cmd) - try: + with contextlib.closing(os.popen(cmd)) as f: data = f.read() - finally: - f.close() res = re.search(expr, data) if not res: return None @@ -219,11 +205,8 @@ elif os.name == "posix": # XXX assuming GLIBC's ldconfig (with option -p) expr = r'(\S+)\s+\((%s(?:, OS ABI:[^\)]*)?)\)[^/]*(/[^\(\)\s]*lib%s\.[^\(\)\s]*)' \ % (abi_type, re.escape(name)) - f = os.popen('LC_ALL=C LANG=C /sbin/ldconfig -p 2>/dev/null') - try: + with contextlib.closing(os.popen('LC_ALL=C LANG=C /sbin/ldconfig -p 2>/dev/null')) as f: data = f.read() - finally: - f.close() res = re.search(expr, data) if not res: return None diff --git a/Lib/ctypes/wintypes.py b/Lib/ctypes/wintypes.py index e7f569c9b6..c619d27596 100644 --- a/Lib/ctypes/wintypes.py +++ b/Lib/ctypes/wintypes.py @@ -1,49 +1,50 @@ # The most useful windows datatypes -from ctypes import * +import ctypes -BYTE = c_byte -WORD = c_ushort -DWORD = c_ulong +BYTE = ctypes.c_byte +WORD = ctypes.c_ushort +DWORD = ctypes.c_ulong -WCHAR = c_wchar -UINT = c_uint -INT = c_int +#UCHAR = ctypes.c_uchar +CHAR = ctypes.c_char +WCHAR = ctypes.c_wchar +UINT = ctypes.c_uint +INT = ctypes.c_int -DOUBLE = c_double -FLOAT = c_float +DOUBLE = ctypes.c_double +FLOAT = ctypes.c_float BOOLEAN = BYTE -BOOL = c_long +BOOL = ctypes.c_long -from ctypes import _SimpleCData -class VARIANT_BOOL(_SimpleCData): +class VARIANT_BOOL(ctypes._SimpleCData): _type_ = "v" def __repr__(self): return "%s(%r)" % (self.__class__.__name__, self.value) -ULONG = c_ulong -LONG = c_long +ULONG = ctypes.c_ulong +LONG = ctypes.c_long -USHORT = c_ushort -SHORT = c_short +USHORT = ctypes.c_ushort +SHORT = ctypes.c_short # in the windows header files, these are structures. -_LARGE_INTEGER = LARGE_INTEGER = c_longlong -_ULARGE_INTEGER = ULARGE_INTEGER = c_ulonglong +_LARGE_INTEGER = LARGE_INTEGER = ctypes.c_longlong +_ULARGE_INTEGER = ULARGE_INTEGER = ctypes.c_ulonglong -LPCOLESTR = LPOLESTR = OLESTR = c_wchar_p -LPCWSTR = LPWSTR = c_wchar_p -LPCSTR = LPSTR = c_char_p -LPCVOID = LPVOID = c_void_p +LPCOLESTR = LPOLESTR = OLESTR = ctypes.c_wchar_p +LPCWSTR = LPWSTR = ctypes.c_wchar_p +LPCSTR = LPSTR = ctypes.c_char_p +LPCVOID = LPVOID = ctypes.c_void_p # WPARAM is defined as UINT_PTR (unsigned type) # LPARAM is defined as LONG_PTR (signed type) -if sizeof(c_long) == sizeof(c_void_p): - WPARAM = c_ulong - LPARAM = c_long -elif sizeof(c_longlong) == sizeof(c_void_p): - WPARAM = c_ulonglong - LPARAM = c_longlong +if ctypes.sizeof(ctypes.c_long) == ctypes.sizeof(ctypes.c_void_p): + WPARAM = ctypes.c_ulong + LPARAM = ctypes.c_long +elif ctypes.sizeof(ctypes.c_longlong) == ctypes.sizeof(ctypes.c_void_p): + WPARAM = ctypes.c_ulonglong + LPARAM = ctypes.c_longlong ATOM = WORD LANGID = WORD @@ -56,7 +57,7 @@ LCID = DWORD ################################################################ # HANDLE types -HANDLE = c_void_p # in the header files: void * +HANDLE = ctypes.c_void_p # in the header files: void * HACCEL = HANDLE HBITMAP = HANDLE @@ -93,45 +94,45 @@ SERVICE_STATUS_HANDLE = HANDLE ################################################################ # Some important structure definitions -class RECT(Structure): - _fields_ = [("left", c_long), - ("top", c_long), - ("right", c_long), - ("bottom", c_long)] +class RECT(ctypes.Structure): + _fields_ = [("left", LONG), + ("top", LONG), + ("right", LONG), + ("bottom", LONG)] tagRECT = _RECTL = RECTL = RECT -class _SMALL_RECT(Structure): - _fields_ = [('Left', c_short), - ('Top', c_short), - ('Right', c_short), - ('Bottom', c_short)] +class _SMALL_RECT(ctypes.Structure): + _fields_ = [('Left', SHORT), + ('Top', SHORT), + ('Right', SHORT), + ('Bottom', SHORT)] SMALL_RECT = _SMALL_RECT -class _COORD(Structure): - _fields_ = [('X', c_short), - ('Y', c_short)] +class _COORD(ctypes.Structure): + _fields_ = [('X', SHORT), + ('Y', SHORT)] -class POINT(Structure): - _fields_ = [("x", c_long), - ("y", c_long)] +class POINT(ctypes.Structure): + _fields_ = [("x", LONG), + ("y", LONG)] tagPOINT = _POINTL = POINTL = POINT -class SIZE(Structure): - _fields_ = [("cx", c_long), - ("cy", c_long)] +class SIZE(ctypes.Structure): + _fields_ = [("cx", LONG), + ("cy", LONG)] tagSIZE = SIZEL = SIZE def RGB(red, green, blue): return red + (green << 8) + (blue << 16) -class FILETIME(Structure): +class FILETIME(ctypes.Structure): _fields_ = [("dwLowDateTime", DWORD), ("dwHighDateTime", DWORD)] _FILETIME = FILETIME -class MSG(Structure): +class MSG(ctypes.Structure): _fields_ = [("hWnd", HWND), - ("message", c_uint), + ("message", UINT), ("wParam", WPARAM), ("lParam", LPARAM), ("time", DWORD), @@ -139,7 +140,7 @@ class MSG(Structure): tagMSG = MSG MAX_PATH = 260 -class WIN32_FIND_DATAA(Structure): +class WIN32_FIND_DATAA(ctypes.Structure): _fields_ = [("dwFileAttributes", DWORD), ("ftCreationTime", FILETIME), ("ftLastAccessTime", FILETIME), @@ -148,10 +149,10 @@ class WIN32_FIND_DATAA(Structure): ("nFileSizeLow", DWORD), ("dwReserved0", DWORD), ("dwReserved1", DWORD), - ("cFileName", c_char * MAX_PATH), - ("cAlternateFileName", c_char * 14)] + ("cFileName", CHAR * MAX_PATH), + ("cAlternateFileName", CHAR * 14)] -class WIN32_FIND_DATAW(Structure): +class WIN32_FIND_DATAW(ctypes.Structure): _fields_ = [("dwFileAttributes", DWORD), ("ftCreationTime", FILETIME), ("ftLastAccessTime", FILETIME), @@ -160,22 +161,42 @@ class WIN32_FIND_DATAW(Structure): ("nFileSizeLow", DWORD), ("dwReserved0", DWORD), ("dwReserved1", DWORD), - ("cFileName", c_wchar * MAX_PATH), - ("cAlternateFileName", c_wchar * 14)] - -__all__ = ['ATOM', 'BOOL', 'BOOLEAN', 'BYTE', 'COLORREF', 'DOUBLE', 'DWORD', - 'FILETIME', 'FLOAT', 'HACCEL', 'HANDLE', 'HBITMAP', 'HBRUSH', - 'HCOLORSPACE', 'HDC', 'HDESK', 'HDWP', 'HENHMETAFILE', 'HFONT', - 'HGDIOBJ', 'HGLOBAL', 'HHOOK', 'HICON', 'HINSTANCE', 'HKEY', - 'HKL', 'HLOCAL', 'HMENU', 'HMETAFILE', 'HMODULE', 'HMONITOR', - 'HPALETTE', 'HPEN', 'HRGN', 'HRSRC', 'HSTR', 'HTASK', 'HWINSTA', - 'HWND', 'INT', 'LANGID', 'LARGE_INTEGER', 'LCID', 'LCTYPE', - 'LGRPID', 'LONG', 'LPARAM', 'LPCOLESTR', 'LPCSTR', 'LPCVOID', - 'LPCWSTR', 'LPOLESTR', 'LPSTR', 'LPVOID', 'LPWSTR', 'MAX_PATH', - 'MSG', 'OLESTR', 'POINT', 'POINTL', 'RECT', 'RECTL', 'RGB', - 'SC_HANDLE', 'SERVICE_STATUS_HANDLE', 'SHORT', 'SIZE', 'SIZEL', - 'SMALL_RECT', 'UINT', 'ULARGE_INTEGER', 'ULONG', 'USHORT', - 'VARIANT_BOOL', 'WCHAR', 'WIN32_FIND_DATAA', 'WIN32_FIND_DATAW', - 'WORD', 'WPARAM', '_COORD', '_FILETIME', '_LARGE_INTEGER', - '_POINTL', '_RECTL', '_SMALL_RECT', '_ULARGE_INTEGER', 'tagMSG', - 'tagPOINT', 'tagRECT', 'tagSIZE'] + ("cFileName", WCHAR * MAX_PATH), + ("cAlternateFileName", WCHAR * 14)] + +################################################################ +# Pointer types + +LPBOOL = PBOOL = ctypes.POINTER(BOOL) +PBOOLEAN = ctypes.POINTER(BOOLEAN) +LPBYTE = PBYTE = ctypes.POINTER(BYTE) +PCHAR = ctypes.POINTER(CHAR) +LPCOLORREF = ctypes.POINTER(COLORREF) +LPDWORD = PDWORD = ctypes.POINTER(DWORD) +LPFILETIME = PFILETIME = ctypes.POINTER(FILETIME) +PFLOAT = ctypes.POINTER(FLOAT) +LPHANDLE = PHANDLE = ctypes.POINTER(HANDLE) +PHKEY = ctypes.POINTER(HKEY) +LPHKL = ctypes.POINTER(HKL) +LPINT = PINT = ctypes.POINTER(INT) +PLARGE_INTEGER = ctypes.POINTER(LARGE_INTEGER) +PLCID = ctypes.POINTER(LCID) +LPLONG = PLONG = ctypes.POINTER(LONG) +LPMSG = PMSG = ctypes.POINTER(MSG) +LPPOINT = PPOINT = ctypes.POINTER(POINT) +PPOINTL = ctypes.POINTER(POINTL) +LPRECT = PRECT = ctypes.POINTER(RECT) +LPRECTL = PRECTL = ctypes.POINTER(RECTL) +LPSC_HANDLE = ctypes.POINTER(SC_HANDLE) +PSHORT = ctypes.POINTER(SHORT) +LPSIZE = PSIZE = ctypes.POINTER(SIZE) +LPSIZEL = PSIZEL = ctypes.POINTER(SIZEL) +PSMALL_RECT = ctypes.POINTER(SMALL_RECT) +LPUINT = PUINT = ctypes.POINTER(UINT) +PULARGE_INTEGER = ctypes.POINTER(ULARGE_INTEGER) +PULONG = ctypes.POINTER(ULONG) +PUSHORT = ctypes.POINTER(USHORT) +PWCHAR = ctypes.POINTER(WCHAR) +LPWIN32_FIND_DATAA = PWIN32_FIND_DATAA = ctypes.POINTER(WIN32_FIND_DATAA) +LPWIN32_FIND_DATAW = PWIN32_FIND_DATAW = ctypes.POINTER(WIN32_FIND_DATAW) +LPWORD = PWORD = ctypes.POINTER(WORD) |