3131import ctypes
3232from . import _cstd
3333from .exceptions import InvalidBindingParameter
34+ from .pointer import Pointer
3435
3536if TYPE_CHECKING :
3637 from .struct import Struct
3738
3839T = TypeVar ("T" )
39- PointerLike = Union [TypedCPointer [Any ], VoidPointer ]
40+ PointerLike = Union [TypedCPointer [Any ], VoidPointer , None ]
4041StringLike = Union [str , bytes , VoidPointer , TypedCPointer [bytes ]]
41- Format = Union [str , bytes , PointerLike ]
42+ Format = Union [StringLike , PointerLike ]
43+ TypedPtr = Optional [TypedCPointer [T ]]
4244
4345__all__ = (
4446 "isalnum" ,
@@ -204,6 +206,19 @@ def _validate_args(
204206 if not isinstance (value , n_type ):
205207 v_type = type (value )
206208
209+ if (n_type is Pointer ) and (value is None ):
210+ continue
211+
212+ if (
213+ typ
214+ in {
215+ ctypes .c_char_p ,
216+ ctypes .c_void_p ,
217+ ctypes .POINTER ,
218+ }
219+ ) and (value is None ):
220+ continue
221+
207222 if ((v_type is ctypes .c_char_p ) and (n_type is bytes )) or (
208223 issubclass (v_type , _BaseCPointer ) and (typ is ctypes .c_void_p )
209224 ):
@@ -317,15 +332,15 @@ def setlocale(category: int, locale: StringLike) -> str:
317332 return _base (dll .setlocale , category , _make_char_pointer (locale ))
318333
319334
320- def frexp (x : float , exponent : TypedCPointer [int ]) -> int :
335+ def frexp (x : float , exponent : TypedPtr [int ]) -> int :
321336 return _base (dll .frexp , x , exponent )
322337
323338
324339def ldexp (x : float , exponent : int ) -> int :
325340 return _base (dll .ldexp , x , exponent )
326341
327342
328- def modf (x : float , integer : TypedCPointer [float ]) -> int :
343+ def modf (x : float , integer : TypedPtr [float ]) -> int :
329344 return _base (dll .modf , x , integer )
330345
331346
@@ -362,7 +377,7 @@ def fopen(filename: StringLike, mode: StringLike) -> VoidPointer:
362377
363378
364379def fread (
365- ptr : TypedCPointer [ Any ] ,
380+ ptr : PointerLike ,
366381 size : int ,
367382 nmemb : int ,
368383 stream : PointerLike ,
@@ -396,7 +411,7 @@ def ftell(stream: PointerLike) -> int:
396411
397412
398413def fwrite (
399- ptr : TypedCPointer [ Any ] ,
414+ ptr : PointerLike ,
400415 size : int ,
401416 nmemb : int ,
402417 stream : PointerLike ,
@@ -544,13 +559,13 @@ def perror(string: StringLike) -> None:
544559 return _base (dll .perror , _make_char_pointer (string ))
545560
546561
547- def strtod (string : StringLike , endptr : TypedCPointer [ str ] ) -> int :
562+ def strtod (string : StringLike , endptr : PointerLike ) -> int :
548563 return _base (dll .strtod , _make_char_pointer (string ), endptr )
549564
550565
551566def strtol (
552567 string : StringLike ,
553- endptr : TypedCPointer [ str ] ,
568+ endptr : PointerLike ,
554569 base : int ,
555570) -> int :
556571 return _base (
@@ -563,7 +578,7 @@ def strtol(
563578
564579def strtoul (
565580 string : StringLike ,
566- endptr : TypedCPointer [ str ] ,
581+ endptr : PointerLike ,
567582 base : int ,
568583) -> int :
569584 return _base (
@@ -640,35 +655,35 @@ def wctomb(string: StringLike, wchar: str) -> int:
640655 return _base (dll .wctomb , _make_char_pointer (string ), wchar )
641656
642657
643- def memchr (string : TypedCPointer [ Any ] , c : int , n : int ) -> VoidPointer :
658+ def memchr (string : PointerLike , c : int , n : int ) -> VoidPointer :
644659 return _base (dll .memchr , string , c , n )
645660
646661
647662def memcmp (
648- str1 : TypedCPointer [ Any ] ,
649- str2 : TypedCPointer [ Any ] ,
663+ str1 : PointerLike ,
664+ str2 : PointerLike ,
650665 n : int ,
651666) -> int :
652667 return _base (dll .memcmp , str1 , str2 , n )
653668
654669
655670def memcpy (
656- dest : TypedCPointer [ Any ] ,
657- src : TypedCPointer [ Any ] ,
671+ dest : PointerLike ,
672+ src : PointerLike ,
658673 n : int ,
659674) -> VoidPointer :
660675 return _base (dll .memcpy , dest , src , n )
661676
662677
663678def memmove (
664- dest : TypedCPointer [ Any ] ,
665- src : TypedCPointer [ Any ] ,
679+ dest : PointerLike ,
680+ src : PointerLike ,
666681 n : int ,
667682) -> VoidPointer :
668683 return _base (dll .memmove , dest , src , n )
669684
670685
671- def memset (string : TypedCPointer [ Any ] , c : int , n : int ) -> VoidPointer :
686+ def memset (string : PointerLike , c : int , n : int ) -> VoidPointer :
672687 return _base (dll .memset , string , c , n )
673688
674689
@@ -804,7 +819,7 @@ def clock() -> int:
804819 return _base (dll .clock )
805820
806821
807- def ctime (timer : TypedCPointer [int ]) -> str :
822+ def ctime (timer : TypedPtr [int ]) -> str :
808823 return _base (dll .ctime , timer )
809824
810825
@@ -831,7 +846,7 @@ def strftime(
831846 )
832847
833848
834- def time (timer : TypedCPointer [int ]) -> int :
849+ def time (timer : TypedPtr [int ]) -> int :
835850 return _base (dll .time , timer )
836851
837852
0 commit comments