82ee66a5df717e7d9ed15cbbfa5e3d8d607c39f1
[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
780     <refentry id="def-union">
781       <refnamediv>
782         <refname>def-union</refname>
783         <refpurpose>Defines a foreign union type.
784         </refpurpose>
785         <refclass>Macro</refclass>
786       </refnamediv>
787       <refsynopsisdiv>
788         <title>Syntax</title>
789         <synopsis>
790           <function>def-union</function> <replaceable>name &amp;rest fields</replaceable>
791         </synopsis>
792       </refsynopsisdiv>
793       <refsect1>
794         <title>Arguments and Values</title>
795         <variablelist>
796           <varlistentry>
797             <term><parameter>name</parameter></term>
798             <listitem>
799               <para>A name of the new union type.
800               </para>
801             </listitem>
802           </varlistentry>
803           <varlistentry>
804             <term><parameter>fields</parameter></term>
805             <listitem>
806               <para>A list of fields of the union.
807               </para>
808             </listitem>
809           </varlistentry>
810         </variablelist>
811       </refsect1>
812       <refsect1>
813         <title>Description</title>
814         <para>
815           Defines a foreign union type.
816         </para>
817       </refsect1>
818       <refsect1>
819         <title>Examples</title>
820         <programlisting>
821 (def-union test-union
822   (a-char :char)
823   (an-int :int))
824
825 (let ((u (allocate-foreign-object 'test-union))
826   (setf (get-slot-value u 'test-union 'an-int) (+ 65 (* 66 256)))
827   (prog1 
828     (ensure-char-character (get-slot-value u 'test-union 'a-char))
829     (free-foreign-object u)))
830 => #\A
831         </programlisting>
832       </refsect1>
833       <refsect1>
834         <title>Side Effects</title>
835         <para>Defines a new foreign type.</para>
836       </refsect1>
837       <refsect1>
838         <title>Affected by</title>
839         <para>None.</para>
840       </refsect1>
841       <refsect1>
842         <title>Exceptional Situations</title>
843         <para>None.</para>
844       </refsect1>
845     </refentry>
846
847
848 </reference>
849
850 <reference>
851     <title>Objects</title>
852 <partintro>
853 <title>Overview</title>
854     <para>
855       Objects are entities that can allocated, referred to by pointers, and
856 can be freed.
857     </para>
858 </partintro>
859
860
861     <refentry id="allocate-foreign-object">
862       <refnamediv>
863         <refname>allocate-foreign-object</refname>
864         <refpurpose>Allocates an instance of a foreign object.
865         </refpurpose>
866         <refclass>Macro</refclass>
867       </refnamediv>
868       <refsynopsisdiv>
869         <title>Syntax</title>
870         <synopsis>
871           <function>allocate-foreign-object</function> <replaceable>type</replaceable> => <returnvalue>ptr</returnvalue>
872         </synopsis>
873       </refsynopsisdiv>
874       <refsect1>
875         <title>Arguments and Values</title>
876         <variablelist>
877           <varlistentry>
878             <term><parameter>type</parameter></term>
879             <listitem>
880               <para>A type of foreign object to allocate.
881               </para>
882             </listitem>
883           </varlistentry>
884           <varlistentry>
885             <term><returnvalue>ptr</returnvalue></term>
886             <listitem>
887               <para>A pointer to the foreign object.
888               </para>
889             </listitem>
890           </varlistentry>
891         </variablelist>
892       </refsect1>
893       <refsect1>
894         <title>Description</title>
895         <para>
896           Allocates an instance of a foreign object. It returns a pointer to the object.
897         </para>
898       </refsect1>
899       <refsect1>
900         <title>Examples</title>
901         <programlisting>
902 (def-struct ab (a :int) (b :double))
903 (allocate-foreign-object ab)
904 => #&lt;ptr&gt;
905         </programlisting>
906       </refsect1>
907       <refsect1>
908         <title>Side Effects</title>
909         <para>None.</para>
910       </refsect1>
911       <refsect1>
912         <title>Affected by</title>
913         <para>None.</para>
914       </refsect1>
915       <refsect1>
916         <title>Exceptional Situations</title>
917         <para>None.</para>
918       </refsect1>
919     </refentry>
920
921
922     <refentry id="free-foreign-object">
923       <refnamediv>
924         <refname>free-foreign-object</refname>
925         <refpurpose>Frees memory that was allocated for a foreign boject.
926         </refpurpose>
927         <refclass>Macro</refclass>
928       </refnamediv>
929       <refsynopsisdiv>
930         <title>Syntax</title>
931         <synopsis>
932           <function>free-foreign-object</function> <replaceable>ptr</replaceable>
933         </synopsis>
934       </refsynopsisdiv>
935       <refsect1>
936         <title>Arguments and Values</title>
937         <variablelist>
938           <varlistentry>
939             <term><parameter>ptr</parameter></term>
940             <listitem>
941               <para>A pointer to the allocated foreign object to free.
942               </para>
943             </listitem>
944           </varlistentry>
945         </variablelist>
946       </refsect1>
947       <refsect1>
948         <title>Description</title>
949         <para>
950           Frees the memory used by the allocation of a foreign object.
951         </para>
952       </refsect1>
953       <refsect1>
954         <title>Side Effects</title>
955         <para>None.</para>
956       </refsect1>
957       <refsect1>
958         <title>Affected by</title>
959         <para>None.</para>
960       </refsect1>
961       <refsect1>
962         <title>Exceptional Situations</title>
963         <para>None.</para>
964       </refsect1>
965     </refentry>
966
967
968     <refentry id="pointer-address">
969       <refnamediv>
970         <refname>pointer-address</refname>
971         <refpurpose>Returns the address of a pointer.
972         </refpurpose>
973         <refclass>Macro</refclass>
974       </refnamediv>
975       <refsynopsisdiv>
976         <title>Syntax</title>
977         <synopsis>
978           <function>pointer-address</function> <replaceable>ptr</replaceable> => <returnvalue>address</returnvalue>
979         </synopsis>
980       </refsynopsisdiv>
981       <refsect1>
982         <title>Arguments and Values</title>
983         <variablelist>
984           <varlistentry>
985             <term><parameter>ptr</parameter></term>
986             <listitem>
987               <para>A pointer to a foreign object.
988               </para>
989             </listitem>
990           </varlistentry>
991           <varlistentry>
992             <term><parameter>address</parameter></term>
993             <listitem>
994               <para>An integer representing the pointer's address.
995               </para>
996             </listitem>
997           </varlistentry>
998         </variablelist>
999       </refsect1>
1000       <refsect1>
1001         <title>Description</title>
1002         <para>
1003           Returns the address as an integer of a pointer.
1004         </para>
1005       </refsect1>
1006       <refsect1>
1007         <title>Side Effects</title>
1008         <para>None.</para>
1009       </refsect1>
1010       <refsect1>
1011         <title>Affected by</title>
1012         <para>None.</para>
1013       </refsect1>
1014       <refsect1>
1015         <title>Exceptional Situations</title>
1016         <para>None.</para>
1017       </refsect1>
1018     </refentry>
1019
1020
1021     <refentry id="deref-pointer">
1022       <refnamediv>
1023         <refname>deref-pointer</refname>
1024         <refpurpose>Deferences a pointer.
1025         </refpurpose>
1026         <refclass>Macro</refclass>
1027       </refnamediv>
1028       <refsynopsisdiv>
1029         <title>Syntax</title>
1030         <synopsis>
1031           <function>deref-pointer</function> <replaceable>ptr type</replaceable> => <returnvalue>value</returnvalue>
1032         </synopsis>
1033       </refsynopsisdiv>
1034       <refsect1>
1035         <title>Arguments and Values</title>
1036         <variablelist>
1037           <varlistentry>
1038             <term><parameter>ptr</parameter></term>
1039             <listitem>
1040               <para>A pointer to a foreign object.
1041               </para>
1042             </listitem>
1043           </varlistentry>
1044           <varlistentry>
1045             <term><parameter>type</parameter></term>
1046             <listitem>
1047               <para>A foreign type of the object being pointed to.
1048               </para>
1049             </listitem>
1050           </varlistentry>
1051           <varlistentry>
1052             <term><returnvalue>value</returnvalue></term>
1053             <listitem>
1054               <para>The value of the object where the pointer points.
1055               </para>
1056             </listitem>
1057           </varlistentry>
1058         </variablelist>
1059       </refsect1>
1060       <refsect1>
1061         <title>Description</title>
1062         <para>
1063           Returns the object to which a pointer points.
1064         </para>
1065       </refsect1>
1066       <refsect1>
1067         <title>Examples</title>
1068         <para>
1069 <programlisting>
1070 (let ((intp (allocate-foreign-object :int)))
1071   (setf (deref-pointer intp :int) 10)
1072   (prog1
1073     (deref-pointer intp :int)
1074     (free-foreign-object intp)))
1075 => 10
1076 </programlisting>
1077         </para>
1078       </refsect1>
1079       <refsect1>
1080         <title>Side Effects</title>
1081         <para>None.</para>
1082       </refsect1>
1083       <refsect1>
1084         <title>Affected by</title>
1085         <para>None.</para>
1086       </refsect1>
1087       <refsect1>
1088         <title>Exceptional Situations</title>
1089         <para>None.</para>
1090       </refsect1>
1091     </refentry>
1092
1093     <refentry id="ensure-char-character">
1094       <refnamediv>
1095         <refname>ensure-char-character</refname>
1096         <refpurpose>Ensures that a dereferenced :char pointer is
1097 a character.
1098         </refpurpose>
1099         <refclass>Macro</refclass>
1100       </refnamediv>
1101       <refsynopsisdiv>
1102         <title>Syntax</title>
1103         <synopsis>
1104           <function>ensure-char-character</function> <replaceable>object</replaceable> => <returnvalue>char</returnvalue>
1105         </synopsis>
1106       </refsynopsisdiv>
1107       <refsect1>
1108         <title>Arguments and Values</title>
1109         <variablelist>
1110           <varlistentry>
1111             <term><parameter>object</parameter></term>
1112             <listitem>
1113               <para>Either a character or a integer specifying a character code.
1114               </para>
1115             </listitem>
1116           </varlistentry>
1117           <varlistentry>
1118             <term><returnvalue>char</returnvalue></term>
1119             <listitem>
1120               <para>A character.
1121               </para>
1122             </listitem>
1123           </varlistentry>
1124         </variablelist>
1125       </refsect1>
1126       <refsect1>
1127         <title>Description</title>
1128         <para>
1129           Ensures that an object obtained by dereferencing a 
1130 <constant>:char</constant> pointer is a character.
1131         </para>
1132       </refsect1>
1133       <refsect1>
1134         <title>Examples</title>
1135         <para>
1136 <programlisting>
1137 (let ((fs (convert-to-foreign-string "a")))
1138   (prog1 
1139     (ensure-char-character (deref-pointer fs :char))
1140     (free-foreign-object fs)))
1141 => #\a
1142 </programlisting>
1143         </para>
1144       </refsect1>
1145       <refsect1>
1146         <title>Side Effects</title>
1147         <para>None.</para>
1148       </refsect1>
1149       <refsect1>
1150         <title>Affected by</title>
1151         <para>None.</para>
1152       </refsect1>
1153       <refsect1>
1154         <title>Exceptional Situations</title>
1155         <para>Depending upon the implementation and what &uffi; expects, this
1156 macro may signal an error if the object is not a character or
1157 integer.</para>
1158       </refsect1>
1159     </refentry>
1160
1161     <refentry id="ensure-char-integer">
1162       <refnamediv>
1163         <refname>ensure-char-integer</refname>
1164         <refpurpose>Ensures that a dereferenced :char pointer is
1165 an integer.
1166         </refpurpose>
1167         <refclass>Macro</refclass>
1168       </refnamediv>
1169       <refsynopsisdiv>
1170         <title>Syntax</title>
1171         <synopsis>
1172           <function>ensure-char-integer</function> <replaceable>object</replaceable> => <returnvalue>int</returnvalue>
1173         </synopsis>
1174       </refsynopsisdiv>
1175       <refsect1>
1176         <title>Arguments and Values</title>
1177         <variablelist>
1178           <varlistentry>
1179             <term><parameter>object</parameter></term>
1180             <listitem>
1181               <para>Either a character or a integer specifying a character code.
1182               </para>
1183             </listitem>
1184           </varlistentry>
1185           <varlistentry>
1186             <term><returnvalue>int</returnvalue></term>
1187             <listitem>
1188               <para>An integer.
1189               </para>
1190             </listitem>
1191           </varlistentry>
1192         </variablelist>
1193       </refsect1>
1194       <refsect1>
1195         <title>Description</title>
1196         <para>
1197           Ensures that an object obtained by dereferencing a 
1198 <constant>:char</constant> pointer is an integer.
1199         </para>
1200       </refsect1>
1201       <refsect1>
1202         <title>Examples</title>
1203         <para>
1204 <programlisting>
1205 (let ((fs (convert-to-foreign-string "a")))
1206   (prog1 
1207     (ensure-char-integer (deref-pointer fs :char))
1208     (free-foreign-object fs)))
1209 => 96
1210 </programlisting>
1211         </para>
1212       </refsect1>
1213       <refsect1>
1214         <title>Side Effects</title>
1215         <para>None.</para>
1216       </refsect1>
1217       <refsect1>
1218         <title>Affected by</title>
1219         <para>None.</para>
1220       </refsect1>
1221       <refsect1>
1222         <title>Exceptional Situations</title>
1223         <para>Depending upon the implementation and what &uffi; expects, this
1224 macro may signal an error if the object is not a character or
1225 integer.</para>
1226       </refsect1>
1227     </refentry>
1228
1229     <refentry id="make-null-pointer">
1230       <refnamediv>
1231         <refname>make-null-pointer</refname>
1232         <refpurpose>Create a &null; pointer.
1233         </refpurpose>
1234         <refclass>Macro</refclass>
1235       </refnamediv>
1236       <refsynopsisdiv>
1237         <title>Syntax</title>
1238         <synopsis>
1239           <function>make-null-pointer</function> <replaceable>type</replaceable> => <returnvalue>ptr</returnvalue>
1240         </synopsis>
1241       </refsynopsisdiv>
1242       <refsect1>
1243         <title>Arguments and Values</title>
1244         <variablelist>
1245           <varlistentry>
1246             <term><parameter>type</parameter></term>
1247             <listitem>
1248               <para>A type of object to which the pointer refers.
1249               </para>
1250             </listitem>
1251           </varlistentry>
1252           <varlistentry>
1253             <term><parameter>ptr</parameter></term>
1254             <listitem>
1255               <para>The &null; pointer of type <parameter>type</parameter>.
1256               </para>
1257             </listitem>
1258           </varlistentry>
1259         </variablelist>
1260       </refsect1>
1261       <refsect1>
1262         <title>Description</title>
1263         <para>
1264           Creates a &null; pointer of a specified type.
1265         </para>
1266       </refsect1>
1267       <refsect1>
1268         <title>Side Effects</title>
1269         <para>None.</para>
1270       </refsect1>
1271       <refsect1>
1272         <title>Affected by</title>
1273         <para>None.</para>
1274       </refsect1>
1275       <refsect1>
1276         <title>Exceptional Situations</title>
1277         <para>None.</para>
1278       </refsect1>
1279     </refentry>
1280
1281
1282     <refentry id="null-pointer-p">
1283       <refnamediv>
1284         <refname>null-pointer-p</refname>
1285         <refpurpose>Tests a pointer for &null; value.
1286         </refpurpose>
1287         <refclass>Macro</refclass>
1288       </refnamediv>
1289       <refsynopsisdiv>
1290         <title>Syntax</title>
1291         <synopsis>
1292           <function>null-pointer-p</function> <replaceable>ptr</replaceable> => <returnvalue>is-null</returnvalue>
1293         </synopsis>
1294       </refsynopsisdiv>
1295       <refsect1>
1296         <title>Arguments and Values</title>
1297         <variablelist>
1298           <varlistentry>
1299             <term><parameter>ptr</parameter></term>
1300             <listitem>
1301               <para>A foreign object pointer.
1302               </para>
1303             </listitem>
1304           </varlistentry>
1305           <varlistentry>
1306             <term><returnvalue>is-null</returnvalue></term>
1307             <listitem>
1308               <para>The boolean flag.
1309               </para>
1310             </listitem>
1311           </varlistentry>
1312         </variablelist>
1313       </refsect1>
1314       <refsect1>
1315         <title>Description</title>
1316         <para>
1317           A predicate testing if a pointer is has a &null; value.
1318         </para>
1319       </refsect1>
1320       <refsect1>
1321         <title>Side Effects</title>
1322         <para>None.</para>
1323       </refsect1>
1324       <refsect1>
1325         <title>Affected by</title>
1326         <para>None.</para>
1327       </refsect1>
1328       <refsect1>
1329         <title>Exceptional Situations</title>
1330         <para>None.</para>
1331       </refsect1>
1332     </refentry>
1333
1334
1335     <refentry id="null-cstring-pointer">
1336       <refnamediv>
1337         <refname>+null-cstring-pointer+</refname>
1338         <refpurpose>A constant &null; cstring pointer.
1339         </refpurpose>
1340         <refclass>Constant</refclass>
1341       </refnamediv>
1342       <refsect1>
1343         <title>Description</title>
1344         <para>
1345           A &null; cstring pointer. This can be used for testing
1346 if a cstring returned by a function is &null;.
1347         </para>
1348       </refsect1>
1349     </refentry>
1350
1351 </reference>
1352
1353     <reference>
1354       <title>Strings</title>
1355 <partintro>
1356 <title>Overview</title>
1357 <para>
1358           &uffi; has functions to two types of <varname>C</varname>-compatible 
1359           strings, <emphasis>cstring</emphasis> and <emphasis>foreign</emphasis> strings.
1360 cstrings are used as parameters to and from functions. An implementation, such as CMUCL,
1361 may not convert these to a foreign type for efficiency sake. Thus, it is not
1362 possible to "allocate" a cstring. In contrast, foreign strings
1363 always need to have memory for them.
1364         </para>
1365 </partintro>
1366
1367     <refentry id="convert-from-cstring">
1368       <refnamediv>
1369         <refname>convert-from-cstring</refname>
1370         <refpurpose>Converts a cstring to a Lisp string.
1371         </refpurpose>
1372         <refclass>Macro</refclass>
1373       </refnamediv>
1374       <refsynopsisdiv>
1375         <title>Syntax</title>
1376         <synopsis>
1377           <function>convert-from-cstring</function> <replaceable>cstring</replaceable> => <returnvalue>string</returnvalue>
1378         </synopsis>
1379       </refsynopsisdiv>
1380       <refsect1>
1381         <title>Arguments and Values</title>
1382         <variablelist>
1383           <varlistentry>
1384             <term><parameter>cstring</parameter></term>
1385             <listitem>
1386               <para>A cstring.
1387               </para>
1388             </listitem>
1389           </varlistentry>
1390           <varlistentry>
1391             <term><returnvalue>string</returnvalue></term>
1392             <listitem>
1393               <para>A Lisp string.
1394               </para>
1395             </listitem>
1396           </varlistentry>
1397         </variablelist>
1398       </refsect1>
1399       <refsect1>
1400         <title>Description</title>
1401         <para>
1402           Converts a Lisp string to a <constant>cstring</constant>. This is
1403 most often used when processing the results of a foreign function
1404 that returns a cstring.
1405         </para>
1406       </refsect1>
1407       <refsect1>
1408         <title>Side Effects</title>
1409         <para>None.</para>
1410       </refsect1>
1411       <refsect1>
1412         <title>Affected by</title>
1413         <para>None.</para>
1414       </refsect1>
1415       <refsect1>
1416         <title>Exceptional Situations</title>
1417         <para>None.</para>
1418       </refsect1>
1419     </refentry>
1420
1421
1422     <refentry id="convert-to-cstring">
1423       <refnamediv>
1424         <refname>convert-to-cstring</refname>
1425         <refpurpose>Converts a Lisp string to a cstring.
1426         </refpurpose>
1427         <refclass>Macro</refclass>
1428       </refnamediv>
1429       <refsynopsisdiv>
1430         <title>Syntax</title>
1431         <synopsis>
1432           <function>convert-to-cstring</function> <replaceable>string</replaceable> => <returnvalue>cstring</returnvalue>
1433         </synopsis>
1434       </refsynopsisdiv>
1435       <refsect1>
1436         <title>Arguments and Values</title>
1437         <variablelist>
1438           <varlistentry>
1439             <term><parameter>string</parameter></term>
1440             <listitem>
1441               <para>A Lisp string.
1442               </para>
1443             </listitem>
1444           </varlistentry>
1445           <varlistentry>
1446             <term><returnvalue>cstring</returnvalue></term>
1447             <listitem>
1448               <para>A cstring.
1449               </para>
1450             </listitem>
1451           </varlistentry>
1452         </variablelist>
1453       </refsect1>
1454       <refsect1>
1455         <title>Description</title>
1456         <para>
1457           Converts a Lisp string to a
1458           <varname>cstring</varname>. The
1459           <varname>cstring</varname> should be freed with
1460           <function>free-cstring</function>.
1461         </para>
1462       </refsect1>
1463       <refsect1>
1464         <title>Side Effects</title>
1465         <para>None.</para>
1466       </refsect1>
1467       <refsect1>
1468         <title>Affected by</title>
1469         <para>None.</para>
1470       </refsect1>
1471       <refsect1>
1472         <title>Exceptional Situations</title>
1473         <para>None.</para>
1474       </refsect1>
1475     </refentry>
1476
1477
1478     <refentry id="free-cstring">
1479       <refnamediv>
1480         <refname>free-cstring</refname>
1481         <refpurpose>Free memory used by cstring.
1482         </refpurpose>
1483         <refclass>Macro</refclass>
1484       </refnamediv>
1485       <refsynopsisdiv>
1486         <title>Syntax</title>
1487         <synopsis>
1488           <function>free-cstring</function> <replaceable>cstring</replaceable>
1489         </synopsis>
1490       </refsynopsisdiv>
1491       <refsect1>
1492         <title>Arguments and Values</title>
1493         <variablelist>
1494           <varlistentry>
1495             <term><parameter>cstring</parameter></term>
1496             <listitem>
1497               <para>A cstring.
1498               </para>
1499             </listitem>
1500           </varlistentry>
1501         </variablelist>
1502       </refsect1>
1503       <refsect1>
1504         <title>Description</title>
1505         <para>
1506           Frees any memory possibly allocated by
1507           <function>convert-to-cstring</function>.
1508         </para>
1509       </refsect1>
1510       <refsect1>
1511         <title>Side Effects</title>
1512         <para>None.</para>
1513       </refsect1>
1514       <refsect1>
1515         <title>Affected by</title>
1516         <para>None.</para>
1517       </refsect1>
1518       <refsect1>
1519         <title>Exceptional Situations</title>
1520         <para>None.</para>
1521       </refsect1>
1522     </refentry>
1523
1524
1525     <refentry id="with-cstring">
1526       <refnamediv>
1527         <refname>with-cstring</refname>
1528         <refpurpose>Binds a newly created cstring.
1529         </refpurpose>
1530         <refclass>Macro</refclass>
1531       </refnamediv>
1532       <refsynopsisdiv>
1533         <title>Syntax</title>
1534         <synopsis>
1535           <function>with-cstring</function> <replaceable>(cstring string) {body}</replaceable>
1536         </synopsis>
1537       </refsynopsisdiv>
1538       <refsect1>
1539         <title>Arguments and Values</title>
1540         <variablelist>
1541           <varlistentry>
1542             <term><parameter>cstring</parameter></term>
1543             <listitem>
1544               <para>A symbol naming the cstring to be created.
1545               </para>
1546             </listitem>
1547           </varlistentry>
1548           <varlistentry>
1549             <term><parameter>string</parameter></term>
1550             <listitem>
1551               <para>A Lisp string that will be translated to a cstring.
1552               </para>
1553             </listitem>
1554           </varlistentry>
1555           <varlistentry>
1556             <term><parameter>body</parameter></term>
1557             <listitem>
1558               <para>The body of where the cstring will be bound.
1559               </para>
1560             </listitem>
1561           </varlistentry>
1562         </variablelist>
1563       </refsect1>
1564       <refsect1>
1565         <title>Description</title>
1566         <para>
1567           Binds a lexical variable to a newly allocated <varname>cstring</varname>. Automatically frees <varname>cstring</varname>.
1568         </para>
1569       </refsect1>
1570       <refsect1>
1571         <title>Examples</title>
1572         <para>
1573             <programlisting>
1574 (def-function ("getenv" c-getenv) 
1575    ((name :cstring))
1576    :returning :cstring)
1577
1578 (defun getenv (key)
1579   "Returns an environment variable, or NIL if it does not exist"
1580   (check-type key string)
1581   (with-cstring (key-cstring key)
1582     (convert-from-cstring (c-getenv key-cstring))))
1583             </programlisting>
1584           </para>
1585         </refsect1>
1586       <refsect1>
1587         <title>Side Effects</title>
1588         <para>None.</para>
1589       </refsect1>
1590       <refsect1>
1591         <title>Affected by</title>
1592         <para>None.</para>
1593       </refsect1>
1594       <refsect1>
1595         <title>Exceptional Situations</title>
1596         <para>None.</para>
1597       </refsect1>
1598     </refentry>
1599
1600
1601     <refentry id="convert-from-foreign-string">
1602       <refnamediv>
1603         <refname>convert-from-foreign-string</refname>
1604         <refpurpose>Converts a foreign string into a Lisp string.
1605         </refpurpose>
1606         <refclass>Macro</refclass>
1607       </refnamediv>
1608       <refsynopsisdiv>
1609         <title>Syntax</title>
1610         <synopsis>
1611           <function>convert-from-foreign-string</function> <replaceable>foreign-string &amp;key length null-terminated-p</replaceable> => <returnvalue>string</returnvalue>
1612         </synopsis>
1613       </refsynopsisdiv>
1614       <refsect1>
1615         <title>Arguments and Values</title>
1616         <variablelist>
1617           <varlistentry>
1618             <term><parameter>foreign-string</parameter></term>
1619             <listitem>
1620               <para>A foreign string.
1621               </para>
1622             </listitem>
1623           </varlistentry>
1624           <varlistentry>
1625             <term><parameter>length</parameter></term>
1626             <listitem>
1627               <para>The length of the foreign string to
1628 convert. The default is the length of the string until a &null;
1629 character is reached.
1630               </para>
1631             </listitem>
1632           </varlistentry>
1633           <varlistentry>
1634             <term><parameter>null-terminated-p</parameter></term>
1635             <listitem>
1636               <para>A boolean flag with a default value of &t; When true,
1637 the string is converted until the first &null; character is reached.
1638               </para>
1639             </listitem>
1640           </varlistentry>
1641           <varlistentry>
1642             <term><returnvalue>string</returnvalue></term>
1643             <listitem>
1644               <para>A Lisp string.
1645               </para>
1646             </listitem>
1647           </varlistentry>
1648         </variablelist>
1649       </refsect1>
1650       <refsect1>
1651         <title>Description</title>
1652         <para>
1653           Returns a Lisp string from a foreign string. 
1654 Can translated ASCII and binary strings.
1655         </para>
1656       </refsect1>
1657       <refsect1>
1658         <title>Side Effects</title>
1659         <para>None.</para>
1660       </refsect1>
1661       <refsect1>
1662         <title>Affected by</title>
1663         <para>None.</para>
1664       </refsect1>
1665       <refsect1>
1666         <title>Exceptional Situations</title>
1667         <para>None.</para>
1668       </refsect1>
1669     </refentry>
1670
1671
1672     <refentry id="convert-to-foreign-string">
1673       <refnamediv>
1674         <refname>convert-to-foreign-string</refname>
1675         <refpurpose>Converts a Lisp string to a foreign string.
1676         </refpurpose>
1677         <refclass>Macro</refclass>
1678       </refnamediv>
1679       <refsynopsisdiv>
1680         <title>Syntax</title>
1681         <synopsis>
1682           <function>convert-to-foreign-string</function> <replaceable>string</replaceable> => <returnvalue>foreign-string</returnvalue>
1683         </synopsis>
1684       </refsynopsisdiv>
1685       <refsect1>
1686         <title>Arguments and Values</title>
1687         <variablelist>
1688           <varlistentry>
1689             <term><parameter>string</parameter></term>
1690             <listitem>
1691               <para>A Lisp string.
1692               </para>
1693             </listitem>
1694           </varlistentry>
1695           <varlistentry>
1696             <term><returnvalue>foreign-string</returnvalue></term>
1697             <listitem>
1698               <para>A foreign string.
1699               </para>
1700             </listitem>
1701           </varlistentry>
1702         </variablelist>
1703       </refsect1>
1704       <refsect1>
1705         <title>Description</title>
1706         <para>
1707           Converts a Lisp string to a foreign string. Memory should be
1708           freed with <function>free-foreign-object</function>.
1709         </para>
1710       </refsect1>
1711       <refsect1>
1712         <title>Side Effects</title>
1713         <para>None.</para>
1714       </refsect1>
1715       <refsect1>
1716         <title>Affected by</title>
1717         <para>None.</para>
1718       </refsect1>
1719       <refsect1>
1720         <title>Exceptional Situations</title>
1721         <para>None.</para>
1722       </refsect1>
1723     </refentry>
1724
1725
1726
1727     <refentry id="allocate-foreign-string">
1728       <refnamediv>
1729         <refname>allocate-foreign-string</refname>
1730         <refpurpose>Allocates space for a foreign string.
1731         </refpurpose>
1732         <refclass>Macro</refclass>
1733       </refnamediv>
1734       <refsynopsisdiv>
1735         <title>Syntax</title>
1736         <synopsis>
1737           <function>allocate-foreign-string</function> <replaceable>size &amp;key unsigned</replaceable> => <returnvalue>foreign-string</returnvalue>
1738         </synopsis>
1739       </refsynopsisdiv>
1740       <refsect1>
1741         <title>Arguments and Values</title>
1742         <variablelist>
1743           <varlistentry>
1744             <term><parameter>size</parameter></term>
1745             <listitem>
1746               <para>The size of the space to be allocated in bytes.
1747               </para>
1748             </listitem>
1749           </varlistentry>
1750           <varlistentry>
1751             <term><parameter>unsigned</parameter></term>
1752             <listitem>
1753               <para>A boolean flag with a default value of &t;. When true,
1754 marks the pointer as an <constant>:unsigned-char</constant>.
1755               </para>
1756             </listitem>
1757           </varlistentry>
1758           <varlistentry>
1759             <term><returnvalue>foreign-string</returnvalue></term>
1760             <listitem>
1761               <para>A foreign string which has undefined contents.
1762               </para>
1763             </listitem>
1764           </varlistentry>
1765         </variablelist>
1766       </refsect1>
1767       <refsect1>
1768         <title>Description</title>
1769         <para>
1770           Allocates space for a foreign string. Memory should
1771           be freed with <function>free-foreign-object</function>.
1772         </para>
1773       </refsect1>
1774       <refsect1>
1775         <title>Side Effects</title>
1776         <para>None.</para>
1777       </refsect1>
1778       <refsect1>
1779         <title>Affected by</title>
1780         <para>None.</para>
1781       </refsect1>
1782       <refsect1>
1783         <title>Exceptional Situations</title>
1784         <para>None.</para>
1785       </refsect1>
1786     </refentry>
1787
1788   </reference>
1789
1790   <reference>
1791       <title>Functions &amp; Libraries</title>
1792
1793       <refentry id="def-function">
1794         <refnamediv>
1795           <refname>def-function</refname>
1796         <refpurpose>Declares a function. 
1797         </refpurpose>
1798         <refclass>Macro</refclass>
1799       </refnamediv>
1800       <refsynopsisdiv>
1801         <title>Syntax</title>
1802         <synopsis>
1803           <function>def-function</function> <replaceable>name args &amp;key module returning</replaceable>
1804         </synopsis>
1805       </refsynopsisdiv>
1806       <refsect1>
1807         <title>Arguments and Values</title>
1808         <variablelist>
1809           <varlistentry>
1810             <term><parameter>name</parameter></term>
1811             <listitem>
1812               <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.
1813               </para>
1814             </listitem>
1815           </varlistentry>
1816           <varlistentry>
1817             <term><parameter>args</parameter></term>
1818             <listitem>
1819               <para>A list of argument declarations. If &nil;, indicates that the function does not take any arguments.
1820               </para>
1821             </listitem>
1822           </varlistentry>
1823           <varlistentry>
1824             <term><parameter>module</parameter></term>
1825             <listitem>
1826               <para>A string specifying which module (or library) that the foreign function resides. (Required by Lispworks)</para>
1827             </listitem>
1828           </varlistentry>
1829           <varlistentry>
1830             <term><returnvalue>returning</returnvalue></term>
1831             <listitem>
1832               <para>A declaration specifying the result type of the
1833 foreign function. If <constant>:void</constant> indicates module does not return any value.
1834               </para>
1835             </listitem>
1836           </varlistentry>
1837         </variablelist>
1838       </refsect1>
1839       <refsect1>
1840         <title>Description</title>
1841         <para>Declares a foreign function.
1842         </para>
1843       </refsect1>
1844       <refsect1>
1845         <title>Examples</title>
1846         <programlisting>
1847 (def-function "gethostname" 
1848   ((name (* :unsigned-char))
1849    (len :int))
1850   :returning :int)
1851         </programlisting>
1852       </refsect1>
1853       <refsect1>
1854         <title>Side Effects</title>
1855         <para>None.</para>
1856       </refsect1>
1857       <refsect1>
1858         <title>Affected by</title>
1859         <para>None.</para>
1860       </refsect1>
1861       <refsect1>
1862         <title>Exceptional Situations</title>
1863         <para>None.</para>
1864       </refsect1>
1865     </refentry>
1866
1867       <refentry id="load-foreign-library">
1868         <refnamediv>
1869           <refname>load-foreign-library</refname>
1870         <refpurpose>Loads a foreign library. 
1871         </refpurpose>
1872         <refclass>Function</refclass>
1873       </refnamediv>
1874       <refsect1>
1875         <title>Syntax</title>
1876 <synopsis>
1877           <function>load-foreign-library</function> <replaceable>filename &amp;key module supporting-libraries</replaceable> => <returnvalue>success</returnvalue>
1878 </synopsis>
1879       </refsect1>
1880       <refsect1>
1881         <title>Arguments and Values</title>
1882         <variablelist>
1883           <varlistentry>
1884             <term><parameter>filename</parameter></term>
1885             <listitem>
1886               <para>A string or pathname specifying the library location
1887 in the filesystem. At least one implementation (&lw;) can not
1888 accept a logical pathname.
1889               </para>
1890             </listitem>
1891           </varlistentry>
1892           <varlistentry>
1893             <term><parameter>module</parameter></term>
1894             <listitem>
1895               <para>A string designating the name of the module to apply
1896 to functions in this library. (Required for Lispworks)
1897               </para>
1898             </listitem>
1899           </varlistentry>
1900           <varlistentry>
1901             <term><parameter>supporting-libraries</parameter></term>
1902             <listitem>
1903               <para>A list of strings naming the libraries required to
1904 link the foreign library. (Required by CMUCL)
1905               </para>
1906             </listitem>
1907           </varlistentry>
1908           <varlistentry>
1909             <term><returnvalue>success</returnvalue></term>
1910             <listitem>
1911               <para>A boolean flag, &t; if the library was able to be
1912 loaded successfully or if the library has been previously loaded,
1913 otherwise &nil;.
1914               </para>
1915             </listitem>
1916           </varlistentry>
1917         </variablelist>
1918       </refsect1>
1919       <refsect1>
1920         <title>Description</title>
1921         <para>Loads a foreign library. Applies a module name to functions
1922 within the library. Ensures that a library is only loaded once during
1923 a session.
1924         </para>
1925       </refsect1>
1926       <refsect1>
1927         <title>Examples</title>
1928         <programlisting>
1929   (load-foreign-library #p"/usr/lib/libmysqlclient.so" 
1930                         :module "mysql" 
1931                         :supporting-libraries '("c"))
1932     => T
1933         </programlisting>
1934       </refsect1>
1935       <refsect1>
1936         <title>Side Effects</title>
1937         <para>Loads the foreign code into the Lisp system.
1938         </para>
1939       </refsect1>
1940       <refsect1>
1941         <title>Affected by</title>
1942         <para>Ability to load the file.</para>
1943       </refsect1>
1944       <refsect1>
1945         <title>Exceptional Situations</title>
1946         <para>None.</para>
1947       </refsect1>
1948     </refentry>
1949
1950 </reference>
1951
1952