^^^^^^^^^^^^^^^^^
You can call these functions like any other Python callable. This example uses
-the ``time()`` function, which returns system time in seconds since the Unix
-epoch, and the ``GetModuleHandleA()`` function, which returns a win32 module
-handle.
+the ``rand()`` function, which takes no arguments and returns a pseudo-random integer::
-This example calls both functions with a ``NULL`` pointer (``None`` should be used
-as the ``NULL`` pointer)::
+ >>> print(libc.rand()) # doctest: +SKIP
+ 1804289383
+
+On Windows, you can call the ``GetModuleHandleA()`` function, which returns a win32 module
+handle (passing ``None`` as single argument to call it with a ``NULL`` pointer)::
- >>> print(libc.time(None)) # doctest: +SKIP
- 1150640792
>>> print(hex(windll.kernel32.GetModuleHandleA(None))) # doctest: +WINDOWS
0x1d000000
>>>
| :class:`c_ssize_t` | :c:type:`ssize_t` or | int |
| | :c:type:`Py_ssize_t` | |
+----------------------+------------------------------------------+----------------------------+
+| :class:`c_time_t` | :c:type:`time_t` | int |
++----------------------+------------------------------------------+----------------------------+
| :class:`c_float` | :c:type:`float` | float |
+----------------------+------------------------------------------+----------------------------+
| :class:`c_double` | :c:type:`double` | float |
return types can be specified by setting the :attr:`restype` attribute of the
function object.
+The C prototype of ``time()`` is ``time_t time(time_t *)``. Because ``time_t``
+might be of a different type than the default return type ``int``, you should
+specify the ``restype``::
+
+ >>> libc.time.restype = c_time_t
+
+The argument types can be specified using ``argtypes``::
+
+ >>> libc.time.argtypes = (POINTER(c_time_t),)
+
+To call the function with a ``NULL`` pointer as first argument, use ``None``::
+
+ >>> print(libc.time(None)) # doctest: +SKIP
+ 1150640792
+
Here is a more advanced example, it uses the ``strchr`` function, which expects
a string pointer and a char, and returns a pointer to a string::
.. versionadded:: 3.2
+.. class:: c_time_t
+
+ Represents the C :c:type:`time_t` datatype.
+
+ .. versionadded:: 3.12
+
+
.. class:: c_ubyte
Represents the C :c:type:`unsigned char` datatype, it interprets the value as
from _ctypes import __version__ as _ctypes_version
from _ctypes import RTLD_LOCAL, RTLD_GLOBAL
from _ctypes import ArgumentError
+from _ctypes import SIZEOF_TIME_T
from struct import calcsize as _calcsize
elif sizeof(kind) == 8: c_uint64 = kind
del(kind)
+if SIZEOF_TIME_T == 8:
+ c_time_t = c_int64
+elif SIZEOF_TIME_T == 4:
+ c_time_t = c_int32
+else:
+ raise SystemError(f"Unexpected sizeof(time_t): {SIZEOF_TIME_T=}")
+
_reset_cache()