$c_malloc/2

Module: builtins

$c_malloc/2 — Allocates a C data area using the system malloc call
$c_free/1 — Frees a C data area
$c_set/2 — Modifies the contents of a C data area or a UIA
$c_examine/2 — Examines the contents of a C data area or a UIA

FORMS

'$c_malloc'(Size, Ptr)

'$c_free'(Ptr)

'$c_set'(Ptr_or_UIA, FormatList)

'$c_examine'(Ptr_or_UIA, FormatList)

DESCRIPTION

The following predicates are low-level C-defined builtins in ALS Prolog, providing access to C data areas, as well as UIAs treated as such data areas.

'$c_malloc'/2 allocates a C data area. '$c_malloc'(Size, Ptr) is true if Size is a positive integer and Ptr (an integer) unifies with the address of the first byte of a data area allocated by the system call "malloc". The call fails if malloc returns a null pointer.

'$c_free'/1 frees a C data area. '$c_free'(Ptr) is true if Ptr is a number, and it invokes the system call "free" to free the data area pointed by Ptr.

The next two predicates make use of the following encoding of C types:

      1  -- int
      2  -- unsigned int
      3  -- long
      4  -- unsigned long
      5  -- pointer
      6  -- char
      7  -- unsigned char
      8  -- short
      9  -- unsigned short
      10 -- string
      11 -- string of given length (length is 4th arg)
      12 -- float
      13 -- double
      14 -- far pointer  (DOS only)
      15 -- raw data of given length

'$c_set'/2 is used to modify the contents of a C data area or a UIA.

'$c_set'(Ptr_or_UIA, FormatList)`

is true if Ptr_or_UIA is bound to the address of a C data area or a UIA, and FormatList is a non-empty list of 3-ary or 4-ary terms of the form

f(Offset, Type, Value {, Length }) (Length is used only with type code 11)

The complete call modifies the contents of the data area corresponding to each such term as follows:
In each term, Offset is the offset of the field from the start address of the data area. Type is the C type code (as given above) of the field. Value is the data that the field should be set to. Value should be a prolog entity whose type corresponds naturally to the C entity type coded by Type. Numeric C types require an appropriate prolog number. If Type is 10 or 11, then Value must be an atom (including possiblly a UIA), and a null terminated C string name of the atom is copied into the receiving data are without overflow checks. In the case of Type==11, at most Length bytes are copied into the receiving data area.

'$c_examine'/2 is used to examine the contents of a C data area or a UIA. '$c_examine'(Ptr_or_UIA, FormatList) is true if Ptr_or_UIA is bound to the address of a C data area or a UIA, and FormatList is a nonempty list of 3-ary or 4-ary terms of the form

f(Offset, Type, Value{, Length })

whose arguments are interpreted as in '$c_set/2 (above) except that now a data item of the specified type is extracted from the data area and unified with Value.

EXAMPLES

?- Size = 1000, '$c_malloc'(Size, Ptr).

Size=1000 
Ptr=33558528 

yes.

?- '$c_malloc'(1000, Ptr), '$c_set'(Ptr,[f(0,12,14.5)]), '$c_examine'(Ptr,[g(0,12,X)]).

Ptr=41947136 
X=14.5 

yes.

?- UIA = 'Phantom', Value = w2g, '$c_set'(UIA, [f(3, 10, Value)]).

UIA='Phaw2g' 
Value=w2g 

yes.

?- UIA = 'Phantom', '$c_examine'(UIA, [f(2, 10, Value)]).

UIA='Phantom' 
Value=antom 

yes.

?- UIA = 'Phantom', '$c_examine'(UIA, [f(2, 11, Value, 3)]).

UIA='Phantom' 
Value=ant 

yes.

NOTES

A slightly higher-level collection of C data access predicates is implemented over the predicates above in ~builtins/cutils.pro. See c_alloc/[2,3] and c_create/3.