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