%eclent; ]> Objects Overview Objects are entities that can allocated, referred to by pointers, and can be freed. allocate-foreign-object Allocates an instance of a foreign object. Macro allocate-foreign-object type &optional; size type The type of foreign object to allocate. This parameter is evaluated. size An optional size parameter that is evaluated. If specified, allocates and returns an array of type that is size members long. This parameter is evaluated. returns A pointer to the foreign object. Description Allocates an instance of a foreign object. It returns a pointer to the object. Examples (def-struct ab (a :int) (b :double)) (allocate-foreign-object 'ab) => #<ptr> Side Effects None. Affected by None. Exceptional Situations None. free-foreign-object Frees memory that was allocated for a foreign boject. Macro free-foreign-object ptr ptr A pointer to the allocated foreign object to free. Description Frees the memory used by the allocation of a foreign object. Side Effects None. Affected by None. Exceptional Situations None. with-foreign-object Wraps the allocation of a foreign object around a body of code. Macro with-foreign-object (var type) &body; body Arguments and Values var The variable name to bind. type The type of foreign object to allocate. This parameter is evaluated. returns The result of evaluating the body. Description This function wraps the allocation, binding, and destruction of a foreign object. On &CMUCL; and &LW; platforms the object is stack allocated for efficiency. Benchmarks show that &ACL; performs much better with static allocation. Examples (defun gethostname2 () "Returns the hostname" (uffi:with-foreign-object (name '(:array :unsigned-char 256)) (if (zerop (c-gethostname (uffi:char-array-to-pointer name) 256)) (uffi:convert-from-foreign-string name) (error "gethostname() failed.")))) Side Effects None. Affected by None. Exceptional Situations None. size-of-foreign-type Returns the number of data bytes used by a foreign object type. Macro size-of-foreign-type ftype ftype A foreign type specifier. This parameter is evaluated. Description Returns the number of data bytes used by a foreign object type. This does not include any Lisp storage overhead. Examples (size-of-foreign-object :unsigned-byte) => 1 (size-of-foreign-object 'my-100-byte-vector-type) => 100 Side Effects None. Affected by None. Exceptional Situations None. pointer-address Returns the address of a pointer. Macro pointer-address ptr ptr A pointer to a foreign object. returns An integer representing the pointer's address. Description Returns the address as an integer of a pointer. Side Effects None. Affected by None. Exceptional Situations None. deref-pointer Deferences a pointer. Macro deref-pointer ptr type ptr A pointer to a foreign object. type A foreign type of the object being pointed to. returns The value of the object where the pointer points. Description Returns the object to which a pointer points. Examples (let ((intp (allocate-foreign-object :int))) (setf (deref-pointer intp :int) 10) (prog1 (deref-pointer intp :int) (free-foreign-object intp))) => 10 Notes The TYPE argument is ignored for CL implementations other than AllegroCL. If you want to cast a pointer to another type use WITH-CAST-POINTER together with DEREF-POINTER/DEREF-ARRAY. Side Effects None. Affected by None. Exceptional Situations None. ensure-char-character Ensures that a dereferenced :char pointer is a character. Macro ensure-char-character object object Either a character or a integer specifying a character code. returns A character. Description Ensures that an objects obtained by dereferencing :char and :unsigned-char pointers are a lisp character. Examples (let ((fs (convert-to-foreign-string "a"))) (prog1 (ensure-char-character (deref-pointer fs :char)) (free-foreign-object fs))) => #\a Side Effects None. Affected by None. Exceptional Situations Depending upon the implementation and what &UFFI; expects, this macro may signal an error if the object is not a character or integer. ensure-char-integer Ensures that a dereferenced :char pointer is an integer. Macro ensure-char-integer object object Either a character or a integer specifying a character code. returns An integer. Description Ensures that an object obtained by dereferencing a :char pointer is an integer. Examples (let ((fs (convert-to-foreign-string "a"))) (prog1 (ensure-char-integer (deref-pointer fs :char)) (free-foreign-object fs))) => 96 Side Effects None. Affected by None. Exceptional Situations Depending upon the implementation and what &UFFI; expects, this macro may signal an error if the object is not a character or integer. make-null-pointer Create a &NULL; pointer. Macro make-null-pointer type type A type of object to which the pointer refers. returns The &NULL; pointer of type type. Description Creates a &NULL; pointer of a specified type. Side Effects None. Affected by None. Exceptional Situations None. null-pointer-p Tests a pointer for &NULL; value. Macro null-pointer-p ptr ptr A foreign object pointer. returns The boolean flag. Description A predicate testing if a pointer is has a &NULL; value. Side Effects None. Affected by None. Exceptional Situations None. +null-cstring-pointer+ A constant &NULL; cstring pointer. Constant Description A &NULL; cstring pointer. This can be used for testing if a cstring returned by a function is &NULL;. with-cast-pointer Wraps a body of code with a pointer cast to a new type. Macro with-cast-pointer (binding-name ptr type) &body; body binding-name A symbol which will be bound to the casted object. ptr A pointer to a foreign object. type A foreign type of the object being pointed to. returns The value of the object where the pointer points. Description Executes BODY with POINTER cast to be a pointer to type TYPE. BINDING-NAME is will be bound to this value during the execution of BODY. This is a no-op in AllegroCL but will wrap BODY in a LET form if BINDING-NAME is provided. This macro is meant to be used in conjunction with DEREF-POINTER or DEREF-ARRAY. In Allegro CL the "cast" will actually take place in DEREF-POINTER or DEREF-ARRAY. Examples (with-foreign-object (size :int) ;; FOO is a foreign function returning a :POINTER-VOID (let ((memory (foo size))) (when (mumble) ;; at this point we know for some reason that MEMORY points ;; to an array of unsigned bytes (with-cast-pointer (memory :unsigned-byte) (dotimes (i (deref-pointer size :int)) (do-something-with (deref-array memory '(:array :unsigned-byte) i))))))) Side Effects None. Affected by None. Exceptional Situations None. def-foreign-var Defines a symbol macro to access a variable in foreign code Macro def-foreign-var name type module name A string or list specificying the symbol macro's name. If it is a string, that names the foreign variable. A Lisp name is created by translating #\_ to #\- and by converting to upper-case in case-insensitive Lisp implementations. If it is a list, the first item is a string specifying the foreign variable name and the second it is a symbol stating the Lisp name. type A foreign type of the foreign variable. module A string specifying the module (or library) the foreign variable resides in. (Required by Lispworks) Description Defines a symbol macro which can be used to access (get and set) the value of a variable in foreign code. Examples C code int baz = 3; typedef struct { int x; double y; } foo_struct; foo_struct the_struct = { 42, 3.2 }; int foo () { return baz; } Lisp code (uffi:def-struct foo-struct (x :int) (y :double)) (uffi:def-function ("foo" foo) () :returning :int :module "foo") (uffi:def-foreign-var ("baz" *baz*) :int "foo") (uffi:def-foreign-var ("the_struct" *the-struct*) foo-struct "foo") *baz* => 3 (incf *baz*) => 4 (foo) => 4 Side Effects None. Affected by None. Exceptional Situations None.