r1584: *** empty log message ***
[uffi.git] / doc / ref.sgml
1 <!-- -*- DocBook -*- -->
2
3   
4 <reference>
5   <title>Declarations</title>
6
7   <partintro>
8     <sect1>
9       <title>Overview</title>
10       <para>Declarations are used to give the compiler optimizing
11         information about foreign types. Currently, only &cmucl;
12         supports declarations. On &acl; and &lw;, these expressions 
13         declare the type generically as &t;
14       </para>
15     </sect1>
16   </partintro>
17
18       <refentry id="def-type">
19         <refnamediv>
20           <refname>def-type</refname>
21         <refpurpose>Defines a Common Lisp type. 
22         </refpurpose>
23         <refclass>Macro</refclass>
24       </refnamediv>
25       <refsynopsisdiv>
26         <title>Syntax</title>
27         <synopsis>
28           <function>def-type</function> <replaceable>name type</replaceable>
29         </synopsis>
30       </refsynopsisdiv>
31       <refsect1>
32         <title>Arguments and Values</title>
33         <variablelist>
34           <varlistentry>
35             <term><parameter>name</parameter></term>
36             <listitem>
37               <para>A symbol naming the type</para>
38             </listitem>
39           </varlistentry>
40           <varlistentry>
41             <term><parameter>type</parameter></term>
42             <listitem>
43               <para>A form that is evaluated that specifies the &uffi; type.
44               </para>
45             </listitem>
46           </varlistentry>
47         </variablelist>
48       </refsect1>
49       <refsect1>
50         <title>Description</title>
51         <para>Defines a Common Lisp type based on a &uffi; type.
52         </para>
53       </refsect1>
54       <refsect1>
55         <title>Examples</title>
56         <programlisting>
57 (def-type char-ptr '(* :char))
58 ...
59 (defun foo (ptr)
60   (declare (type char-ptr ptr))
61   ...
62         </programlisting>
63       </refsect1>
64       <refsect1>
65         <title>Side Effects</title>
66         <para>Defines a new &cl; type.</para>
67       </refsect1>
68       <refsect1>
69         <title>Affected by</title>
70         <para>None.</para>
71       </refsect1>
72       <refsect1>
73         <title>Exceptional Situations</title>
74         <para>None.</para>
75       </refsect1>
76     </refentry>
77   </reference>
78
79
80   <reference>
81     <title>Primitive Types</title>
82     <partintro>
83       <title>Overview</title>
84         <para>
85           Primitive types have a single value, these include
86           characters, numbers, and pointers. They are all symbols in
87           the keyword package.
88         </para>
89         <itemizedlist>
90           <listitem>
91             <para><constant>:char</constant> - Signed 8-bits. A
92 dereferenced :char pointer returns an character.</para>
93           </listitem>
94           <listitem>
95             <para><constant>:unsigned-char</constant> - Unsigned 8-bits. A dereferenced :unsigned-char
96 pointer returns an character.</para>
97           </listitem>
98           <listitem>
99             <para><constant>:byte</constant> - Unsigned 8-bits. A
100 dereferenced :byte pointer returns an integer.</para>
101           </listitem>
102           <listitem>
103             <para><constant>:short</constant> - Signed 16-bits.</para>
104           </listitem>
105           <listitem>
106             <para><constant>:unsigned-short</constant> - Unsigned 16-bits.</para>
107           </listitem>
108           <listitem>
109             <para><constant>:int</constant> - Signed 32-bits.</para>
110           </listitem>
111           <listitem>
112             <para><constant>:unsigned-int</constant> - Unsigned 32-bits.</para>
113           </listitem>
114           <listitem>
115             <para><constant>:long</constant> - Signed 32-bits.</para>
116           </listitem>
117           <listitem>
118             <para><constant>:unsigned-long</constant> - Unsigned 32-bits.</para>
119           </listitem>
120           <listitem>
121             <para><constant>:float</constant> - 32-bit floating point.</para>
122           </listitem>
123           <listitem>
124             <para><constant>:double</constant> - 64-bit floating point.</para>
125           </listitem>
126           <listitem>
127             <para><constant>:cstring</constant> - 
128 A &null; terminated string used for passing and returning characters strings with a &c; function.
129             </para>
130           </listitem>
131           <listitem>
132             <para><constant>:void</constant> - 
133 The absence of a value. Used to indicate that a function does not return a value.</para>
134           </listitem>
135           <listitem>
136             <para><constant>:pointer-void</constant> - 
137 Points to a generic object.</para>
138           </listitem>
139           <listitem>
140             <para><constant>*</constant> - Used to declare a pointer to an object</para>
141           </listitem>
142         </itemizedlist>
143       </partintro>
144
145       <refentry id="def-constant">
146         <refnamediv>
147           <refname>def-constant</refname>
148         <refpurpose>Binds a symbol to a constant. 
149         </refpurpose>
150         <refclass>Macro</refclass>
151       </refnamediv>
152       <refsynopsisdiv>
153         <title>Syntax</title>
154         <synopsis>
155           <function>def-constant</function> <replaceable>name value &amp;key export</replaceable>
156         </synopsis>
157       </refsynopsisdiv>
158       <refsect1>
159         <title>Arguments and Values</title>
160         <variablelist>
161           <varlistentry>
162             <term><parameter>name</parameter></term>
163             <listitem>
164               <para>A symbol that will be bound to the value.
165               </para>
166             </listitem>
167           </varlistentry>
168           <varlistentry>
169             <term><parameter>value</parameter></term>
170             <listitem>
171               <para>An evaluated form that is bound the the name.
172               </para>
173             </listitem>
174           </varlistentry>
175           <varlistentry>
176             <term><parameter>export</parameter></term>
177             <listitem>
178               <para>When &t;, the name is exported from the current package. The default is &nil;</para>
179             </listitem>
180           </varlistentry>
181         </variablelist>
182       </refsect1>
183       <refsect1>
184         <title>Description</title>
185         <para>
186           This is a thin wrapper around
187           <function>defconstant</function>. It evaluates at
188             compile-time and optionally exports the symbol from the package.
189         </para>
190       </refsect1>
191       <refsect1>
192         <title>Examples</title>
193         <programlisting>
194 (def-constant pi2 (* 2 pi))
195 (def-constant exported-pi2 (* 2 pi) :export t)
196         </programlisting>
197       </refsect1>
198       <refsect1>
199         <title>Side Effects</title>
200         <para>Creates a new special variable..</para>
201       </refsect1>
202       <refsect1>
203         <title>Affected by</title>
204         <para>None.</para>
205       </refsect1>
206       <refsect1>
207         <title>Exceptional Situations</title>
208         <para>None.</para>
209       </refsect1>
210     </refentry>
211
212     <refentry id="def-foreign-type">
213         <refnamediv>
214           <refname>def-foreign-type</refname>
215         <refpurpose>Defines a new foreign type. 
216         </refpurpose>
217         <refclass>Macro</refclass>
218       </refnamediv>
219       <refsect1>
220         <title>Syntax</title>
221 <synopsis>
222           <function>def-foreign-type</function> <replaceable>name type</replaceable>
223 </synopsis>
224       </refsect1>
225       <refsect1>
226         <title>Arguments and Values</title>
227         <variablelist>
228           <varlistentry>
229             <term><parameter>name</parameter></term>
230             <listitem>
231               <para>A symbol naming the new foreign type.
232               </para>
233             </listitem>
234           </varlistentry>
235           <varlistentry>
236             <term><parameter>value</parameter></term>
237             <listitem>
238               <para>A form that is not evaluated that defines the new
239 foreign type.
240               </para>
241             </listitem>
242           </varlistentry>
243         </variablelist>
244       </refsect1>
245       <refsect1>
246         <title>Description</title>
247         <para>Defines a new foreign type.
248         </para>
249       </refsect1>
250       <refsect1>
251         <title>Examples</title>
252         <programlisting>
253 (def-foreign-type my-generic-pointer :pointer-void)
254 (def-foreign-type a-double-float :double-float)
255 (def-foreign-type char-ptr (* :char))
256         </programlisting>
257       </refsect1>
258       <refsect1>
259         <title>Side Effects</title>
260         <para>Defines a new foreign type.
261         </para>
262       </refsect1>
263       <refsect1>
264         <title>Affected by</title>
265         <para>None.</para>
266       </refsect1>
267       <refsect1>
268         <title>Exceptional Situations</title>
269         <para>None.</para>
270       </refsect1>
271     </refentry>
272
273     <refentry id="null-char-p">
274         <refnamediv>
275           <refname>null-char-p</refname>
276         <refpurpose>Tests a character for &null; value.
277         </refpurpose>
278         <refclass>Macro</refclass>
279       </refnamediv>
280       <refsect1>
281         <title>Syntax</title>
282 <synopsis>
283           <function>null-char-p</function> <replaceable>char</replaceable> => <returnvalue>is-null</returnvalue>
284 </synopsis>
285       </refsect1>
286       <refsect1>
287         <title>Arguments and Values</title>
288         <variablelist>
289           <varlistentry>
290             <term><parameter>char</parameter></term>
291             <listitem>
292               <para>A character or integer.
293               </para>
294             </listitem>
295           </varlistentry>
296           <varlistentry>
297             <term><parameter>is-null</parameter></term>
298             <listitem>
299               <para>A boolean flag indicating if char is a &null; value.
300               </para>
301             </listitem>
302           </varlistentry>
303         </variablelist>
304       </refsect1>
305       <refsect1>
306         <title>Description</title>
307         <para>
308           A predicate testing if a character or integer is &null;. This
309 abstracts the difference in implementations where some return a 
310 <computeroutput>character</computeroutput> and some return a 
311 <computeroutput>integer</computeroutput> whence dereferencing a 
312 <computeroutput>C</computeroutput> character pointer.
313         </para>
314       </refsect1>
315       <refsect1>
316         <title>Examples</title>
317         <programlisting>
318 (def-array ca :char)
319 (let ((fs (convert-to-foreign-string "ab")))
320    (values (null-char-p (deref-array fs 'ca 0))
321            (null-char-p (deref-array fs 'ca 2))))
322 => &nil;
323    &t;
324         </programlisting>
325       </refsect1>
326       <refsect1>
327         <title>Side Effects</title>
328         <para>None.
329         </para>
330       </refsect1>
331       <refsect1>
332         <title>Affected by</title>
333         <para>None.</para>
334       </refsect1>
335       <refsect1>
336         <title>Exceptional Situations</title>
337         <para>None.</para>
338       </refsect1>
339     </refentry>
340   </reference>
341
342   <reference>
343     <title>Aggregate Types</title>
344     <partintro>
345       <title>Overview</title>
346       <para>
347         Aggregate types are comprised of one or more primitive types.
348       </para>
349     </partintro>
350
351     <refentry id="def-enum">
352       <refnamediv>
353         <refname>def-enum</refname>
354         <refpurpose>Defines a &c; enumeration.
355         </refpurpose>
356         <refclass>Macro</refclass>
357       </refnamediv>
358       <refsynopsisdiv>
359         <title>Syntax</title>
360         <synopsis>
361           <function>def-enum</function> <replaceable>name fields &amp;key separator-string</replaceable>
362         </synopsis>
363       </refsynopsisdiv>
364       <refsect1>
365         <title>Arguments and Values</title>
366         <variablelist>
367           <varlistentry>
368             <term><parameter>name</parameter></term>
369             <listitem>
370               <para>A symbol that names the enumeration.
371               </para>
372             </listitem>
373           </varlistentry>
374           <varlistentry>
375             <term><parameter>fields</parameter></term>
376             <listitem>
377               <para>A list of field defintions. Each definition can be
378 a symbol or a list of two elements. Symbols get assigned a value of the
379 current counter which starts at <computeroutput>0</computeroutput> and
380 increments by <computeroutput>1</computeroutput> for each subsequent symbol. It the field definition is a list, the first position is the symbol and the second
381 position is the value to assign the the symbol. The current counter gets set
382 to <computeroutput>1+</computeroutput> this value.
383               </para>
384             </listitem>
385           </varlistentry>
386           <varlistentry>
387             <term><parameter>separator-string</parameter></term>
388             <listitem>
389               <para>A string that governs the creation of constants. The
390 default is <computeroutput>"#"</computeroutput>.</para>
391             </listitem>
392           </varlistentry>
393         </variablelist>
394       </refsect1>
395       <refsect1>
396         <title>Description</title>
397         <para>
398           Declares a &c; enumeration. It generates constants with integer values for the elements of the enumeration. The symbols for the these constant
399 values are created by the <function>concatenation</function> of the
400 enumeration name, separator-string, and field symbol. Also creates
401 a foreign type with the name <parameter>name</parameter> of type
402 <constant>:int</constant>.
403         </para>
404       </refsect1>
405       <refsect1>
406         <title>Examples</title>
407         <programlisting>
408 (def-enum abc (:a :b :c)) 
409 ;; Creates constants abc#a (1), abc#b (2), abc#c (3) and defines
410 ;; the foreign type "abc" to be :int
411
412 (def-enum efoo (:e1 (:e2 10) :e3) :separator-string "-")
413 ;; Creates constants efoo-e1 (1), efoo-e2 (10), efoo-e3 (11) and defines
414 ;; the foreign type efoo to be :int
415         </programlisting>
416       </refsect1>
417       <refsect1>
418         <title>Side Effects</title>
419         <para>Creates a :int foreign type, defines constants.</para>
420       </refsect1>
421       <refsect1>
422         <title>Affected by</title>
423         <para>None.</para>
424       </refsect1>
425       <refsect1>
426         <title>Exceptional Situations</title>
427         <para>None.</para>
428       </refsect1>
429     </refentry>
430
431
432       <refentry id="def-struct">
433         <refnamediv>
434           <refname>def-struct</refname>
435         <refpurpose>Defines a &c; structure.
436         </refpurpose>
437         <refclass>Macro</refclass>
438       </refnamediv>
439       <refsynopsisdiv>
440         <title>Syntax</title>
441         <synopsis>
442           <function>def-struct</function> <replaceable>name &amp;rest fields</replaceable>
443         </synopsis>
444       </refsynopsisdiv>
445       <refsect1>
446         <title>Arguments and Values</title>
447         <variablelist>
448           <varlistentry>
449             <term><parameter>name</parameter></term>
450             <listitem>
451               <para>A symbol that names the structure.
452               </para>
453             </listitem>
454           </varlistentry>
455           <varlistentry>
456             <term><parameter>fields</parameter></term>
457             <listitem>
458               <para>A variable number of field defintions. Each definition is a list consisting of a symbol naming the field followed by its foreign type.
459               </para>
460             </listitem>
461           </varlistentry>
462         </variablelist>
463       </refsect1>
464       <refsect1>
465         <title>Description</title>
466         <para>
467           Declares a structure. A special type is available as a slot
468 in the field. It is a pointer that points to an instance of the parent
469 structure. It's type is <constant>:pointer-self</constant>.
470
471         </para>
472       </refsect1>
473       <refsect1>
474         <title>Examples</title>
475         <programlisting>
476 (def-struct foo (a :unsigned-int) 
477                 (b (* :char)) 
478                 (c (:array :int 10)) 
479                 (next :pointer-self))
480         </programlisting>
481       </refsect1>
482       <refsect1>
483         <title>Side Effects</title>
484         <para>Creates a foreign type.</para>
485       </refsect1>
486       <refsect1>
487         <title>Affected by</title>
488         <para>None.</para>
489       </refsect1>
490       <refsect1>
491         <title>Exceptional Situations</title>
492         <para>None.</para>
493       </refsect1>
494     </refentry>
495
496
497     <refentry id="get-slot-value">
498       <refnamediv>
499         <refname>get-slot-value</refname>
500         <refpurpose>Retrieves a value from a slot of a structure.
501         </refpurpose>
502         <refclass>Macro</refclass>
503       </refnamediv>
504       <refsynopsisdiv>
505         <title>Syntax</title>
506         <synopsis>
507           <function>get-slot-value</function> <replaceable>obj type field</replaceable> => <returnvalue>value</returnvalue>
508         </synopsis>
509       </refsynopsisdiv>
510       <refsect1>
511         <title>Arguments and Values</title>
512         <variablelist>
513           <varlistentry>
514             <term><parameter>obj</parameter></term>
515             <listitem>
516               <para>A pointer to foreign structure.
517               </para>
518             </listitem>
519           </varlistentry>
520           <varlistentry>
521             <term><parameter>type</parameter></term>
522             <listitem>
523               <para>A name of the foreign structure.
524               </para>
525             </listitem>
526           </varlistentry>
527           <varlistentry>
528             <term><parameter>field</parameter></term>
529             <listitem>
530               <para>A name of the desired field in foreign structure.
531               </para>
532             </listitem>
533           </varlistentry>
534           <varlistentry>
535             <term><returnvalue>value</returnvalue></term>
536             <listitem>
537               <para>The value of the field in the structure.
538               </para>
539             </listitem>
540           </varlistentry>
541         </variablelist>
542       </refsect1>
543       <refsect1>
544         <title>Description</title>
545         <para>
546           Accesses a slot value from a structure.
547         </para>
548       </refsect1>
549       <refsect1>
550         <title>Examples</title>
551         <programlisting>
552 (get-slot-value foo-ptr 'foo-structure 'field-name)
553         </programlisting>
554       </refsect1>
555       <refsect1>
556         <title>Side Effects</title>
557         <para>None.</para>
558       </refsect1>
559       <refsect1>
560         <title>Affected by</title>
561         <para>None.</para>
562       </refsect1>
563       <refsect1>
564         <title>Exceptional Situations</title>
565         <para>None.</para>
566       </refsect1>
567     </refentry>
568
569     <refentry id="get-slot-pointer">
570       <refnamediv>
571         <refname>get-slot-pointer</refname>
572         <refpurpose>Retrieves a pointer from a slot of a structure.
573         </refpurpose>
574         <refclass>Macro</refclass>
575       </refnamediv>
576       <refsynopsisdiv>
577         <title>Syntax</title>
578         <synopsis>
579           <function>get-slot-pointer</function> <replaceable>obj type field</replaceable> => <returnvalue>pointer</returnvalue>
580         </synopsis>
581       </refsynopsisdiv>
582       <refsect1>
583         <title>Arguments and Values</title>
584         <variablelist>
585           <varlistentry>
586             <term><parameter>obj</parameter></term>
587             <listitem>
588               <para>A pointer to foreign structure.
589               </para>
590             </listitem>
591           </varlistentry>
592           <varlistentry>
593             <term><parameter>type</parameter></term>
594             <listitem>
595               <para>A name of the foreign structure.
596               </para>
597             </listitem>
598           </varlistentry>
599           <varlistentry>
600             <term><parameter>field</parameter></term>
601             <listitem>
602               <para>A name of the desired field in foreign structure.
603               </para>
604             </listitem>
605           </varlistentry>
606           <varlistentry>
607             <term><returnvalue>pointer</returnvalue></term>
608             <listitem>
609               <para>The value of the field in the structure.
610               </para>
611             </listitem>
612           </varlistentry>
613         </variablelist>
614       </refsect1>
615       <refsect1>
616         <title>Description</title>
617         <para>
618           This is similar to <function>get-slot-value</function>. It
619           is used when the value of a slot is a pointer type.
620         </para>
621       </refsect1>
622       <refsect1>
623         <title>Examples</title>
624         <programlisting>
625 (get-slot-pointer foo-ptr 'foo-structure 'my-char-ptr)
626         </programlisting>
627       </refsect1>
628       <refsect1>
629         <title>Side Effects</title>
630         <para>None.</para>
631       </refsect1>
632       <refsect1>
633         <title>Affected by</title>
634         <para>None.</para>
635       </refsect1>
636       <refsect1>
637         <title>Exceptional Situations</title>
638         <para>None.</para>
639       </refsect1>
640     </refentry>
641
642
643     <refentry id="def-array">
644       <refnamediv>
645         <refname>def-array</refname>
646         <refpurpose>Defines a foreign array type.
647         </refpurpose>
648         <refclass>Macro</refclass>
649       </refnamediv>
650       <refsynopsisdiv>
651         <title>Syntax</title>
652         <synopsis>
653           <function>def-array</function> <replaceable>name type</replaceable>
654         </synopsis>
655       </refsynopsisdiv>
656       <refsect1>
657         <title>Arguments and Values</title>
658         <variablelist>
659           <varlistentry>
660             <term><parameter>name</parameter></term>
661             <listitem>
662               <para>A name of the new foreign type.
663               </para>
664             </listitem>
665           </varlistentry>
666           <varlistentry>
667             <term><parameter>type</parameter></term>
668             <listitem>
669               <para>The foreign type of the array elements.
670               </para>
671             </listitem>
672           </varlistentry>
673         </variablelist>
674       </refsect1>
675       <refsect1>
676         <title>Description</title>
677         <para>
678           Defines a foreign array type.
679         </para>
680       </refsect1>
681       <refsect1>
682         <title>Examples</title>
683         <programlisting>
684 (def-array byte-array :unsigned-char)
685         </programlisting>
686       </refsect1>
687       <refsect1>
688         <title>Side Effects</title>
689         <para>Defines a new foreign type.</para>
690       </refsect1>
691       <refsect1>
692         <title>Affected by</title>
693         <para>None.</para>
694       </refsect1>
695       <refsect1>
696         <title>Exceptional Situations</title>
697         <para>None.</para>
698       </refsect1>
699     </refentry>
700
701
702     <refentry id="deref-array">
703       <refnamediv>
704         <refname>deref-array</refname>
705         <refpurpose>Deference an array.
706         </refpurpose>
707         <refclass>Macro</refclass>
708       </refnamediv>
709       <refsynopsisdiv>
710         <title>Syntax</title>
711         <synopsis>
712           <function>deref-array</function> <replaceable>array type positon</replaceable> => <returnvalue>value</returnvalue>
713         </synopsis>
714       </refsynopsisdiv>
715       <refsect1>
716         <title>Arguments and Values</title>
717         <variablelist>
718           <varlistentry>
719             <term><parameter>array</parameter></term>
720             <listitem>
721               <para>A foreign array.
722               </para>
723             </listitem>
724           </varlistentry>
725           <varlistentry>
726             <term><parameter>type</parameter></term>
727             <listitem>
728               <para>The foreign type of the array.
729               </para>
730             </listitem>
731           </varlistentry>
732           <varlistentry>
733             <term><parameter>position</parameter></term>
734             <listitem>
735               <para>An integer specifying the position to retrieve from
736 the array.
737               </para>
738             </listitem>
739           </varlistentry>
740           <varlistentry>
741             <term><returnvalue>value</returnvalue></term>
742             <listitem>
743               <para>The value stored in the position of the array.
744               </para>
745             </listitem>
746           </varlistentry>
747         </variablelist>
748       </refsect1>
749       <refsect1>
750         <title>Description</title>
751         <para>
752           Dereferences (retrieves) the value of an array element.
753         </para>
754       </refsect1>
755       <refsect1>
756         <title>Examples</title>
757         <programlisting>
758 (def-array ca :char)
759 (let ((fs (convert-to-foreign-string "ab")))
760    (values (null-char-p (deref-array fs 'ca 0))
761            (null-char-p (deref-array fs 'ca 2))))
762 => &nil;
763    &t;
764         </programlisting>
765       </refsect1>
766       <refsect1>
767         <title>Side Effects</title>
768         <para>None.</para>
769       </refsect1>
770       <refsect1>
771         <title>Affected by</title>
772         <para>None.</para>
773       </refsect1>
774       <refsect1>
775         <title>Exceptional Situations</title>
776         <para>None.</para>
777       </refsect1>
778     </refentry>
779 </reference>
780
781 <reference>
782     <title>Objects</title>
783 <partintro>
784 <title>Overview</title>
785     <para>
786       Objects are entities that can allocated and freed.
787     </para>
788 </partintro>
789
790
791     <refentry id="allocate-foreign-object">
792       <refnamediv>
793         <refname>allocate-foreign-object</refname>
794         <refpurpose>Allocates an instance of a foreign object.
795         </refpurpose>
796         <refclass>Macro</refclass>
797       </refnamediv>
798       <refsynopsisdiv>
799         <title>Syntax</title>
800         <synopsis>
801           <function>allocate-foreign-object</function> <replaceable>type</replaceable> => <returnvalue>ptr</returnvalue>
802         </synopsis>
803       </refsynopsisdiv>
804       <refsect1>
805         <title>Arguments and Values</title>
806         <variablelist>
807           <varlistentry>
808             <term><parameter>type</parameter></term>
809             <listitem>
810               <para>A type of foreign object to allocate.
811               </para>
812             </listitem>
813           </varlistentry>
814           <varlistentry>
815             <term><returnvalue>ptr</returnvalue></term>
816             <listitem>
817               <para>A pointer to the foreign object.
818               </para>
819             </listitem>
820           </varlistentry>
821         </variablelist>
822       </refsect1>
823       <refsect1>
824         <title>Description</title>
825         <para>
826           Allocates an instance of a foreign object. It returns a pointer to the object.
827         </para>
828       </refsect1>
829       <refsect1>
830         <title>Examples</title>
831         <programlisting>
832 (def-struct ab (a :int) (b :double))
833 (allocate-foreign-object ab)
834 => #&lt;ptr&gt;
835         </programlisting>
836       </refsect1>
837       <refsect1>
838         <title>Side Effects</title>
839         <para>None.</para>
840       </refsect1>
841       <refsect1>
842         <title>Affected by</title>
843         <para>None.</para>
844       </refsect1>
845       <refsect1>
846         <title>Exceptional Situations</title>
847         <para>None.</para>
848       </refsect1>
849     </refentry>
850
851
852     <refentry id="free-foreign-object">
853       <refnamediv>
854         <refname>free-foreign-object</refname>
855         <refpurpose>Frees memory that was allocated for a foreign boject.
856         </refpurpose>
857         <refclass>Macro</refclass>
858       </refnamediv>
859       <refsynopsisdiv>
860         <title>Syntax</title>
861         <synopsis>
862           <function>free-foreign-object</function> <replaceable>ptr</replaceable>
863         </synopsis>
864       </refsynopsisdiv>
865       <refsect1>
866         <title>Arguments and Values</title>
867         <variablelist>
868           <varlistentry>
869             <term><parameter>ptr</parameter></term>
870             <listitem>
871               <para>A pointer to the allocated foreign object to free.
872               </para>
873             </listitem>
874           </varlistentry>
875         </variablelist>
876       </refsect1>
877       <refsect1>
878         <title>Description</title>
879         <para>
880           Frees the memory used by the allocation of a foreign object.
881         </para>
882       </refsect1>
883       <refsect1>
884         <title>Side Effects</title>
885         <para>None.</para>
886       </refsect1>
887       <refsect1>
888         <title>Affected by</title>
889         <para>None.</para>
890       </refsect1>
891       <refsect1>
892         <title>Exceptional Situations</title>
893         <para>None.</para>
894       </refsect1>
895     </refentry>
896
897
898     <refentry id="pointer-address">
899       <refnamediv>
900         <refname>pointer-address</refname>
901         <refpurpose>Returns the address of a pointer.
902         </refpurpose>
903         <refclass>Macro</refclass>
904       </refnamediv>
905       <refsynopsisdiv>
906         <title>Syntax</title>
907         <synopsis>
908           <function>pointer-address</function> <replaceable>ptr</replaceable> => <returnvalue>address</returnvalue>
909         </synopsis>
910       </refsynopsisdiv>
911       <refsect1>
912         <title>Arguments and Values</title>
913         <variablelist>
914           <varlistentry>
915             <term><parameter>ptr</parameter></term>
916             <listitem>
917               <para>A pointer to a foreign object.
918               </para>
919             </listitem>
920           </varlistentry>
921           <varlistentry>
922             <term><parameter>address</parameter></term>
923             <listitem>
924               <para>An integer representing the pointer's address.
925               </para>
926             </listitem>
927           </varlistentry>
928         </variablelist>
929       </refsect1>
930       <refsect1>
931         <title>Description</title>
932         <para>
933           Returns the address as an integer of a pointer.
934         </para>
935       </refsect1>
936       <refsect1>
937         <title>Side Effects</title>
938         <para>None.</para>
939       </refsect1>
940       <refsect1>
941         <title>Affected by</title>
942         <para>None.</para>
943       </refsect1>
944       <refsect1>
945         <title>Exceptional Situations</title>
946         <para>None.</para>
947       </refsect1>
948     </refentry>
949
950
951     <refentry id="deref-pointer">
952       <refnamediv>
953         <refname>deref-pointer</refname>
954         <refpurpose>Deferences a pointer.
955         </refpurpose>
956         <refclass>Macro</refclass>
957       </refnamediv>
958       <refsynopsisdiv>
959         <title>Syntax</title>
960         <synopsis>
961           <function>deref-pointer</function> <replaceable>ptr type</replaceable> => <returnvalue>value</returnvalue>
962         </synopsis>
963       </refsynopsisdiv>
964       <refsect1>
965         <title>Arguments and Values</title>
966         <variablelist>
967           <varlistentry>
968             <term><parameter>ptr</parameter></term>
969             <listitem>
970               <para>A pointer to a foreign object.
971               </para>
972             </listitem>
973           </varlistentry>
974           <varlistentry>
975             <term><parameter>type</parameter></term>
976             <listitem>
977               <para>A foreign type of the object being pointed to.
978               </para>
979             </listitem>
980           </varlistentry>
981           <varlistentry>
982             <term><parameter>value</parameter></term>
983             <listitem>
984               <para>The value of the object where the pointer points.
985               </para>
986             </listitem>
987           </varlistentry>
988         </variablelist>
989       </refsect1>
990       <refsect1>
991         <title>Description</title>
992         <para>
993           Returns the object to which a pointer points.
994         </para>
995       </refsect1>
996       <refsect1>
997         <title>Examples</title>
998         <para>
999 <programlisting>
1000 (let ((fs (convert-to-foreign-string "a")))
1001   (prog1 
1002     (ensure-char (deref-pointer fs :char))
1003     (free-foreign-object fs)))
1004 => #\a
1005 </programlisting>
1006         </para>
1007       </refsect1>
1008       <refsect1>
1009         <title>Side Effects</title>
1010         <para>None.</para>
1011       </refsect1>
1012       <refsect1>
1013         <title>Affected by</title>
1014         <para>None.</para>
1015       </refsect1>
1016       <refsect1>
1017         <title>Exceptional Situations</title>
1018         <para>None.</para>
1019       </refsect1>
1020     </refentry>
1021
1022     <refentry id="make-null-pointer">
1023       <refnamediv>
1024         <refname>make-null-pointer</refname>
1025         <refpurpose>Create a &null; pointer.
1026         </refpurpose>
1027         <refclass>Macro</refclass>
1028       </refnamediv>
1029       <refsynopsisdiv>
1030         <title>Syntax</title>
1031         <synopsis>
1032           <function>make-null-pointer</function> <replaceable>type</replaceable> => <returnvalue>ptr</returnvalue>
1033         </synopsis>
1034       </refsynopsisdiv>
1035       <refsect1>
1036         <title>Arguments and Values</title>
1037         <variablelist>
1038           <varlistentry>
1039             <term><parameter>type</parameter></term>
1040             <listitem>
1041               <para>A type of object to which the pointer refers.
1042               </para>
1043             </listitem>
1044           </varlistentry>
1045           <varlistentry>
1046             <term><parameter>ptr</parameter></term>
1047             <listitem>
1048               <para>The &null; pointer of type <parameter>type</parameter>.
1049               </para>
1050             </listitem>
1051           </varlistentry>
1052         </variablelist>
1053       </refsect1>
1054       <refsect1>
1055         <title>Description</title>
1056         <para>
1057           Creates a &null; pointer of a specified type.
1058         </para>
1059       </refsect1>
1060       <refsect1>
1061         <title>Side Effects</title>
1062         <para>None.</para>
1063       </refsect1>
1064       <refsect1>
1065         <title>Affected by</title>
1066         <para>None.</para>
1067       </refsect1>
1068       <refsect1>
1069         <title>Exceptional Situations</title>
1070         <para>None.</para>
1071       </refsect1>
1072     </refentry>
1073
1074
1075     <refentry id="null-pointer-p">
1076       <refnamediv>
1077         <refname>null-pointer-p</refname>
1078         <refpurpose>Tests a pointer for &null; value.
1079         </refpurpose>
1080         <refclass>Macro</refclass>
1081       </refnamediv>
1082       <refsynopsisdiv>
1083         <title>Syntax</title>
1084         <synopsis>
1085           <function>null-pointer-p</function> <replaceable>ptr</replaceable> => <returnvalue>is-null</returnvalue>
1086         </synopsis>
1087       </refsynopsisdiv>
1088       <refsect1>
1089         <title>Arguments and Values</title>
1090         <variablelist>
1091           <varlistentry>
1092             <term><parameter>ptr</parameter></term>
1093             <listitem>
1094               <para>A foreign object pointer.
1095               </para>
1096             </listitem>
1097           </varlistentry>
1098           <varlistentry>
1099             <term><returnvalue>is-null</returnvalue></term>
1100             <listitem>
1101               <para>The boolean flag.
1102               </para>
1103             </listitem>
1104           </varlistentry>
1105         </variablelist>
1106       </refsect1>
1107       <refsect1>
1108         <title>Description</title>
1109         <para>
1110           A predicate testing if a pointer is has a &null; value.
1111         </para>
1112       </refsect1>
1113       <refsect1>
1114         <title>Side Effects</title>
1115         <para>None.</para>
1116       </refsect1>
1117       <refsect1>
1118         <title>Affected by</title>
1119         <para>None.</para>
1120       </refsect1>
1121       <refsect1>
1122         <title>Exceptional Situations</title>
1123         <para>None.</para>
1124       </refsect1>
1125     </refentry>
1126
1127
1128     <refentry id="null-cstring-pointer">
1129       <refnamediv>
1130         <refname>+null-cstring-pointer+</refname>
1131         <refpurpose>A constant &null; cstring pointer.
1132         </refpurpose>
1133         <refclass>Constant</refclass>
1134       </refnamediv>
1135       <refsect1>
1136         <title>Description</title>
1137         <para>
1138           A &null; cstring pointer. This can be used for testing
1139 if a cstring returned by a function is &null;.
1140         </para>
1141       </refsect1>
1142     </refentry>
1143
1144 </reference>
1145
1146     <reference>
1147       <title>Strings</title>
1148 <partintro>
1149 <title>Overview</title>
1150 <para>
1151           &uffi; has functions to two types of <varname>C</varname>-compatible 
1152           strings, <emphasis>cstring</emphasis> and <emphasis>foreign</emphasis> strings.
1153 cstrings are used as parameters to and from functions. An implementation, such as CMUCL,
1154 may not convert these to a foreign type for efficiency sake. Thus, it is not
1155 possible to "allocate" a cstring. In contrast, foreign strings
1156 always need to have memory for them.
1157         </para>
1158 </partintro>
1159
1160     <refentry id="convert-from-cstring">
1161       <refnamediv>
1162         <refname>convert-from-cstring</refname>
1163         <refpurpose>Converts a cstring to a Lisp string.
1164         </refpurpose>
1165         <refclass>Macro</refclass>
1166       </refnamediv>
1167       <refsynopsisdiv>
1168         <title>Syntax</title>
1169         <synopsis>
1170           <function>convert-from-cstring</function> <replaceable>cstring</replaceable> => <returnvalue>string</returnvalue>
1171         </synopsis>
1172       </refsynopsisdiv>
1173       <refsect1>
1174         <title>Arguments and Values</title>
1175         <variablelist>
1176           <varlistentry>
1177             <term><parameter>cstring</parameter></term>
1178             <listitem>
1179               <para>A cstring.
1180               </para>
1181             </listitem>
1182           </varlistentry>
1183           <varlistentry>
1184             <term><returnvalue>string</returnvalue></term>
1185             <listitem>
1186               <para>A Lisp string.
1187               </para>
1188             </listitem>
1189           </varlistentry>
1190         </variablelist>
1191       </refsect1>
1192       <refsect1>
1193         <title>Description</title>
1194         <para>
1195           Converts a Lisp string to a <constant>cstring</constant>. This is
1196 most often used when processing the results of a foreign function
1197 that returns a cstring.
1198         </para>
1199       </refsect1>
1200       <refsect1>
1201         <title>Side Effects</title>
1202         <para>None.</para>
1203       </refsect1>
1204       <refsect1>
1205         <title>Affected by</title>
1206         <para>None.</para>
1207       </refsect1>
1208       <refsect1>
1209         <title>Exceptional Situations</title>
1210         <para>None.</para>
1211       </refsect1>
1212     </refentry>
1213
1214
1215     <refentry id="convert-to-cstring">
1216       <refnamediv>
1217         <refname>convert-to-cstring</refname>
1218         <refpurpose>Converts a Lisp string to a cstring.
1219         </refpurpose>
1220         <refclass>Macro</refclass>
1221       </refnamediv>
1222       <refsynopsisdiv>
1223         <title>Syntax</title>
1224         <synopsis>
1225           <function>convert-to-cstring</function> <replaceable>string</replaceable> => <returnvalue>cstring</returnvalue>
1226         </synopsis>
1227       </refsynopsisdiv>
1228       <refsect1>
1229         <title>Arguments and Values</title>
1230         <variablelist>
1231           <varlistentry>
1232             <term><parameter>string</parameter></term>
1233             <listitem>
1234               <para>A Lisp string.
1235               </para>
1236             </listitem>
1237           </varlistentry>
1238           <varlistentry>
1239             <term><returnvalue>cstring</returnvalue></term>
1240             <listitem>
1241               <para>A cstring.
1242               </para>
1243             </listitem>
1244           </varlistentry>
1245         </variablelist>
1246       </refsect1>
1247       <refsect1>
1248         <title>Description</title>
1249         <para>
1250           Converts a Lisp string to a
1251           <varname>cstring</varname>. The
1252           <varname>cstring</varname> should be freed with
1253           <function>free-cstring</function>.
1254         </para>
1255       </refsect1>
1256       <refsect1>
1257         <title>Side Effects</title>
1258         <para>None.</para>
1259       </refsect1>
1260       <refsect1>
1261         <title>Affected by</title>
1262         <para>None.</para>
1263       </refsect1>
1264       <refsect1>
1265         <title>Exceptional Situations</title>
1266         <para>None.</para>
1267       </refsect1>
1268     </refentry>
1269
1270
1271     <refentry id="free-cstring">
1272       <refnamediv>
1273         <refname>free-cstring</refname>
1274         <refpurpose>Free memory used by cstring.
1275         </refpurpose>
1276         <refclass>Macro</refclass>
1277       </refnamediv>
1278       <refsynopsisdiv>
1279         <title>Syntax</title>
1280         <synopsis>
1281           <function>free-cstring</function> <replaceable>cstring</replaceable>
1282         </synopsis>
1283       </refsynopsisdiv>
1284       <refsect1>
1285         <title>Arguments and Values</title>
1286         <variablelist>
1287           <varlistentry>
1288             <term><parameter>cstring</parameter></term>
1289             <listitem>
1290               <para>A cstring.
1291               </para>
1292             </listitem>
1293           </varlistentry>
1294         </variablelist>
1295       </refsect1>
1296       <refsect1>
1297         <title>Description</title>
1298         <para>
1299           Frees any memory possibly allocated by
1300           <function>convert-to-cstring</function>.
1301         </para>
1302       </refsect1>
1303       <refsect1>
1304         <title>Side Effects</title>
1305         <para>None.</para>
1306       </refsect1>
1307       <refsect1>
1308         <title>Affected by</title>
1309         <para>None.</para>
1310       </refsect1>
1311       <refsect1>
1312         <title>Exceptional Situations</title>
1313         <para>None.</para>
1314       </refsect1>
1315     </refentry>
1316
1317
1318     <refentry id="with-cstring">
1319       <refnamediv>
1320         <refname>with-cstring</refname>
1321         <refpurpose>Binds a newly created cstring.
1322         </refpurpose>
1323         <refclass>Macro</refclass>
1324       </refnamediv>
1325       <refsynopsisdiv>
1326         <title>Syntax</title>
1327         <synopsis>
1328           <function>with-cstring</function> <replaceable>(cstring string) {body}</replaceable>
1329         </synopsis>
1330       </refsynopsisdiv>
1331       <refsect1>
1332         <title>Arguments and Values</title>
1333         <variablelist>
1334           <varlistentry>
1335             <term><parameter>cstring</parameter></term>
1336             <listitem>
1337               <para>A symbol naming the cstring to be created.
1338               </para>
1339             </listitem>
1340           </varlistentry>
1341           <varlistentry>
1342             <term><parameter>string</parameter></term>
1343             <listitem>
1344               <para>A Lisp string that will be translated to a cstring.
1345               </para>
1346             </listitem>
1347           </varlistentry>
1348           <varlistentry>
1349             <term><parameter>body</parameter></term>
1350             <listitem>
1351               <para>The body of where the cstring will be bound.
1352               </para>
1353             </listitem>
1354           </varlistentry>
1355         </variablelist>
1356       </refsect1>
1357       <refsect1>
1358         <title>Description</title>
1359         <para>
1360           Binds a lexical variable to a newly allocated <varname>cstring</varname>. Automatically frees <varname>cstring</varname>.
1361         </para>
1362       </refsect1>
1363       <refsect1>
1364         <title>Examples</title>
1365         <para>
1366             <programlisting>
1367 (def-function ("getenv" c-getenv) 
1368    ((name :cstring))
1369    :returning :cstring)
1370
1371 (defun getenv (key)
1372   "Returns an environment variable, or NIL if it does not exist"
1373   (check-type key string)
1374   (with-cstring (key-cstring key)
1375     (convert-from-cstring (c-getenv key-cstring))))
1376             </programlisting>
1377           </para>
1378         </refsect1>
1379       <refsect1>
1380         <title>Side Effects</title>
1381         <para>None.</para>
1382       </refsect1>
1383       <refsect1>
1384         <title>Affected by</title>
1385         <para>None.</para>
1386       </refsect1>
1387       <refsect1>
1388         <title>Exceptional Situations</title>
1389         <para>None.</para>
1390       </refsect1>
1391     </refentry>
1392
1393
1394     <refentry id="convert-from-foreign-string">
1395       <refnamediv>
1396         <refname>convert-from-foreign-string</refname>
1397         <refpurpose>Converts a foreign string into a Lisp string.
1398         </refpurpose>
1399         <refclass>Macro</refclass>
1400       </refnamediv>
1401       <refsynopsisdiv>
1402         <title>Syntax</title>
1403         <synopsis>
1404           <function>convert-from-foreign-string</function> <replaceable>foreign-string &amp;key length null-terminated-p</replaceable> => <returnvalue>string</returnvalue>
1405         </synopsis>
1406       </refsynopsisdiv>
1407       <refsect1>
1408         <title>Arguments and Values</title>
1409         <variablelist>
1410           <varlistentry>
1411             <term><parameter>foreign-string</parameter></term>
1412             <listitem>
1413               <para>A foreign string.
1414               </para>
1415             </listitem>
1416           </varlistentry>
1417           <varlistentry>
1418             <term><parameter>length</parameter></term>
1419             <listitem>
1420               <para>The length of the foreign string to
1421 convert. The default is the length of the string until a &null;
1422 character is reached.
1423               </para>
1424             </listitem>
1425           </varlistentry>
1426           <varlistentry>
1427             <term><parameter>null-terminated-p</parameter></term>
1428             <listitem>
1429               <para>A boolean flag with a default value of &t; When true,
1430 the string is converted until the first &null; character is reached.
1431               </para>
1432             </listitem>
1433           </varlistentry>
1434           <varlistentry>
1435             <term><returnvalue>string</returnvalue></term>
1436             <listitem>
1437               <para>A Lisp string.
1438               </para>
1439             </listitem>
1440           </varlistentry>
1441         </variablelist>
1442       </refsect1>
1443       <refsect1>
1444         <title>Description</title>
1445         <para>
1446           Returns a Lisp string from a foreign string. 
1447 Can translated ASCII and binary strings.
1448         </para>
1449       </refsect1>
1450       <refsect1>
1451         <title>Side Effects</title>
1452         <para>None.</para>
1453       </refsect1>
1454       <refsect1>
1455         <title>Affected by</title>
1456         <para>None.</para>
1457       </refsect1>
1458       <refsect1>
1459         <title>Exceptional Situations</title>
1460         <para>None.</para>
1461       </refsect1>
1462     </refentry>
1463
1464
1465     <refentry id="convert-to-foreign-string">
1466       <refnamediv>
1467         <refname>convert-to-foreign-string</refname>
1468         <refpurpose>Converts a Lisp string to a foreign string.
1469         </refpurpose>
1470         <refclass>Macro</refclass>
1471       </refnamediv>
1472       <refsynopsisdiv>
1473         <title>Syntax</title>
1474         <synopsis>
1475           <function>convert-to-foreign-string</function> <replaceable>string</replaceable> => <returnvalue>foreign-string</returnvalue>
1476         </synopsis>
1477       </refsynopsisdiv>
1478       <refsect1>
1479         <title>Arguments and Values</title>
1480         <variablelist>
1481           <varlistentry>
1482             <term><parameter>string</parameter></term>
1483             <listitem>
1484               <para>A Lisp string.
1485               </para>
1486             </listitem>
1487           </varlistentry>
1488           <varlistentry>
1489             <term><returnvalue>foreign-string</returnvalue></term>
1490             <listitem>
1491               <para>A foreign string.
1492               </para>
1493             </listitem>
1494           </varlistentry>
1495         </variablelist>
1496       </refsect1>
1497       <refsect1>
1498         <title>Description</title>
1499         <para>
1500           Converts a Lisp string to a foreign string. Memory should be
1501           freed with <function>free-foreign-object</function>.
1502         </para>
1503       </refsect1>
1504       <refsect1>
1505         <title>Side Effects</title>
1506         <para>None.</para>
1507       </refsect1>
1508       <refsect1>
1509         <title>Affected by</title>
1510         <para>None.</para>
1511       </refsect1>
1512       <refsect1>
1513         <title>Exceptional Situations</title>
1514         <para>None.</para>
1515       </refsect1>
1516     </refentry>
1517
1518
1519
1520     <refentry id="allocate-foreign-string">
1521       <refnamediv>
1522         <refname>allocate-foreign-string</refname>
1523         <refpurpose>Allocates space for a foreign string.
1524         </refpurpose>
1525         <refclass>Macro</refclass>
1526       </refnamediv>
1527       <refsynopsisdiv>
1528         <title>Syntax</title>
1529         <synopsis>
1530           <function>allocate-foreign-string</function> <replaceable>size &amp;key unsigned</replaceable> => <returnvalue>foreign-string</returnvalue>
1531         </synopsis>
1532       </refsynopsisdiv>
1533       <refsect1>
1534         <title>Arguments and Values</title>
1535         <variablelist>
1536           <varlistentry>
1537             <term><parameter>size</parameter></term>
1538             <listitem>
1539               <para>The size of the space to be allocated in bytes.
1540               </para>
1541             </listitem>
1542           </varlistentry>
1543           <varlistentry>
1544             <term><parameter>unsigned</parameter></term>
1545             <listitem>
1546               <para>A boolean flag with a default value of &t;. When true,
1547 marks the pointer as an <constant>:unsigned-char</constant>.
1548               </para>
1549             </listitem>
1550           </varlistentry>
1551           <varlistentry>
1552             <term><returnvalue>foreign-string</returnvalue></term>
1553             <listitem>
1554               <para>A foreign string which has undefined contents.
1555               </para>
1556             </listitem>
1557           </varlistentry>
1558         </variablelist>
1559       </refsect1>
1560       <refsect1>
1561         <title>Description</title>
1562         <para>
1563           Allocates space for a foreign string. Memory should
1564           be freed with <function>free-foreign-object</function>.
1565         </para>
1566       </refsect1>
1567       <refsect1>
1568         <title>Side Effects</title>
1569         <para>None.</para>
1570       </refsect1>
1571       <refsect1>
1572         <title>Affected by</title>
1573         <para>None.</para>
1574       </refsect1>
1575       <refsect1>
1576         <title>Exceptional Situations</title>
1577         <para>None.</para>
1578       </refsect1>
1579     </refentry>
1580
1581   </reference>
1582
1583   <reference>
1584       <title>Functions &amp; Libraries</title>
1585
1586       <refentry id="def-function">
1587         <refnamediv>
1588           <refname>def-function</refname>
1589         <refpurpose>Declares a function. 
1590         </refpurpose>
1591         <refclass>Macro</refclass>
1592       </refnamediv>
1593       <refsynopsisdiv>
1594         <title>Syntax</title>
1595         <synopsis>
1596           <function>def-function</function> <replaceable>name args &amp;key module returning</replaceable>
1597         </synopsis>
1598       </refsynopsisdiv>
1599       <refsect1>
1600         <title>Arguments and Values</title>
1601         <variablelist>
1602           <varlistentry>
1603             <term><parameter>name</parameter></term>
1604             <listitem>
1605               <para>A string or list specificying the function name. If it is a string, that names the foreign function. 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 function name and the second it is a symbol stating the Lisp name.
1606               </para>
1607             </listitem>
1608           </varlistentry>
1609           <varlistentry>
1610             <term><parameter>args</parameter></term>
1611             <listitem>
1612               <para>A list of argument declarations. If &nil;, indicates that the function does not take any arguments.
1613               </para>
1614             </listitem>
1615           </varlistentry>
1616           <varlistentry>
1617             <term><parameter>module</parameter></term>
1618             <listitem>
1619               <para>A string specifying which module (or library) that the foreign function resides. (Required by Lispworks)</para>
1620             </listitem>
1621           </varlistentry>
1622           <varlistentry>
1623             <term><returnvalue>returning</returnvalue></term>
1624             <listitem>
1625               <para>A declaration specifying the result type of the
1626 foreign function. If <constant>:void</constant> indicates module does not return any value.
1627               </para>
1628             </listitem>
1629           </varlistentry>
1630         </variablelist>
1631       </refsect1>
1632       <refsect1>
1633         <title>Description</title>
1634         <para>Declares a foreign function.
1635         </para>
1636       </refsect1>
1637       <refsect1>
1638         <title>Examples</title>
1639         <programlisting>
1640 (def-function "gethostname" 
1641   ((name :cstring)
1642    (len :int))
1643   :returning :int)
1644         </programlisting>
1645       </refsect1>
1646       <refsect1>
1647         <title>Side Effects</title>
1648         <para>None.</para>
1649       </refsect1>
1650       <refsect1>
1651         <title>Affected by</title>
1652         <para>None.</para>
1653       </refsect1>
1654       <refsect1>
1655         <title>Exceptional Situations</title>
1656         <para>None.</para>
1657       </refsect1>
1658     </refentry>
1659
1660       <refentry id="load-foreign-library">
1661         <refnamediv>
1662           <refname>load-foreign-library</refname>
1663         <refpurpose>Loads a foreign library. 
1664         </refpurpose>
1665         <refclass>Function</refclass>
1666       </refnamediv>
1667       <refsect1>
1668         <title>Syntax</title>
1669 <synopsis>
1670           <function>load-foreign-library</function> <replaceable>filename &amp;key module supporting-libraries</replaceable> => <returnvalue>success</returnvalue>
1671 </synopsis>
1672       </refsect1>
1673       <refsect1>
1674         <title>Arguments and Values</title>
1675         <variablelist>
1676           <varlistentry>
1677             <term><parameter>filename</parameter></term>
1678             <listitem>
1679               <para>A string or pathname specifying the library location
1680 in the filesystem. At least one implementation (&lw;) can not
1681 accept a logical pathname.
1682               </para>
1683             </listitem>
1684           </varlistentry>
1685           <varlistentry>
1686             <term><parameter>module</parameter></term>
1687             <listitem>
1688               <para>A string designating the name of the module to apply
1689 to functions in this library. (Required for Lispworks)
1690               </para>
1691             </listitem>
1692           </varlistentry>
1693           <varlistentry>
1694             <term><parameter>supporting-libraries</parameter></term>
1695             <listitem>
1696               <para>A list of strings naming the libraries required to
1697 link the foreign library. (Required by CMUCL)
1698               </para>
1699             </listitem>
1700           </varlistentry>
1701           <varlistentry>
1702             <term><returnvalue>success</returnvalue></term>
1703             <listitem>
1704               <para>A boolean flag, &t; if the library was able to be
1705 loaded successfully or if the library has been previously loaded,
1706 otherwise &nil;.
1707               </para>
1708             </listitem>
1709           </varlistentry>
1710         </variablelist>
1711       </refsect1>
1712       <refsect1>
1713         <title>Description</title>
1714         <para>Loads a foreign library. Applies a module name to functions
1715 within the library. Ensures that a library is only loaded once during
1716 a session.
1717         </para>
1718       </refsect1>
1719       <refsect1>
1720         <title>Examples</title>
1721         <programlisting>
1722   (load-foreign-library #p"/usr/lib/libmysqlclient.so" 
1723                         :module "mysql" 
1724                         :supporting-libraries '("c"))
1725     => T
1726         </programlisting>
1727       </refsect1>
1728       <refsect1>
1729         <title>Side Effects</title>
1730         <para>Loads the foreign code into the Lisp system.
1731         </para>
1732       </refsect1>
1733       <refsect1>
1734         <title>Affected by</title>
1735         <para>Ability to load the file.</para>
1736       </refsect1>
1737       <refsect1>
1738         <title>Exceptional Situations</title>
1739         <para>None.</para>
1740       </refsect1>
1741     </refentry>
1742
1743 </reference>
1744
1745