(4)
generic
type Index is (<>);
type Element is private;
type Element_Array is array (Index range <>) of aliased Element;
Default_Terminator : Element;
package Interfaces.C.Pointers is
pragma Preelaborate(Pointers);
(5)
type Pointer is access all Element;
(6)
function Value(Ref : in Pointer;
Terminator : in Element := Default_Terminator)
return Element_Array;
(7)
function Value(Ref : in Pointer;
Length : in ptrdiff_t)
return Element_Array;
(8)
Pointer_Error : exception;
(9)
-- C-style Pointer arithmetic
(10)
function "+" (Left : in Pointer; Right : in ptrdiff_t) return Pointer;
function "+" (Left : in ptrdiff_t; Right : in Pointer) return Pointer;
function "-" (Left : in Pointer; Right : in ptrdiff_t) return Pointer;
function "-" (Left : in Pointer; Right : in Pointer) return ptrdiff_t;
(11)
procedure Increment (Ref : in out Pointer);
procedure Decrement (Ref : in out Pointer);
(12)
pragma Convention (Intrinsic, "+");
pragma Convention (Intrinsic, "-");
pragma Convention (Intrinsic, Increment);
pragma Convention (Intrinsic, Decrement);
(13)
function Virtual_Length (Ref : in Pointer;
Terminator : in Element := Default_Terminator)
return ptrdiff_t;
(14)
procedure Copy_Terminated_Array (Source : in Pointer;
Target : in Pointer;
Limit : in ptrdiff_t := ptrdiff_t'Last;
Terminator : in Element := Default_Terminator);
(15)
procedure Copy_Array (Source : in Pointer;
Target : in Pointer;
Length : in ptrdiff_t);
(16)
end Interfaces.C.Pointers;
(20)
function Value(Ref : in Pointer;
Terminator : in Element := Default_Terminator)
return Element_Array;
(22)
function Value(Ref : in Pointer;
Length : in ptrdiff_t)
return Element_Array;
(25)
procedure Increment (Ref : in out Pointer);
(27)
procedure Decrement (Ref : in out Pointer);
(29)
function Virtual_Length (Ref : in Pointer;
Terminator : in Element := Default_Terminator)
return ptrdiff_t;
(31)
procedure Copy_Terminated_Array (Source : in Pointer;
Target : in Pointer;
Limit : in ptrdiff_t := ptrdiff_t'Last;
Terminator : in Element := Default_Terminator);
(33)
procedure Copy_Array (Source : in Pointer;
Target : in Pointer;
Length : in ptrdiff_t);
(44)
Some_Array : Element_Array(0..5) ;
Some_Pointer : Pointer := Some_Array(0)'Access;
(46)
with Interfaces.C.Pointers;
with Interfaces.C.Strings;
procedure Test_Pointers is
package C renames Interfaces.C;
package Char_Ptrs is
new C.Pointers (Index => C.size_t,
Element => C.char,
Element_Array => C.char_array,
Default_Terminator => C.nul);
(47)
use type Char_Ptrs.Pointer;
subtype Char_Star is Char_Ptrs.Pointer;
(48)
procedure Strcpy (Target_Ptr, Source_Ptr : Char_Star) is
Target_Temp_Ptr : Char_Star := Target_Ptr;
Source_Temp_Ptr : Char_Star := Source_Ptr;
Element : C.char;
begin
if Target_Temp_Ptr = null or Source_Temp_Ptr = null then
raise C.Strings.Dereference_Error;
end if;
(49)
loop
Element := Source_Temp_Ptr.all;
Target_Temp_Ptr.all := Element;
exit when Element = C.nul;
Char_Ptrs.Increment(Target_Temp_Ptr);
Char_Ptrs.Increment(Source_Temp_Ptr);
end loop;
end Strcpy;
begin
...
end Test_Pointers;
-- Email comments, additions, corrections, gripes, kudos, etc. to: