cffi-manual.texinfo - clic - Clic is an command line interactive client for gopher written in Common LISP (HTM) git clone git://bitreich.org/clic/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/clic/ (DIR) Log (DIR) Files (DIR) Refs (DIR) Tags (DIR) README (DIR) LICENSE --- cffi-manual.texinfo (218970B) --- 1 \input texinfo @c -*- Mode: Texinfo; Mode: auto-fill -*- 2 @c %**start of header 3 @setfilename cffi.info 4 @settitle CFFI User Manual 5 @exampleindent 2 6 7 @c @documentencoding utf-8 8 9 @c Style notes: 10 @c 11 @c * The reference section names and "See Also" list are roman, not 12 @c @code. This is to follow the format of CLHS. 13 @c 14 @c * How it looks in HTML is the priority. 15 16 @c ============================= Macros ============================= 17 @c The following macros are used throughout this manual. 18 19 @macro Function {args} 20 @defun \args\ 21 @end defun 22 @end macro 23 24 @macro Macro {args} 25 @defmac \args\ 26 @end defmac 27 @end macro 28 29 @macro Accessor {args} 30 @deffn {Accessor} \args\ 31 @end deffn 32 @end macro 33 34 @macro GenericFunction {args} 35 @deffn {Generic Function} \args\ 36 @end deffn 37 @end macro 38 39 @macro ForeignType {args} 40 @deftp {Foreign Type} \args\ 41 @end deftp 42 @end macro 43 44 @macro Variable {args} 45 @defvr {Special Variable} \args\ 46 @end defvr 47 @end macro 48 49 @macro Condition {args} 50 @deftp {Condition Type} \args\ 51 @end deftp 52 @end macro 53 54 @macro cffi 55 @acronym{CFFI} 56 @end macro 57 58 @macro impnote {text} 59 @quotation 60 @strong{Implementor's note:} @emph{\text\} 61 @end quotation 62 @end macro 63 64 @c Info "requires" that x-refs end in a period or comma, or ) in the 65 @c case of @pxref. So the following implements that requirement for 66 @c the "See also" subheadings that permeate this manual, but only in 67 @c Info mode. 68 @ifinfo 69 @macro seealso {name} 70 @ref{\name\}. 71 @end macro 72 @end ifinfo 73 74 @ifnotinfo 75 @alias seealso = ref 76 @end ifnotinfo 77 78 @c Typeset comments in roman font for the TeX output. 79 @iftex 80 @alias lispcmt = r 81 @end iftex 82 @ifnottex 83 @alias lispcmt = asis 84 @end ifnottex 85 86 @alias res = result 87 88 @c ============================= Macros ============================= 89 90 91 @c Show types, functions, and concepts in the same index. 92 @syncodeindex tp cp 93 @syncodeindex fn cp 94 95 @copying 96 Copyright @copyright{} 2005 James Bielman <jamesjb at jamesjb.com> @* 97 Copyright @copyright{} 2005-2015 Lu@'{@dotless{i}}s Oliveira 98 <loliveira at common-lisp.net> @* 99 Copyright @copyright{} 2005-2006 Dan Knapp <danka at accela.net> @* 100 Copyright @copyright{} 2005-2006 Emily Backes <lucca at accela.net> @* 101 Copyright @copyright{} 2006 Stephen Compall <s11 at member.fsf.org> 102 103 @quotation 104 Permission is hereby granted, free of charge, to any person obtaining 105 a copy of this software and associated documentation files (the 106 ``Software''), to deal in the Software without restriction, including 107 without limitation the rights to use, copy, modify, merge, publish, 108 distribute, sublicense, and/or sell copies of the Software, and to 109 permit persons to whom the Software is furnished to do so, subject to 110 the following conditions: 111 112 The above copyright notice and this permission notice shall be 113 included in all copies or substantial portions of the Software. 114 115 @sc{The software is provided ``as is'', without warranty of any kind, 116 express or implied, including but not limited to the warranties of 117 merchantability, fitness for a particular purpose and noninfringement. 118 In no event shall the authors or copyright holders be liable for any 119 claim, damages or other liability, whether in an action of contract, 120 tort or otherwise, arising from, out of or in connection with the 121 software or the use or other dealings in the software.} 122 @end quotation 123 @end copying 124 @c %**end of header 125 126 @dircategory Software development 127 @direntry 128 * CFFI Manual: (cffi-manual). CFFI Manual. 129 @end direntry 130 131 @titlepage 132 @title CFFI User Manual 133 @c @subtitle Version X.X 134 @c @author James Bielman 135 136 @page 137 @vskip 0pt plus 1filll 138 @insertcopying 139 @end titlepage 140 141 @contents 142 143 @ifnottex 144 @node Top, Introduction, (dir), (dir) 145 @top cffi 146 @insertcopying 147 @end ifnottex 148 149 @menu 150 * Introduction:: What is CFFI? 151 * Installation:: 152 * Implementation Support:: 153 * Tutorial:: Interactive intro to using CFFI. 154 * Wrapper generators:: CFFI forms from munging C source code. 155 * Foreign Types:: 156 * Pointers:: 157 * Strings:: 158 * Variables:: 159 * Functions:: 160 * Libraries:: 161 * Callbacks:: 162 * The Groveller:: 163 * Static Linking:: 164 * Limitations:: 165 * Platform-specific features:: Details about the underlying system. 166 * Glossary:: List of CFFI-specific terms and meanings. 167 * Comprehensive Index:: 168 169 @detailmenu 170 --- Dictionary --- 171 172 Foreign Types 173 174 * convert-from-foreign:: Outside interface to backward type translator. 175 * convert-to-foreign:: Outside interface to forward type translator. 176 * defbitfield:: Defines a bitfield. 177 * defcstruct:: Defines a C structure type. 178 * defcunion:: Defines a C union type. 179 * defctype:: Defines a foreign typedef. 180 * defcenum:: Defines a C enumeration. 181 * define-foreign-type:: Defines a foreign type specifier. 182 * define-parse-method:: Specifies how a type should be parsed. 183 @c * explain-foreign-slot-value:: <unimplemented> 184 * foreign-bitfield-symbols:: Returns a list of symbols for a bitfield type. 185 * foreign-bitfield-value:: Calculates a value for a bitfield type. 186 * foreign-enum-keyword:: Finds a keyword in an enum type. 187 * foreign-enum-value:: Finds a value in an enum type. 188 * foreign-slot-names:: Returns a list of slot names in a foreign struct. 189 * foreign-slot-offset:: Returns the offset of a slot in a foreign struct. 190 * foreign-slot-pointer:: Returns a pointer to a slot in a foreign struct. 191 * foreign-slot-value:: Returns the value of a slot in a foreign struct. 192 * foreign-type-alignment:: Returns the alignment of a foreign type. 193 * foreign-type-size:: Returns the size of a foreign type. 194 * free-converted-object:: Outside interface to typed object deallocators. 195 * free-translated-object:: Defines how to free a oreign object. 196 * translate-from-foreign:: Defines a foreign-to-Lisp object translation. 197 * translate-to-foreign:: Defines a Lisp-to-foreign object translation. 198 * with-foreign-object:: Allocates a foreign object with dynamic extent. 199 * with-foreign-objects:: Plural form of @code{with-foreign-object}. 200 * with-foreign-slots:: Accesses the slots of a foreign structure. 201 202 Pointers 203 204 * foreign-free:: Deallocates memory. 205 * foreign-alloc:: Allocates memory. 206 * foreign-symbol-pointer:: Returns a pointer to a foreign symbol. 207 * inc-pointer:: Increments the address held by a pointer. 208 * incf-pointer:: Increments the pointer address in a place. 209 * make-pointer:: Returns a pointer to a given address. 210 * mem-aptr:: The pointer to an element of an array. 211 * mem-aref:: Accesses the value of an index in an array. 212 * mem-ref:: Dereferences a pointer. 213 * null-pointer:: Returns a NULL pointer. 214 * null-pointer-p:: Tests a pointer for NULL value. 215 * pointerp:: Tests whether an object is a pointer or not. 216 * pointer-address:: Returns the address pointed to by a pointer. 217 * pointer-eq:: Tests if two pointers point to the same address. 218 * with-foreign-pointer:: Allocates memory with dynamic extent. 219 220 Strings 221 222 * *default-foreign-encoding*:: Default encoding for the string types. 223 * foreign-string-alloc:: Converts a Lisp string to a foreign string. 224 * foreign-string-free:: Deallocates memory used by a foreign string. 225 * foreign-string-to-lisp:: Converts a foreign string to a Lisp string. 226 * lisp-string-to-foreign:: Copies a Lisp string into a foreign string. 227 * with-foreign-string:: Allocates a foreign string with dynamic extent. 228 * with-foreign-strings:: Plural form of @code{with-foreign-string}. 229 * with-foreign-pointer-as-string:: Similar to CL's with-output-to-string. 230 231 Variables 232 233 * defcvar:: Defines a C global variable. 234 * get-var-pointer:: Returns a pointer to a defined global variable. 235 236 Functions 237 238 * defcfun:: Defines a foreign function. 239 * foreign-funcall:: Performs a call to a foreign function. 240 * foreign-funcall-pointer:: Performs a call through a foreign pointer. 241 * translate-camelcase-name:: Converts a camelCase foreign name to/from a Lisp name. 242 * translate-name-from-foreign:: Converts a foreign name to a Lisp name. 243 * translate-name-to-foreign:: Converts a Lisp name to a foreign name. 244 * translate-underscore-separated-name:: Converts an underscore_separated foreign name to/from a Lisp name. 245 246 Libraries 247 248 * close-foreign-library:: Closes a foreign library. 249 * *darwin-framework-directories*:: Search path for Darwin frameworks. 250 * define-foreign-library:: Explain how to load a foreign library. 251 * *foreign-library-directories*:: Search path for shared libraries. 252 * load-foreign-library:: Load a foreign library. 253 * load-foreign-library-error:: Signalled on failure of its namesake. 254 @c * reload-foreign-libraries:: Reload foreign libraries. 255 * use-foreign-library:: Load a foreign library when needed. 256 257 Callbacks 258 259 * callback:: Returns a pointer to a defined callback. 260 * defcallback:: Defines a Lisp callback. 261 * get-callback:: Returns a pointer to a defined callback. 262 263 @end detailmenu 264 @end menu 265 266 267 268 269 @c =================================================================== 270 @c CHAPTER: Introduction 271 272 @node Introduction, Installation, Top, Top 273 @chapter Introduction 274 275 @cffi{} is the Common Foreign Function Interface for @acronym{ANSI} 276 Common Lisp systems. By @dfn{foreign function} we mean a function 277 written in another programming language and having different data and 278 calling conventions than Common Lisp, namely, C. @cffi{} allows you 279 to call foreign functions and access foreign variables, all without 280 leaving the Lisp image. 281 282 We consider this manual ever a work in progress. If you have 283 difficulty with anything @cffi{}-specific presented in the manual, 284 please contact @email{cffi-devel@@common-lisp.net,the developers} with 285 details. 286 287 288 @heading Motivation 289 290 @xref{Tutorial-Comparison,, What makes Lisp different}, for 291 an argument in favor of @acronym{FFI} in general. 292 293 @cffi{}'s primary role in any image is to mediate between Lisp 294 developers and the widely varying @acronym{FFI}s present in the 295 various Lisp implementations it supports. With @cffi{}, you can 296 define foreign function interfaces while still maintaining portability 297 between implementations. It is not the first Common Lisp package with 298 this objective; however, it is meant to be a more malleable framework 299 than similar packages. 300 301 302 @heading Design Philosophy 303 304 @itemize 305 @item 306 Pointers do not carry around type information. Instead, type 307 information is supplied when pointers are dereferenced. 308 309 @item 310 A type safe pointer interface can be developed on top of an 311 untyped one. It is difficult to do the opposite. 312 313 @item 314 Functions are better than macros. When a macro could be used 315 for performance, use a compiler-macro instead. 316 @end itemize 317 318 319 @c =================================================================== 320 @c CHAPTER: Installation 321 322 @node Installation, Implementation Support, Introduction, Top 323 @chapter Installation 324 325 @cffi{} can be obtained through one of the following means available 326 through its @uref{http://common-lisp.net/project/cffi/,,website}: 327 328 @itemize 329 @item 330 @uref{http://common-lisp.net/project/cffi/releases/?M=D,,official release 331 tarballs} 332 333 @item 334 @uref{http://common-lisp.net/gitweb?p=projects/cffi/cffi.git,,git 335 repository} 336 337 @c snapshots have been disabled as of 338 @c @item 339 @c @uref{http://common-lisp.net/project/cffi/tarballs/?M=D,,nightly-generated 340 @c snapshots} 341 342 @end itemize 343 344 In addition, you will need to obtain and install the following 345 dependencies: 346 347 @itemize 348 @item 349 @uref{http://common-lisp.net/project/babel/,,Babel}, a charset 350 encoding/decoding library. 351 352 @item 353 @uref{http://common-lisp.net/project/alexandria/,,Alexandria}, a 354 collection of portable public-domain utilities. 355 356 @item 357 @uref{http://www.cliki.net/trivial-features,,trivial-features}, a 358 portability layer that ensures consistent @code{*features*} across 359 multiple Common Lisp implementations. 360 361 @end itemize 362 363 Furthermore, if you wish to run the testsuite, 364 @uref{http://www.cliki.net/rt,,RT} is required. 365 366 You may find mechanisms such as 367 @uref{https://www.quicklisp.org/beta/,Quicklisp} (recommended) 368 or @uref{http://common-lisp.net/project/clbuild/,,clbuild} (for advanced 369 uses) helpful in getting and managing @cffi{} and its 370 dependencies. 371 372 373 @c =================================================================== 374 @c CHAPTER: Implementation Support 375 376 @node Implementation Support, Tutorial, Installation, Top 377 @chapter Implementation Support 378 379 @cffi{} supports various free and commercial Lisp implementations: 380 @acronym{ABCL}, Allegro CL, Clasp, @sc{clisp}, Clozure CL, 381 @acronym{CMUCL}, Corman CL, @acronym{ECL}, @acronym{GCL}, LispWorks, 382 @acronym{MCL}, @acronym{SBCL} and the Scieneer CL. 383 384 In general, you should work with the latest versions of each 385 implementation since those will usually be tested against recent 386 versions of CFFI more often and might include necessary features or 387 bug fixes. Reasonable patches for compatibility with earlier versions 388 are welcome nevertheless. 389 390 @section Limitations 391 392 Some features are not supported in all implementations. 393 @c TODO: describe these features here. 394 @c flat-namespace too 395 396 @subheading Allegro CL 397 398 @itemize 399 @item 400 Does not support the @code{:long-long} type natively. 401 @item 402 Unicode support is limited to the Basic Multilingual Plane (16-bit 403 code points). 404 @end itemize 405 406 @subheading Clasp 407 408 @itemize 409 @item 410 Only supports a flat namespace. 411 @end itemize 412 413 @subheading CMUCL 414 415 @itemize 416 @item 417 No Unicode support. (8-bit code points) 418 @end itemize 419 420 @subheading Corman CL 421 422 @itemize 423 @item 424 Does not support @code{foreign-funcall}. 425 @end itemize 426 427 @subheading @acronym{ECL} 428 429 @itemize 430 @item 431 On platforms where ECL's dynamic FFI is not supported (ie. when 432 @code{:dffi} is not present in @code{*features*}), 433 @code{cffi:load-foreign-library} does not work and you must use ECL's 434 own @code{ffi:load-foreign-library} with a constant string argument. 435 @end itemize 436 437 @subheading Lispworks 438 439 @itemize 440 @item 441 Does not completely support the @code{:long-long} type natively in 442 32-bit platforms. 443 @item 444 Unicode support is limited to the Basic Multilingual Plane (16-bit 445 code points). 446 @end itemize 447 448 @subheading @acronym{SBCL} 449 450 @itemize 451 @item 452 Not all platforms support callbacks. 453 454 @end itemize 455 456 457 @c =================================================================== 458 @c CHAPTER: An Introduction to Foreign Interfaces and CFFI 459 460 @c This macro is merely a marker that I don't think I'll use after 461 @c all. 462 @macro tutorialsource {text} 463 @c \text\ 464 @end macro 465 466 @c because I don't want to type this over and over 467 @macro clikicffi 468 http://www.cliki.net/CFFI 469 @end macro 470 @c TeX puts spurious newlines in when you use the above macro 471 @c in @examples &c. So it is expanded below in some places. 472 473 474 @node Tutorial, Wrapper generators, Implementation Support, Top 475 @chapter An Introduction to Foreign Interfaces and @acronym{CFFI} 476 477 @c Above, I don't use the cffi macro because it breaks TeX. 478 479 @cindex tutorial, @cffi{} 480 Users of many popular languages bearing semantic similarity to Lisp, 481 such as Perl and Python, are accustomed to having access to popular C 482 libraries, such as @acronym{GTK}, by way of ``bindings''. In Lisp, we 483 do something similar, but take a fundamentally different approach. 484 This tutorial first explains this difference, then explains how you 485 can use @cffi{}, a powerful system for calling out to C and C++ and 486 access C data from many Common Lisp implementations. 487 488 @cindex foreign functions and data 489 The concept can be generalized to other languages; at the time of 490 writing, only @cffi{}'s C support is fairly complete. Therefore, we 491 will interchangeably refer to @dfn{foreign functions} and @dfn{foreign 492 data}, and ``C functions'' and ``C data''. At no time will the word 493 ``foreign'' carry its usual, non-programming meaning. 494 495 This tutorial expects you to have a working understanding of both 496 Common Lisp and C, including the Common Lisp macro system. 497 498 @menu 499 * Tutorial-Comparison:: Why FFI? 500 * Tutorial-Getting a URL:: An FFI use case. 501 * Tutorial-Loading:: Load libcurl.so. 502 * Tutorial-Initializing:: Call a function in libcurl.so. 503 * Tutorial-easy_setopt:: An advanced libcurl function. 504 * Tutorial-Abstraction:: Why breaking it is necessary. 505 * Tutorial-Lisp easy_setopt:: Semi-Lispy option interface. 506 * Tutorial-Memory:: In C, you collect the garbage. 507 * Tutorial-Callbacks:: Make useful C function pointers. 508 * Tutorial-Completion:: Minimal get-url functionality. 509 * Tutorial-Types:: Defining new foreign types. 510 * Tutorial-Conclusion:: What's next? 511 @end menu 512 513 514 @node Tutorial-Comparison, Tutorial-Getting a URL, Tutorial, Tutorial 515 @section What makes Lisp different 516 517 The following sums up how bindings to foreign libraries are usually 518 implemented in other languages, then in Common Lisp: 519 520 @table @asis 521 @item Perl, Python, Java, other one-implementation languages 522 @cindex @acronym{SWIG} 523 @cindex Perl 524 @cindex Python 525 Bindings are implemented as shared objects written in C. In some 526 cases, the C code is generated by a tool, such as @acronym{SWIG}, but 527 the result is the same: a new C library that manually translates 528 between the language implementation's objects, such as @code{PyObject} 529 in Python, and whatever C object is called for, often using C 530 functions provided by the implementation. It also translates between 531 the calling conventions of the language and C. 532 533 @item Common Lisp 534 @cindex @acronym{SLIME} 535 Bindings are written in Lisp. They can be created at-will by Lisp 536 programs. Lisp programmers can write new bindings and add them to the 537 image, using a listener such as @acronym{SLIME}, as easily as with 538 regular Lisp definitions. The only foreign library to load is the one 539 being wrapped---the one with the pure C interface; no C or other 540 non-Lisp compilation is required. 541 @end table 542 543 @cindex advantages of @acronym{FFI} 544 @cindex benefits of @acronym{FFI} 545 We believe the advantages of the Common Lisp approach far outweigh any 546 disadvantages. Incremental development with a listener can be as 547 productive for C binding development as it is with other Lisp 548 development. Keeping it ``in the [Lisp] family'', as it were, makes 549 it much easier for you and other Lisp programmers to load and use the 550 bindings. Common Lisp implementations such as @acronym{CMUCL}, freed 551 from having to provide a C interface to their own objects, are thus 552 freed to be implemented in another language (as @acronym{CMUCL} is) 553 while still allowing programmers to call foreign functions. 554 555 @cindex minimal bindings 556 Perhaps the greatest advantage is that using an @acronym{FFI} doesn't 557 obligate you to become a professional binding developer. Writers of 558 bindings for other languages usually end up maintaining or failing to 559 maintain complete bindings to the foreign library. Using an 560 @acronym{FFI}, however, means if you only need one or two functions, 561 you can write bindings for only those functions, and be assured that 562 you can just as easily add to the bindings if need be. 563 564 @cindex C abstractions 565 @cindex abstractions in C 566 The removal of the C compiler, or C interpretation of any kind, 567 creates the main disadvantage: some of C's ``abstractions'' are not 568 available, violating information encapsulation. For example, 569 @code{struct}s that must be passed on the stack, or used as return 570 values, without corresponding functional abstractions to create and 571 manage the @code{struct}s, must be declared explicitly in Lisp. This 572 is fine for structs whose contents are ``public'', but is not so 573 pleasant when a struct is supposed to be ``opaque'' by convention, 574 even though it is not so defined.@footnote{Admittedly, this is an 575 advanced issue, and we encourage you to leave this text until you are 576 more familiar with how @cffi{} works.} 577 578 Without an abstraction to create the struct, Lisp needs to be able to 579 lay out the struct in memory, so must know its internal details. 580 581 @cindex workaround for C 582 In these cases, you can create a minimal C library to provide the 583 missing abstractions, without destroying all the advantages of the 584 Common Lisp approach discussed above. In the case of @code{struct}s, 585 you can write simple, pure C functions that tell you how many bytes a 586 struct requires or allocate new structs, read and write fields of the 587 struct, or whatever operations are supposed to be 588 public.@footnote{This does not apply to structs whose contents are 589 intended to be part of the public library interface. In those cases, 590 a pure Lisp struct definition is always preferred. In fact, many 591 prefer to stay in Lisp and break the encapsulation anyway, placing the 592 burden of correct library interface definition on the library.} 593 @ref{The Groveller} automates this and other processes. 594 595 Another disadvantage appears when you would rather use the foreign 596 language than Lisp. However, someone who prefers C to Lisp is not a 597 likely candidate for developing a Lisp interface to a C library. 598 599 600 @node Tutorial-Getting a URL, Tutorial-Loading, Tutorial-Comparison, Tutorial 601 @section Getting a @acronym{URL} 602 603 @cindex c@acronym{URL} 604 The widely available @code{libcurl} is a library for downloading files 605 over protocols like @acronym{HTTP}. We will use @code{libcurl} with 606 @cffi{} to download a web page. 607 608 Please note that there are many other ways to download files from the 609 web, not least the @sc{cl-curl} project to provide bindings to 610 @code{libcurl} via a similar @acronym{FFI}.@footnote{Specifically, 611 @acronym{UFFI}, an older @acronym{FFI} that takes a somewhat different 612 approach compared to @cffi{}. I believe that these days (December 613 2005) @cffi{} is more portable and actively developed, though not as 614 mature yet. Consensus in the free @sc{unix} Common Lisp community 615 seems to be that @cffi{} is preferred for new development, though 616 @acronym{UFFI} will likely go on for quite some time as many projects 617 already use it. @cffi{} includes the @code{UFFI-COMPAT} package for 618 complete compatibility with @acronym{UFFI}.} 619 620 @uref{http://curl.haxx.se/libcurl/c/libcurl-tutorial.html,,libcurl-tutorial(3)} 621 is a tutorial for @code{libcurl} programming in C. We will follow 622 that to develop a binding to download a file. We will also use 623 @file{curl.h}, @file{easy.h}, and the @command{man} pages for the 624 @code{libcurl} function, all available in the @samp{curl-dev} package 625 or equivalent for your system, or in the c@acronym{URL} source code 626 package. If you have the development package, the headers should be 627 installed in @file{/usr/include/curl/}, and the @command{man} pages 628 may be accessed through your favorite @command{man} facility. 629 630 631 @node Tutorial-Loading, Tutorial-Initializing, Tutorial-Getting a URL, Tutorial 632 @section Loading foreign libraries 633 634 @cindex loading @cffi{} 635 @cindex requiring @cffi{} 636 First of all, we will create a package to work in. You can save these 637 forms in a file, or just send them to the listener as they are. If 638 creating bindings for an @acronym{ASDF} package of yours, you will 639 want to add @code{:cffi} to the @code{:depends-on} list in your 640 @file{.asd} file. Otherwise, just use the @code{asdf:load-system} function to 641 load @cffi{}. 642 643 @tutorialsource{Initialization} 644 @lisp 645 (asdf:load-system :cffi) 646 647 ;;; @lispcmt{Nothing special about the "CFFI-USER" package. We're just} 648 ;;; @lispcmt{using it as a substitute for your own CL package.} 649 (defpackage :cffi-user 650 (:use :common-lisp :cffi)) 651 652 (in-package :cffi-user) 653 654 (define-foreign-library libcurl 655 (:darwin (:or "libcurl.3.dylib" "libcurl.dylib")) 656 (:unix (:or "libcurl.so.3" "libcurl.so")) 657 (t (:default "libcurl"))) 658 659 (use-foreign-library libcurl) 660 @end lisp 661 662 @cindex foreign library load 663 @cindex library, foreign 664 Using @code{define-foreign-library} and @code{use-foreign-library}, we 665 have loaded @code{libcurl} into Lisp, much as the linker does when you 666 start a C program, or @code{common-lisp:load} does with a Lisp source 667 file or @acronym{FASL} file. We special-cased for @sc{unix} machines 668 to always load a particular version, the one this tutorial was tested 669 with; for those who don't care, the @code{define-foreign-library} 670 clause @code{(t (:default "libcurl"))} should be satisfactory, and 671 will adapt to various operating systems. 672 673 674 @node Tutorial-Initializing, Tutorial-easy_setopt, Tutorial-Loading, Tutorial 675 @section Initializing @code{libcurl} 676 677 @cindex function definition 678 After the introductory matter, the tutorial goes on to present the 679 first function you should use. 680 681 @example 682 CURLcode curl_global_init(long flags); 683 @end example 684 685 @noindent 686 Let's pick this apart into appropriate Lisp code: 687 688 @tutorialsource{First CURLcode} 689 @lisp 690 ;;; @lispcmt{A CURLcode is the universal error code. curl/curl.h says} 691 ;;; @lispcmt{no return code will ever be removed, and new ones will be} 692 ;;; @lispcmt{added to the end.} 693 (defctype curl-code :int) 694 695 ;;; @lispcmt{Initialize libcurl with FLAGS.} 696 (defcfun "curl_global_init" curl-code 697 (flags :long)) 698 @end lisp 699 700 @impnote{By default, CFFI assumes the UNIX viewpoint that there is one 701 C symbol namespace, containing all symbols in all loaded objects. 702 This is not so on Windows and Darwin, but we emulate UNIX's behaviour 703 there. @ref{defcfun} for more details.} 704 705 Note the parallels with the original C declaration. We've defined 706 @code{curl-code} as a wrapping type for @code{:int}; right now, it 707 only marks it as special, but later we will do something more 708 interesting with it. The point is that we don't have to do it yet. 709 710 @cindex calling foreign functions 711 Looking at @file{curl.h}, @code{CURL_GLOBAL_NOTHING}, a possible value 712 for @code{flags} above, is defined as @samp{0}. So we can now call 713 the function: 714 715 @example 716 @sc{cffi-user>} (curl-global-init 0) 717 @result{} 0 718 @end example 719 720 @cindex looks like it worked 721 Looking at @file{curl.h} again, @code{0} means @code{CURLE_OK}, so it 722 looks like the call succeeded. Note that @cffi{} converted the 723 function name to a Lisp-friendly name. You can specify your own name 724 if you want; use @code{("curl_global_init" @var{your-name-here})} as 725 the @var{name} argument to @code{defcfun}. 726 727 The tutorial goes on to have us allocate a handle. For good measure, 728 we should also include the deallocator. Let's look at these 729 functions: 730 731 @example 732 CURL *curl_easy_init( ); 733 void curl_easy_cleanup(CURL *handle); 734 @end example 735 736 Advanced users may want to define special pointer types; we will 737 explore this possibility later. For now, just treat every pointer as 738 the same: 739 740 @tutorialsource{curl_easy handles} 741 @lisp 742 (defcfun "curl_easy_init" :pointer) 743 744 (defcfun "curl_easy_cleanup" :void 745 (easy-handle :pointer)) 746 @end lisp 747 748 Now we can continue with the tutorial: 749 750 @example 751 @sc{cffi-user>} (defparameter *easy-handle* (curl-easy-init)) 752 @result{} *EASY-HANDLE* 753 @sc{cffi-user>} *easy-handle* 754 @result{} #<FOREIGN-ADDRESS #x09844EE0> 755 @end example 756 757 @cindex pointers in Lisp 758 Note the print representation of a pointer. It changes depending on 759 what Lisp you are using, but that doesn't make any difference to 760 @cffi{}. 761 762 763 @node Tutorial-easy_setopt, Tutorial-Abstraction, Tutorial-Initializing, Tutorial 764 @section Setting download options 765 766 The @code{libcurl} tutorial says we'll want to set many options before 767 performing any download actions. This is done through 768 @code{curl_easy_setopt}: 769 770 @c That is literally ..., not an ellipsis. 771 @example 772 CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...); 773 @end example 774 775 @cindex varargs 776 @cindex foreign arguments 777 We've introduced a new twist: variable arguments. There is no obvious 778 translation to the @code{defcfun} form, particularly as there are four 779 possible argument types. Because of the way C works, we could define 780 four wrappers around @code{curl_easy_setopt}, one for each type; in 781 this case, however, we'll use the general-purpose macro 782 @code{foreign-funcall} to call this function. 783 784 @cindex enumeration, C 785 To make things easier on ourselves, we'll create an enumeration of the 786 kinds of options we want to set. The @code{enum CURLoption} isn't the 787 most straightforward, but reading the @code{CINIT} C macro definition 788 should be enlightening. 789 790 @tutorialsource{CURLoption enumeration} 791 @lisp 792 (defmacro define-curl-options (name type-offsets &rest enum-args) 793 "As with CFFI:DEFCENUM, except each of ENUM-ARGS is as follows: 794 795 (NAME TYPE NUMBER) 796 797 Where the arguments are as they are with the CINIT macro defined 798 in curl.h, except NAME is a keyword. 799 800 TYPE-OFFSETS is a plist of TYPEs to their integer offsets, as 801 defined by the CURLOPTTYPE_LONG et al constants in curl.h." 802 (flet ((enumerated-value (type offset) 803 (+ (getf type-offsets type) offset))) 804 `(progn 805 (defcenum ,name 806 ,@@(loop for (name type number) in enum-args 807 collect (list name (enumerated-value type number)))) 808 ',name))) ;@lispcmt{for REPL users' sanity} 809 810 (define-curl-options curl-option 811 (long 0 objectpoint 10000 functionpoint 20000 off-t 30000) 812 (:noprogress long 43) 813 (:nosignal long 99) 814 (:errorbuffer objectpoint 10) 815 (:url objectpoint 2)) 816 @end lisp 817 818 With some well-placed Emacs @code{query-replace-regexp}s, you could 819 probably similarly define the entire @code{CURLoption} enumeration. I 820 have selected to transcribe a few that we will use in this tutorial. 821 822 If you're having trouble following the macrology, just macroexpand the 823 @code{curl-option} definition, or see the following macroexpansion, 824 conveniently downcased and reformatted: 825 826 @tutorialsource{DEFINE-CURL-OPTIONS macroexpansion} 827 @lisp 828 (progn 829 (defcenum curl-option 830 (:noprogress 43) 831 (:nosignal 99) 832 (:errorbuffer 10010) 833 (:url 10002)) 834 'curl-option) 835 @end lisp 836 837 @noindent 838 That seems more than reasonable. You may notice that we only use the 839 @var{type} to compute the real enumeration offset; we will also need 840 the type information later. 841 842 First, however, let's make sure a simple call to the foreign function 843 works: 844 845 @example 846 @sc{cffi-user>} (foreign-funcall "curl_easy_setopt" 847 :pointer *easy-handle* 848 curl-option :nosignal :long 1 curl-code) 849 @result{} 0 850 @end example 851 852 @code{foreign-funcall}, despite its surface simplicity, can be used to 853 call any C function. Its first argument is a string, naming the 854 function to be called. Next, for each argument, we pass the name of 855 the C type, which is the same as in @code{defcfun}, followed by a Lisp 856 object representing the data to be passed as the argument. The final 857 argument is the return type, for which we use the @code{curl-code} 858 type defined earlier. 859 860 @code{defcfun} just puts a convenient fa@,cade on 861 @code{foreign-funcall}.@footnote{This isn't entirely true; some Lisps 862 don't support @code{foreign-funcall}, so @code{defcfun} is implemented 863 without it. @code{defcfun} may also perform optimizations that 864 @code{foreign-funcall} cannot.} Our earlier call to 865 @code{curl-global-init} could have been written as follows: 866 867 @example 868 @sc{cffi-user>} (foreign-funcall "curl_global_init" :long 0 869 curl-code) 870 @result{} 0 871 @end example 872 873 Before we continue, we will take a look at what @cffi{} can and can't 874 do, and why this is so. 875 876 877 @node Tutorial-Abstraction, Tutorial-Lisp easy_setopt, Tutorial-easy_setopt, Tutorial 878 @section Breaking the abstraction 879 880 @cindex breaking the abstraction 881 @cindex abstraction breaking 882 In @ref{Tutorial-Comparison,, What makes Lisp different}, we mentioned 883 that writing an @acronym{FFI} sometimes requires depending on 884 information not provided as part of the interface. The easy option 885 @code{CURLOPT_WRITEDATA}, which we will not provide as part of the 886 Lisp interface, illustrates this issue. 887 888 Strictly speaking, the @code{curl-option} enumeration is not 889 necessary; we could have used @code{:int 99} instead of 890 @code{curl-option :nosignal} in our call to @code{curl_easy_setopt} 891 above. We defined it anyway, in part to hide the fact that we are 892 breaking the abstraction that the C @code{enum} provides. If the 893 c@acronym{URL} developers decide to change those numbers later, we 894 must change the Lisp enumeration, because enumeration values are not 895 provided in the compiled C library, @code{libcurl.so.3}. 896 897 @cffi{} works because the most useful things in C libraries --- 898 non-static functions and non-static variables --- are included 899 accessibly in @code{libcurl.so.3}. A C compiler that violated this 900 would be considered a worthless compiler. 901 902 The other thing @code{define-curl-options} does is give the ``type'' 903 of the third argument passed to @code{curl_easy_setopt}. Using this 904 information, we can tell that the @code{:nosignal} option should 905 accept a long integer argument. We can implicitly assume @code{t} 906 @equiv{} 1 and @code{nil} @equiv{} 0, as it is in C, which takes care 907 of the fact that @code{CURLOPT_NOSIGNAL} is really asking for a 908 boolean. 909 910 The ``type'' of @code{CURLOPT_WRITEDATA} is @code{objectpoint}. 911 However, it is really looking for a @code{FILE*}. 912 @code{CURLOPT_ERRORBUFFER} is looking for a @code{char*}, so there is 913 no obvious @cffi{} type but @code{:pointer}. 914 915 The first thing to note is that nowhere in the C interface includes 916 this information; it can only be found in the manual. We could 917 disjoin these clearly different types ourselves, by splitting 918 @code{objectpoint} into @code{filepoint} and @code{charpoint}, but we 919 are still breaking the abstraction, because we have to augment the 920 entire enumeration form with this additional 921 information.@footnote{Another possibility is to allow the caller to 922 specify the desired C type of the third argument. This is essentially 923 what happens in a call to the function written in C.} 924 925 @cindex streams and C 926 @cindex @sc{file}* and streams 927 The second is that the @code{CURLOPT_WRITEDATA} argument is completely 928 incompatible with the desired Lisp data, a 929 stream.@footnote{@xref{Other Kinds of Streams,,, libc, GNU C Library 930 Reference}, for a @acronym{GNU}-only way to extend the @code{FILE*} 931 type. You could use this to convert Lisp streams to the needed C 932 data. This would be quite involved and far outside the scope of this 933 tutorial.} It is probably acceptable if we are controlling every file 934 we might want to use as this argument, in which case we can just call 935 the foreign function @code{fopen}. Regardless, though, we can't write 936 to arbitrary streams, which is exactly what we want to do for this 937 application. 938 939 Finally, note that the @code{curl_easy_setopt} interface itself is a 940 hack, intended to work around some of the drawbacks of C. The 941 definition of @code{Curl_setopt}, while long, is far less cluttered 942 than the equivalent disjoint-function set would be; in addition, 943 setting a new option in an old @code{libcurl} can generate a run-time 944 error rather than breaking the compile. Lisp can just as concisely 945 generate functions as compare values, and the ``undefined function'' 946 error is just as useful as any explicit error we could define here 947 might be. 948 949 950 @node Tutorial-Lisp easy_setopt, Tutorial-Memory, Tutorial-Abstraction, Tutorial 951 @section Option functions in Lisp 952 953 We could use @code{foreign-funcall} directly every time we wanted to 954 call @code{curl_easy_setopt}. However, we can encapsulate some of the 955 necessary information with the following. 956 957 @lisp 958 ;;; @lispcmt{We will use this type later in a more creative way. For} 959 ;;; @lispcmt{now, just consider it a marker that this isn't just any} 960 ;;; @lispcmt{pointer.} 961 (defctype easy-handle :pointer) 962 963 (defmacro curl-easy-setopt (easy-handle enumerated-name 964 value-type new-value) 965 "Call `curl_easy_setopt' on EASY-HANDLE, using ENUMERATED-NAME 966 as the OPTION. VALUE-TYPE is the CFFI foreign type of the third 967 argument, and NEW-VALUE is the Lisp data to be translated to the 968 third argument. VALUE-TYPE is not evaluated." 969 `(foreign-funcall "curl_easy_setopt" easy-handle ,easy-handle 970 curl-option ,enumerated-name 971 ,value-type ,new-value curl-code)) 972 @end lisp 973 974 Now we define a function for each kind of argument that encodes the 975 correct @code{value-type} in the above. This can be done reasonably 976 in the @code{define-curl-options} macroexpansion; after all, that is 977 where the different options are listed! 978 979 @cindex Lispy C functions 980 We could make @code{cl:defun} forms in the expansion that simply call 981 @code{curl-easy-setopt}; however, it is probably easier and clearer to 982 use @code{defcfun}. @code{define-curl-options} was becoming unwieldy, 983 so I defined some helpers in this new definition. 984 985 @smalllisp 986 (defun curry-curl-option-setter (function-name option-keyword) 987 "Wrap the function named by FUNCTION-NAME with a version that 988 curries the second argument as OPTION-KEYWORD. 989 990 This function is intended for use in DEFINE-CURL-OPTION-SETTER." 991 (setf (symbol-function function-name) 992 (let ((c-function (symbol-function function-name))) 993 (lambda (easy-handle new-value) 994 (funcall c-function easy-handle option-keyword 995 new-value))))) 996 997 (defmacro define-curl-option-setter (name option-type 998 option-value foreign-type) 999 "Define (with DEFCFUN) a function NAME that calls 1000 curl_easy_setopt. OPTION-TYPE and OPTION-VALUE are the CFFI 1001 foreign type and value to be passed as the second argument to 1002 easy_setopt, and FOREIGN-TYPE is the CFFI foreign type to be used 1003 for the resultant function's third argument. 1004 1005 This macro is intended for use in DEFINE-CURL-OPTIONS." 1006 `(progn 1007 (defcfun ("curl_easy_setopt" ,name) curl-code 1008 (easy-handle easy-handle) 1009 (option ,option-type) 1010 (new-value ,foreign-type)) 1011 (curry-curl-option-setter ',name ',option-value))) 1012 1013 (defmacro define-curl-options (type-name type-offsets &rest enum-args) 1014 "As with CFFI:DEFCENUM, except each of ENUM-ARGS is as follows: 1015 1016 (NAME TYPE NUMBER) 1017 1018 Where the arguments are as they are with the CINIT macro defined 1019 in curl.h, except NAME is a keyword. 1020 1021 TYPE-OFFSETS is a plist of TYPEs to their integer offsets, as 1022 defined by the CURLOPTTYPE_LONG et al constants in curl.h. 1023 1024 Also, define functions for each option named 1025 set-`TYPE-NAME'-`OPTION-NAME', where OPTION-NAME is the NAME from 1026 the above destructuring." 1027 (flet ((enumerated-value (type offset) 1028 (+ (getf type-offsets type) offset)) 1029 ;; @lispcmt{map PROCEDURE, destructuring each of ENUM-ARGS} 1030 (map-enum-args (procedure) 1031 (mapcar (lambda (arg) (apply procedure arg)) enum-args)) 1032 ;; @lispcmt{build a name like SET-CURL-OPTION-NOSIGNAL} 1033 (make-setter-name (option-name) 1034 (intern (concatenate 1035 'string "SET-" (symbol-name type-name) 1036 "-" (symbol-name option-name))))) 1037 `(progn 1038 (defcenum ,type-name 1039 ,@@(map-enum-args 1040 (lambda (name type number) 1041 (list name (enumerated-value type number))))) 1042 ,@@(map-enum-args 1043 (lambda (name type number) 1044 (declare (ignore number)) 1045 `(define-curl-option-setter ,(make-setter-name name) 1046 ,type-name ,name ,(ecase type 1047 (long :long) 1048 (objectpoint :pointer) 1049 (functionpoint :pointer) 1050 (off-t :long))))) 1051 ',type-name))) 1052 @end smalllisp 1053 1054 @noindent 1055 Macroexpanding our @code{define-curl-options} form once more, we 1056 see something different: 1057 1058 @lisp 1059 (progn 1060 (defcenum curl-option 1061 (:noprogress 43) 1062 (:nosignal 99) 1063 (:errorbuffer 10010) 1064 (:url 10002)) 1065 (define-curl-option-setter set-curl-option-noprogress 1066 curl-option :noprogress :long) 1067 (define-curl-option-setter set-curl-option-nosignal 1068 curl-option :nosignal :long) 1069 (define-curl-option-setter set-curl-option-errorbuffer 1070 curl-option :errorbuffer :pointer) 1071 (define-curl-option-setter set-curl-option-url 1072 curl-option :url :pointer) 1073 'curl-option) 1074 @end lisp 1075 1076 @noindent 1077 Macroexpanding one of the new @code{define-curl-option-setter} 1078 forms yields the following: 1079 1080 @lisp 1081 (progn 1082 (defcfun ("curl_easy_setopt" set-curl-option-nosignal) curl-code 1083 (easy-handle easy-handle) 1084 (option curl-option) 1085 (new-value :long)) 1086 (curry-curl-option-setter 'set-curl-option-nosignal ':nosignal)) 1087 @end lisp 1088 1089 @noindent 1090 Finally, let's try this out: 1091 1092 @example 1093 @sc{cffi-user>} (set-curl-option-nosignal *easy-handle* 1) 1094 @result{} 0 1095 @end example 1096 1097 @noindent 1098 Looks like it works just as well. This interface is now reasonably 1099 high-level to wash out some of the ugliness of the thinnest possible 1100 @code{curl_easy_setopt} @acronym{FFI}, without obscuring the remaining 1101 C bookkeeping details we will explore. 1102 1103 1104 @node Tutorial-Memory, Tutorial-Callbacks, Tutorial-Lisp easy_setopt, Tutorial 1105 @section Memory management 1106 1107 According to the documentation for @code{curl_easy_setopt}, the type 1108 of the third argument when @var{option} is @code{CURLOPT_ERRORBUFFER} 1109 is @code{char*}. Above, we've defined 1110 @code{set-curl-option-errorbuffer} to accept a @code{:pointer} as the 1111 new option value. However, there is a @cffi{} type @code{:string}, 1112 which translates Lisp strings to C strings when passed as arguments to 1113 foreign function calls. Why not, then, use @code{:string} as the 1114 @cffi{} type of the third argument? There are two reasons, both 1115 related to the necessity of breaking abstraction described in 1116 @ref{Tutorial-Abstraction,, Breaking the abstraction}. 1117 1118 The first reason also applies to @code{CURLOPT_URL}, which we will use 1119 to illustrate the point. Assuming we have changed the type of the 1120 third argument underlying @code{set-curl-option-url} to 1121 @code{:string}, look at these two equivalent forms. 1122 1123 @lisp 1124 (set-curl-option-url *easy-handle* "http://www.cliki.net/CFFI") 1125 1126 @equiv{} (with-foreign-string (url "http://www.cliki.net/CFFI") 1127 (foreign-funcall "curl_easy_setopt" easy-handle *easy-handle* 1128 curl-option :url :pointer url curl-code)) 1129 @end lisp 1130 1131 @noindent 1132 The latter, in fact, is mostly equivalent to what a foreign function 1133 call's macroexpansion actually does. As you can see, the Lisp string 1134 @code{"@clikicffi{}"} is copied into a @code{char} array and 1135 null-terminated; the pointer to beginning of this array, now a C 1136 string, is passed as a @cffi{} @code{:pointer} to the foreign 1137 function. 1138 1139 @cindex dynamic extent 1140 @cindex foreign values with dynamic extent 1141 Unfortunately, the C abstraction has failed us, and we must break it. 1142 While @code{:string} works well for many @code{char*} arguments, it 1143 does not for cases like this. As the @code{curl_easy_setopt} 1144 documentation explains, ``The string must remain present until curl no 1145 longer needs it, as it doesn't copy the string.'' The C string 1146 created by @code{with-foreign-string}, however, only has dynamic 1147 extent: it is ``deallocated'' when the body (above containing the 1148 @code{foreign-funcall} form) exits. 1149 1150 @cindex premature deallocation 1151 If we are supposed to keep the C string around, but it goes away, what 1152 happens when some @code{libcurl} function tries to access the 1153 @acronym{URL} string? We have reentered the dreaded world of C 1154 ``undefined behavior''. In some Lisps, it will probably get a chunk 1155 of the Lisp/C stack. You may segfault. You may get some random piece 1156 of other data from the heap. Maybe, in a world where ``dynamic 1157 extent'' is defined to be ``infinite extent'', everything will turn 1158 out fine. Regardless, results are likely to be almost universally 1159 unpleasant.@footnote{``@i{But I thought Lisp was supposed to protect 1160 me from all that buggy C crap!}'' Before asking a question like that, 1161 remember that you are a stranger in a foreign land, whose residents 1162 have a completely different set of values.} 1163 1164 Returning to the current @code{set-curl-option-url} interface, here is 1165 what we must do: 1166 1167 @lisp 1168 (let (easy-handle) 1169 (unwind-protect 1170 (with-foreign-string (url "http://www.cliki.net/CFFI") 1171 (setf easy-handle (curl-easy-init)) 1172 (set-curl-option-url easy-handle url) 1173 #|@lispcmt{do more with the easy-handle, like actually get the URL}|#) 1174 (when easy-handle 1175 (curl-easy-cleanup easy-handle)))) 1176 @end lisp 1177 1178 @c old comment to luis: I go on to say that this isn't obviously 1179 @c extensible to new option settings that require C strings to stick 1180 @c around, as it would involve re-evaluating the unwind-protect form 1181 @c with more dynamic memory allocation. So I plan to show how to 1182 @c write something similar to ObjC's NSAutoreleasePool, to be managed 1183 @c with a simple unwind-protect form. 1184 1185 @noindent 1186 That is fine for the single string defined here, but for every string 1187 option we want to pass, we have to surround the body of 1188 @code{with-foreign-string} with another @code{with-foreign-string} 1189 wrapper, or else do some extremely error-prone pointer manipulation 1190 and size calculation in advance. We could alleviate some of the pain 1191 with a recursively expanding macro, but this would not remove the need 1192 to modify the block every time we want to add an option, anathema as 1193 it is to a modular interface. 1194 1195 Before modifying the code to account for this case, consider the other 1196 reason we can't simply use @code{:string} as the foreign type. In C, 1197 a @code{char *} is a @code{char *}, not necessarily a string. The 1198 option @code{CURLOPT_ERRORBUFFER} accepts a @code{char *}, but does 1199 not expect anything about the data there. However, it does expect 1200 that some @code{libcurl} function we call later can write a C string 1201 of up to 255 characters there. We, the callers of the function, are 1202 expected to read the C string at a later time, exactly the opposite of 1203 what @code{:string} implies. 1204 1205 With the semantics for an input string in mind --- namely, that the 1206 string should be kept around until we @code{curl_easy_cleanup} the 1207 easy handle --- we are ready to extend the Lisp interface: 1208 1209 @lisp 1210 (defvar *easy-handle-cstrings* (make-hash-table) 1211 "Hashtable of easy handles to lists of C strings that may be 1212 safely freed after the handle is freed.") 1213 1214 (defun make-easy-handle () 1215 "Answer a new CURL easy interface handle, to which the lifetime 1216 of C strings may be tied. See `add-curl-handle-cstring'." 1217 (let ((easy-handle (curl-easy-init))) 1218 (setf (gethash easy-handle *easy-handle-cstrings*) '()) 1219 easy-handle)) 1220 1221 (defun free-easy-handle (handle) 1222 "Free CURL easy interface HANDLE and any C strings created to 1223 be its options." 1224 (curl-easy-cleanup handle) 1225 (mapc #'foreign-string-free 1226 (gethash handle *easy-handle-cstrings*)) 1227 (remhash handle *easy-handle-cstrings*)) 1228 1229 (defun add-curl-handle-cstring (handle cstring) 1230 "Add CSTRING to be freed when HANDLE is, answering CSTRING." 1231 (car (push cstring (gethash handle *easy-handle-cstrings*)))) 1232 @end lisp 1233 1234 @noindent 1235 Here we have redefined the interface to create and free handles, to 1236 associate a list of allocated C strings with each handle while it 1237 exists. The strategy of using different function names to wrap around 1238 simple foreign functions is more common than the solution implemented 1239 earlier with @code{curry-curl-option-setter}, which was to modify the 1240 function name's function slot.@footnote{There are advantages and 1241 disadvantages to each approach; I chose to @code{(setf 1242 symbol-function)} earlier because it entailed generating fewer magic 1243 function names.} 1244 1245 Incidentally, the next step is to redefine 1246 @code{curry-curl-option-setter} to allocate C strings for the 1247 appropriate length of time, given a Lisp string as the 1248 @code{new-value} argument: 1249 1250 @lisp 1251 (defun curry-curl-option-setter (function-name option-keyword) 1252 "Wrap the function named by FUNCTION-NAME with a version that 1253 curries the second argument as OPTION-KEYWORD. 1254 1255 This function is intended for use in DEFINE-CURL-OPTION-SETTER." 1256 (setf (symbol-function function-name) 1257 (let ((c-function (symbol-function function-name))) 1258 (lambda (easy-handle new-value) 1259 (funcall c-function easy-handle option-keyword 1260 (if (stringp new-value) 1261 (add-curl-handle-cstring 1262 easy-handle 1263 (foreign-string-alloc new-value)) 1264 new-value)))))) 1265 @end lisp 1266 1267 @noindent 1268 A quick analysis of the code shows that you need only reevaluate the 1269 @code{curl-option} enumeration definition to take advantage of these 1270 new semantics. Now, for good measure, let's reallocate the handle 1271 with the new functions we just defined, and set its @acronym{URL}: 1272 1273 @example 1274 @sc{cffi-user>} (curl-easy-cleanup *easy-handle*) 1275 @result{} NIL 1276 @sc{cffi-user>} (setf *easy-handle* (make-easy-handle)) 1277 @result{} #<FOREIGN-ADDRESS #x09844EE0> 1278 @sc{cffi-user>} (set-curl-option-nosignal *easy-handle* 1) 1279 @result{} 0 1280 @sc{cffi-user>} (set-curl-option-url *easy-handle* 1281 "http://www.cliki.net/CFFI") 1282 @result{} 0 1283 @end example 1284 1285 @cindex strings 1286 For fun, let's inspect the Lisp value of the C string that was created 1287 to hold @code{"@clikicffi{}"}. By virtue of the implementation of 1288 @code{add-curl-handle-cstring}, it should be accessible through the 1289 hash table defined: 1290 1291 @example 1292 @sc{cffi-user>} (foreign-string-to-lisp 1293 (car (gethash *easy-handle* *easy-handle-cstrings*))) 1294 @result{} "http://www.cliki.net/CFFI" 1295 @end example 1296 1297 @noindent 1298 Looks like that worked, and @code{libcurl} now knows what 1299 @acronym{URL} we want to retrieve. 1300 1301 Finally, we turn back to the @code{:errorbuffer} option mentioned at 1302 the beginning of this section. Whereas the abstraction added to 1303 support string inputs works fine for cases like @code{CURLOPT_URL}, it 1304 hides the detail of keeping the C string; for @code{:errorbuffer}, 1305 however, we need that C string. 1306 1307 In a moment, we'll define something slightly cleaner, but for now, 1308 remember that you can always hack around anything. We're modifying 1309 handle creation, so make sure you free the old handle before 1310 redefining @code{free-easy-handle}. 1311 1312 @smalllisp 1313 (defvar *easy-handle-errorbuffers* (make-hash-table) 1314 "Hashtable of easy handles to C strings serving as error 1315 writeback buffers.") 1316 1317 ;;; @lispcmt{An extra byte is very little to pay for peace of mind.} 1318 (defparameter *curl-error-size* 257 1319 "Minimum char[] size used by cURL to report errors.") 1320 1321 (defun make-easy-handle () 1322 "Answer a new CURL easy interface handle, to which the lifetime 1323 of C strings may be tied. See `add-curl-handle-cstring'." 1324 (let ((easy-handle (curl-easy-init))) 1325 (setf (gethash easy-handle *easy-handle-cstrings*) '()) 1326 (setf (gethash easy-handle *easy-handle-errorbuffers*) 1327 (foreign-alloc :char :count *curl-error-size* 1328 :initial-element 0)) 1329 easy-handle)) 1330 1331 (defun free-easy-handle (handle) 1332 "Free CURL easy interface HANDLE and any C strings created to 1333 be its options." 1334 (curl-easy-cleanup handle) 1335 (foreign-free (gethash handle *easy-handle-errorbuffers*)) 1336 (remhash handle *easy-handle-errorbuffers*) 1337 (mapc #'foreign-string-free 1338 (gethash handle *easy-handle-cstrings*)) 1339 (remhash handle *easy-handle-cstrings*)) 1340 1341 (defun get-easy-handle-error (handle) 1342 "Answer a string containing HANDLE's current error message." 1343 (foreign-string-to-lisp 1344 (gethash handle *easy-handle-errorbuffers*))) 1345 @end smalllisp 1346 1347 Be sure to once again set the options we've set thus far. You may 1348 wish to define yet another wrapper function to do this. 1349 1350 1351 @node Tutorial-Callbacks, Tutorial-Completion, Tutorial-Memory, Tutorial 1352 @section Calling Lisp from C 1353 1354 If you have been reading 1355 @uref{http://curl.haxx.se/libcurl/c/curl_easy_setopt.html,, 1356 @code{curl_easy_setopt(3)}}, you should have noticed that some options 1357 accept a function pointer. In particular, we need one function 1358 pointer to set as @code{CURLOPT_WRITEFUNCTION}, to be called by 1359 @code{libcurl} rather than the reverse, in order to receive data as it 1360 is downloaded. 1361 1362 A binding writer without the aid of @acronym{FFI} usually approaches 1363 this problem by writing a C function that accepts C data, converts to 1364 the language's internal objects, and calls the callback provided by 1365 the user, again in a reverse of usual practices. 1366 1367 The @cffi{} approach to callbacks precisely mirrors its differences 1368 with the non-@acronym{FFI} approach on the ``calling C from Lisp'' 1369 side, which we have dealt with exclusively up to now. That is, you 1370 define a callback function in Lisp using @code{defcallback}, and 1371 @cffi{} effectively creates a C function to be passed as a function 1372 pointer. 1373 1374 @impnote{This is much trickier than calling C functions from Lisp, as 1375 it literally involves somehow generating a new C function that is as 1376 good as any created by the compiler. Therefore, not all Lisps support 1377 them. @xref{Implementation Support}, for information about @cffi{} 1378 support issues in this and other areas. You may want to consider 1379 changing to a Lisp that supports callbacks in order to continue with 1380 this tutorial.} 1381 1382 @cindex callback definition 1383 @cindex defining callbacks 1384 Defining a callback is very similar to defining a callout; the main 1385 difference is that we must provide some Lisp forms to be evaluated as 1386 part of the callback. Here is the signature for the function the 1387 @code{:writefunction} option takes: 1388 1389 @example 1390 size_t 1391 @var{function}(void *ptr, size_t size, size_t nmemb, void *stream); 1392 @end example 1393 1394 @impnote{size_t is almost always an unsigned int. You can get this 1395 and many other types using feature tests for your system by using 1396 cffi-grovel.} 1397 1398 The above signature trivially translates into a @cffi{} 1399 @code{defcallback} form, as follows. 1400 1401 @lisp 1402 ;;; @lispcmt{Alias in case size_t changes.} 1403 (defctype size :unsigned-int) 1404 1405 ;;; @lispcmt{To be set as the CURLOPT_WRITEFUNCTION of every easy handle.} 1406 (defcallback easy-write size ((ptr :pointer) (size size) 1407 (nmemb size) (stream :pointer)) 1408 (let ((data-size (* size nmemb))) 1409 (handler-case 1410 ;; @lispcmt{We use the dynamically-bound *easy-write-procedure* to} 1411 ;; @lispcmt{call a closure with useful lexical context.} 1412 (progn (funcall (symbol-value '*easy-write-procedure*) 1413 (foreign-string-to-lisp ptr :count data-size)) 1414 data-size) ;@lispcmt{indicates success} 1415 ;; @lispcmt{The WRITEFUNCTION should return something other than the} 1416 ;; @lispcmt{#bytes available to signal an error.} 1417 (error () (if (zerop data-size) 1 0))))) 1418 @end lisp 1419 1420 First, note the correlation of the first few forms, used to declare 1421 the C function's signature, with the signature in C syntax. We 1422 provide a Lisp name for the function, its return type, and a name and 1423 type for each argument. 1424 1425 In the body, we call the dynamically-bound 1426 @code{*easy-write-procedure*} with a ``finished'' translation, of 1427 pulling together the raw data and size into a Lisp string, rather than 1428 deal with the data directly. As part of calling 1429 @code{curl_easy_perform} later, we'll bind that variable to a closure 1430 with more useful lexical bindings than the top-level 1431 @code{defcallback} form. 1432 1433 Finally, we make a halfhearted effort to prevent non-local exits from 1434 unwinding the C stack, covering the most likely case with an 1435 @code{error} handler, which is usually triggered 1436 unexpectedly.@footnote{Unfortunately, we can't protect against 1437 @emph{all} non-local exits, such as @code{return}s and @code{throw}s, 1438 because @code{unwind-protect} cannot be used to ``short-circuit'' a 1439 non-local exit in Common Lisp, due to proposal @code{minimal} in 1440 @uref{http://www.lisp.org/HyperSpec/Issues/iss152-writeup.html, 1441 @acronym{ANSI} issue @sc{Exit-Extent}}. Furthermore, binding an 1442 @code{error} handler prevents higher-up code from invoking restarts 1443 that may be provided under the callback's dynamic context. Such is 1444 the way of compromise.} The reason is that most C code is written to 1445 understand its own idiosyncratic error condition, implemented above in 1446 the case of @code{curl_easy_perform}, and more ``undefined behavior'' 1447 can result if we just wipe C stack frames without allowing them to 1448 execute whatever cleanup actions as they like. 1449 1450 Using the @code{CURLoption} enumeration in @file{curl.h} once more, we 1451 can describe the new option by modifying and reevaluating 1452 @code{define-curl-options}. 1453 1454 @lisp 1455 (define-curl-options curl-option 1456 (long 0 objectpoint 10000 functionpoint 20000 off-t 30000) 1457 (:noprogress long 43) 1458 (:nosignal long 99) 1459 (:errorbuffer objectpoint 10) 1460 (:url objectpoint 2) 1461 (:writefunction functionpoint 11)) ;@lispcmt{new item here} 1462 @end lisp 1463 1464 Finally, we can use the defined callback and the new 1465 @code{set-curl-option-writefunction} to finish configuring the easy 1466 handle, using the @code{callback} macro to retrieve a @cffi{} 1467 @code{:pointer}, which works like a function pointer in C code. 1468 1469 @example 1470 @sc{cffi-user>} (set-curl-option-writefunction 1471 *easy-handle* (callback easy-write)) 1472 @result{} 0 1473 @end example 1474 1475 1476 @node Tutorial-Completion, Tutorial-Types, Tutorial-Callbacks, Tutorial 1477 @section A complete @acronym{FFI}? 1478 1479 @c TeX goes insane on @uref{@clikicffi{}} 1480 1481 With all options finally set and a medium-level interface developed, 1482 we can finish the definition and retrieve 1483 @uref{http://www.cliki.net/CFFI}, as is done in the tutorial. 1484 1485 @lisp 1486 (defcfun "curl_easy_perform" curl-code 1487 (handle easy-handle)) 1488 @end lisp 1489 1490 @example 1491 @sc{cffi-user>} (with-output-to-string (contents) 1492 (let ((*easy-write-procedure* 1493 (lambda (string) 1494 (write-string string contents)))) 1495 (declare (special *easy-write-procedure*)) 1496 (curl-easy-perform *easy-handle*))) 1497 @result{} "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" 1498 @enddots{} 1499 Now fear, comprehensively</P> 1500 " 1501 @end example 1502 1503 Of course, that itself is slightly unwieldy, so you may want to define 1504 a function around it that simply retrieves a @acronym{URL}. I will 1505 leave synthesis of all the relevant @acronym{REPL} forms presented 1506 thus far into a single function as an exercise for the reader. 1507 1508 The remaining sections of this tutorial explore some advanced features 1509 of @cffi{}; the definition of new types will receive special 1510 attention. Some of these features are essential for particular 1511 foreign function calls; some are very helpful when trying to develop a 1512 Lispy interface to C. 1513 1514 1515 @node Tutorial-Types, Tutorial-Conclusion, Tutorial-Completion, Tutorial 1516 @section Defining new types 1517 1518 We've occasionally used the @code{defctype} macro in previous sections 1519 as a kind of documentation, much what you'd use @code{typedef} for in 1520 C. We also tried one special kind of type definition, the 1521 @code{defcenum} type. @xref{defcstruct}, for a definition macro that 1522 may come in handy if you need to use C @code{struct}s as data. 1523 1524 @cindex type definition 1525 @cindex data in Lisp and C 1526 @cindex translating types 1527 However, all of these are mostly sugar for the powerful underlying 1528 foreign type interface called @dfn{type translators}. You can easily 1529 define new translators for any simple named foreign type. Since we've 1530 defined the new type @code{curl-code} to use as the return type for 1531 various @code{libcurl} functions, we can use that to directly convert 1532 c@acronym{URL} errors to Lisp errors. 1533 1534 @code{defctype}'s purpose is to define simple @code{typedef}-like 1535 aliases. In order to use @dfn{type translators} we must use the 1536 @code{define-foreign-type} macro. So let's redefine @code{curl-code} 1537 using it. 1538 1539 @lisp 1540 (define-foreign-type curl-code-type () 1541 () 1542 (:actual-type :int) 1543 (:simple-parser curl-code)) 1544 @end lisp 1545 1546 @code{define-foreign-type} is a thin wrapper around @code{defclass}. 1547 For now, all you need to know in the context of this example is that 1548 it does what @code{(defctype curl-code :int)} would do and, 1549 additionally, defines a new class @code{curl-code-type} which we will 1550 take advantage of shortly. 1551 1552 The @code{CURLcode} enumeration seems to follow the typical error code 1553 convention of @samp{0} meaning all is well, and each non-zero integer 1554 indicating a different kind of error. We can apply that trivially to 1555 differentiate between normal exits and error exits. 1556 1557 @lisp 1558 (define-condition curl-code-error (error) 1559 (($code :initarg :curl-code :reader curl-error-code)) 1560 (:report (lambda (c stream) 1561 (format stream "libcurl function returned error ~A" 1562 (curl-error-code c)))) 1563 (:documentation "Signalled when a libcurl function answers 1564 a code other than CURLE_OK.")) 1565 1566 (defmethod translate-from-foreign (value (type curl-code-type)) 1567 "Raise a CURL-CODE-ERROR if VALUE, a curl-code, is non-zero." 1568 (if (zerop value) 1569 :curle-ok 1570 (error 'curl-code-error :curl-code value))) 1571 @end lisp 1572 1573 @noindent 1574 The heart of this translator is new method 1575 @code{translate-from-foreign}. By specializing the @var{type} 1576 parameter on @code{curl-code-type}, we immediately modify the behavior 1577 of every function that returns a @code{curl-code} to pass the result 1578 through this new method. 1579 1580 To see the translator in action, try invoking a function that returns 1581 a @code{curl-code}. You need to reevaluate the respective 1582 @code{defcfun} form so that it picks up the new @code{curl-code} 1583 definition. 1584 1585 @example 1586 @sc{cffi-user>} (set-curl-option-nosignal *easy-handle* 1) 1587 @result{} :CURLE-OK 1588 @end example 1589 1590 @noindent 1591 As the result was @samp{0}, the new method returned @code{:curle-ok}, 1592 just as specified.@footnote{It might be better to return 1593 @code{(values)} than @code{:curle-ok} in real code, but this is good 1594 for illustration.} I will leave disjoining the separate 1595 @code{CURLcode}s into condition types and improving the @code{:report} 1596 function as an exercise for you. 1597 1598 The creation of @code{*easy-handle-cstrings*} and 1599 @code{*easy-handle-errorbuffers*} as properties of @code{easy-handle}s 1600 is a kluge. What we really want is a Lisp structure that stores these 1601 properties along with the C pointer. Unfortunately, 1602 @code{easy-handle} is currently just a fancy name for the foreign type 1603 @code{:pointer}; the actual pointer object varies from Common Lisp 1604 implementation to implementation, needing only to satisfy 1605 @code{pointerp} and be returned from @code{make-pointer} and friends. 1606 1607 One solution that would allow us to define a new Lisp structure to 1608 represent @code{easy-handle}s would be to write a wrapper around every 1609 function that currently takes an @code{easy-handle}; the wrapper would 1610 extract the pointer and pass it to the foreign function. However, we 1611 can use type translators to more elegantly integrate this 1612 ``translation'' into the foreign function calling framework, using 1613 @code{translate-to-foreign}. 1614 1615 @smalllisp 1616 (defclass easy-handle () 1617 ((pointer :initform (curl-easy-init) 1618 :documentation "Foreign pointer from curl_easy_init") 1619 (error-buffer 1620 :initform (foreign-alloc :char :count *curl-error-size* 1621 :initial-element 0) 1622 :documentation "C string describing last error") 1623 (c-strings :initform '() 1624 :documentation "C strings set as options")) 1625 (:documentation "I am a parameterization you may pass to 1626 curl-easy-perform to perform a cURL network protocol request.")) 1627 1628 (defmethod initialize-instance :after ((self easy-handle) &key) 1629 (set-curl-option-errorbuffer self (slot-value self 'error-buffer))) 1630 1631 (defun add-curl-handle-cstring (handle cstring) 1632 "Add CSTRING to be freed when HANDLE is, answering CSTRING." 1633 (car (push cstring (slot-value handle 'c-strings)))) 1634 1635 (defun get-easy-handle-error (handle) 1636 "Answer a string containing HANDLE's current error message." 1637 (foreign-string-to-lisp 1638 (slot-value handle 'error-buffer))) 1639 1640 (defun free-easy-handle (handle) 1641 "Free CURL easy interface HANDLE and any C strings created to 1642 be its options." 1643 (with-slots (pointer error-buffer c-strings) handle 1644 (curl-easy-cleanup pointer) 1645 (foreign-free error-buffer) 1646 (mapc #'foreign-string-free c-strings))) 1647 1648 (define-foreign-type easy-handle-type () 1649 () 1650 (:actual-type :pointer) 1651 (:simple-parser easy-handle)) 1652 1653 (defmethod translate-to-foreign (handle (type easy-handle-type)) 1654 "Extract the pointer from an easy-HANDLE." 1655 (slot-value handle 'pointer)) 1656 @end smalllisp 1657 1658 While we changed some of the Lisp functions defined earlier to use 1659 @acronym{CLOS} slots rather than hash tables, the foreign functions 1660 work just as well as they did before. 1661 1662 @cindex limitations of type translators 1663 The greatest strength, and the greatest limitation, of the type 1664 translator comes from its generalized interface. As stated 1665 previously, we could define all foreign function calls in terms of the 1666 primitive foreign types provided by @cffi{}. The type translator 1667 interface allows us to cleanly specify the relationship between Lisp 1668 and C data, independent of where it appears in a function call. This 1669 independence comes at a price; for example, it cannot be used to 1670 modify translation semantics based on other arguments to a function 1671 call. In these cases, you should rely on other features of Lisp, 1672 rather than the powerful, yet domain-specific, type translator 1673 interface. 1674 1675 1676 @node Tutorial-Conclusion, , Tutorial-Types, Tutorial 1677 @section What's next? 1678 1679 @cffi{} provides a rich and powerful foundation for communicating with 1680 foreign libraries; as we have seen, it is up to you to make that 1681 experience a pleasantly Lispy one. This tutorial does not cover all 1682 the features of @cffi{}; please see the rest of the manual for 1683 details. In particular, if something seems obviously missing, it is 1684 likely that either code or a good reason for lack of code is already 1685 present. 1686 1687 @impnote{There are some other things in @cffi{} that might deserve 1688 tutorial sections, such as free-translated-object, or structs. Let us 1689 know which ones you care about.} 1690 1691 1692 @c =================================================================== 1693 @c CHAPTER: Wrapper generators 1694 1695 @node Wrapper generators, Foreign Types, Tutorial, Top 1696 @chapter Wrapper generators 1697 1698 @cffi{}'s interface is designed for human programmers, being aimed at 1699 aesthetic as well as technical sophistication. However, there are a 1700 few programs aimed at translating C and C++ header files, or 1701 approximations thereof, into @cffi{} forms constituting a foreign 1702 interface to the symbols in those files. 1703 1704 These wrapper generators are known to support output of @cffi{} forms. 1705 1706 @table @asis 1707 @item @uref{http://www.cliki.net/Verrazano,Verrazano} 1708 Designed specifically for Common Lisp. Uses @acronym{GCC}'s parser 1709 output in @acronym{XML} format to discover functions, variables, and 1710 other header file data. This means you need @acronym{GCC} to generate 1711 forms; on the other hand, the parser employed is mostly compliant with 1712 @acronym{ANSI} C. 1713 1714 @item @uref{http://www.cliki.net/SWIG,SWIG} 1715 A foreign interface generator originally designed to generate Python 1716 bindings, it has been ported to many other systems, including @cffi{} 1717 in version 1.3.28. Includes its own C declaration munger, not 1718 intended to be fully-compliant with @acronym{ANSI} C. 1719 @end table 1720 1721 First, this manual does not describe use of these other programs; they 1722 have documentation of their own. If you have problems using a 1723 generated interface, please look at the output @cffi{} forms and 1724 verify that they are a correct @cffi{} interface to the library in 1725 question; if they are correct, contact @cffi{} developers with 1726 details, keeping in mind that they communicate in terms of those forms 1727 rather than any particular wrapper generator. Otherwise, contact the 1728 maintainers of the wrapper generator you are using, provided you can 1729 reasonably expect more accuracy from the generator. 1730 1731 When is more accuracy an unreasonable expectation? As described in 1732 the tutorial (@pxref{Tutorial-Abstraction,, Breaking the 1733 abstraction}), the information in C declarations is insufficient to 1734 completely describe every interface. In fact, it is quite common to 1735 run into an interface that cannot be handled automatically, and 1736 generators should be excused from generating a complete interface in 1737 these cases. 1738 1739 As further described in the tutorial, the thinnest Lisp interface to a 1740 C function is not always the most pleasant one. In many cases, you 1741 will want to manually write a Lispier interface to the C functions 1742 that interest you. 1743 1744 Wrapper generators should be treated as time-savers, not complete 1745 automation of the full foreign interface writing job. Reports of the 1746 amount of work done by generators vary from 30% to 90%. The 1747 incremental development style enabled by @cffi{} generally reduces 1748 this proportion below that for languages like Python. 1749 1750 @c Where I got the above 30-90% figures: 1751 @c 30%: lemonodor's post about SWIG 1752 @c 90%: Balooga on #lisp. He said 99%, but that's probably an 1753 @c exaggeration (leave it to me to pass judgement :) 1754 @c -stephen 1755 1756 1757 @c =================================================================== 1758 @c CHAPTER: Foreign Types 1759 1760 @node Foreign Types, Pointers, Wrapper generators, Top 1761 @chapter Foreign Types 1762 1763 Foreign types describe how data is translated back and forth between C 1764 and Lisp. @cffi{} provides various built-in types and allows the user to 1765 define new types. 1766 1767 @menu 1768 * Built-In Types:: 1769 * Other Types:: 1770 * Defining Foreign Types:: 1771 * Foreign Type Translators:: 1772 * Optimizing Type Translators:: 1773 * Foreign Structure Types:: 1774 * Allocating Foreign Objects:: 1775 1776 Dictionary 1777 1778 * convert-from-foreign:: 1779 * convert-to-foreign:: 1780 * defbitfield:: 1781 * defcstruct:: 1782 * defcunion:: 1783 * defctype:: 1784 * defcenum:: 1785 @c * define-type-spec-parser:: 1786 * define-foreign-type:: 1787 * define-parse-method:: 1788 @c * explain-foreign-slot-value: 1789 * foreign-bitfield-symbols:: 1790 * foreign-bitfield-value:: 1791 * foreign-enum-keyword:: 1792 * foreign-enum-value:: 1793 * foreign-slot-names:: 1794 * foreign-slot-offset:: 1795 * foreign-slot-pointer:: 1796 * foreign-slot-value:: 1797 * foreign-type-alignment:: 1798 * foreign-type-size:: 1799 * free-converted-object:: 1800 * free-translated-object:: 1801 * translate-from-foreign:: 1802 * translate-to-foreign:: 1803 * translate-into-foreign-memory:: 1804 * with-foreign-slots:: 1805 @end menu 1806 1807 @node Built-In Types, Other Types, Foreign Types, Foreign Types 1808 @section Built-In Types 1809 1810 @ForeignType{:char} 1811 @ForeignType{:unsigned-char} 1812 @ForeignType{:short} 1813 @ForeignType{:unsigned-short} 1814 @ForeignType{:int} 1815 @ForeignType{:unsigned-int} 1816 @ForeignType{:long} 1817 @ForeignType{:unsigned-long} 1818 @ForeignType{:long-long} 1819 @ForeignType{:unsigned-long-long} 1820 1821 These types correspond to the native C integer types according to the 1822 @acronym{ABI} of the Lisp implementation's host system. 1823 1824 @code{:long-long} and @code{:unsigned-long-long} are not supported 1825 natively on all implementations. However, they are emulated by 1826 @code{mem-ref} and @code{mem-set}. 1827 1828 When those types are @strong{not} available, the symbol 1829 @code{cffi-sys::no-long-long} is pushed into @code{*features*}. 1830 1831 @ForeignType{:uchar} 1832 @ForeignType{:ushort} 1833 @ForeignType{:uint} 1834 @ForeignType{:ulong} 1835 @ForeignType{:llong} 1836 @ForeignType{:ullong} 1837 1838 For convenience, the above types are provided as shortcuts for 1839 @code{unsigned-char}, @code{unsigned-short}, @code{unsigned-int}, 1840 @code{unsigned-long}, @code{long-long} and @code{unsigned-long-long}, 1841 respectively. 1842 1843 @ForeignType{:int8} 1844 @ForeignType{:uint8} 1845 @ForeignType{:int16} 1846 @ForeignType{:uint16} 1847 @ForeignType{:int32} 1848 @ForeignType{:uint32} 1849 @ForeignType{:int64} 1850 @ForeignType{:uint64} 1851 1852 Foreign integer types of specific sizes, corresponding to the C types 1853 defined in @code{stdint.h}. 1854 1855 @c @ForeignType{:size} 1856 @c @ForeignType{:ssize} 1857 @c @ForeignType{:ptrdiff} 1858 @c @ForeignType{:time} 1859 1860 @c Foreign integer types corresponding to the standard C types (without 1861 @c the @code{_t} suffix). 1862 1863 @c @impnote{These are not implemented yet. --luis} 1864 1865 @c @impnote{I'm sure there are more of these that could be useful, let's 1866 @c add any types that can't be defined portably to this list as 1867 @c necessary. --james} 1868 1869 @ForeignType{:float} 1870 @ForeignType{:double} 1871 1872 On all systems, the @code{:float} and @code{:double} types represent a 1873 C @code{float} and @code{double}, respectively. On most but not all 1874 systems, @code{:float} and @code{:double} represent a Lisp 1875 @code{single-float} and @code{double-float}, respectively. It is not 1876 so useful to consider the relationship between Lisp types and C types 1877 as isomorphic, as simply to recognize the relationship, and relative 1878 precision, among each respective category. 1879 1880 @ForeignType{:long-double} 1881 1882 This type is only supported on SCL. 1883 1884 @ForeignType{:pointer &optional type} 1885 1886 A foreign pointer to an object of any type, corresponding to 1887 @code{void *}. You can optionally specify type of pointer 1888 (e.g. @code{(:pointer :char)}). Although @cffi{} won't do anything 1889 with that information yet, it is useful for documentation purposes. 1890 1891 @ForeignType{:void} 1892 1893 No type at all. Only valid as the return type of a function. 1894 1895 @node Other Types, Defining Foreign Types, Built-In Types, Foreign Types 1896 @section Other Types 1897 1898 @cffi{} also provides a few useful types that aren't built-in C 1899 types. 1900 1901 @ForeignType{:string} 1902 1903 The @code{:string} type performs automatic conversion between Lisp and 1904 C strings. Note that, in the case of functions the converted C string 1905 will have dynamic extent (i.e.@: it will be automatically freed after 1906 the foreign function returns). 1907 1908 In addition to Lisp strings, this type will accept foreign pointers 1909 and pass them unmodified. 1910 1911 A method for @ref{free-translated-object} is specialized for this 1912 type. So, for example, foreign strings allocated by this type and 1913 passed to a foreign function will be freed after the function 1914 returns. 1915 1916 @lisp 1917 CFFI> (foreign-funcall "getenv" :string "SHELL" :string) 1918 @result{} "/bin/bash" 1919 1920 CFFI> (with-foreign-string (str "abcdef") 1921 (foreign-funcall "strlen" :string str :int)) 1922 @result{} 6 1923 @end lisp 1924 1925 @ForeignType{:string+ptr} 1926 1927 Like @code{:string} but returns a list with two values when convert 1928 from C to Lisp: a Lisp string and the C string's foreign pointer. 1929 1930 @lisp 1931 CFFI> (foreign-funcall "getenv" :string "SHELL" :string+ptr) 1932 @result{} ("/bin/bash" #.(SB-SYS:INT-SAP #XBFFFFC6F)) 1933 @end lisp 1934 1935 @ForeignType{:boolean &optional (base-type :int)} 1936 1937 The @code{:boolean} type converts between a Lisp boolean and a C 1938 boolean. It canonicalizes to @var{base-type} which is @code{:int} by 1939 default. 1940 1941 @lisp 1942 (convert-to-foreign nil :boolean) @result{} 0 1943 (convert-to-foreign t :boolean) @result{} 1 1944 (convert-from-foreign 0 :boolean) @result{} nil 1945 (convert-from-foreign 1 :boolean) @result{} t 1946 @end lisp 1947 1948 @ForeignType{:bool} 1949 1950 The @code{:bool} type represents the C99 @code{_Bool} or C++ 1951 @code{bool}. Its size is usually 1 byte except on OSX where it's an 1952 @code{int}. 1953 1954 @ForeignType{:wrapper base-type &key to-c from-c} 1955 1956 The @code{:wrapper} type stores two symbols passed to the @var{to-c} 1957 and @var{from-c} arguments. When a value is being translated to or 1958 from C, this type @code{funcall}s the respective symbol. 1959 1960 @code{:wrapper} types will be typedefs for @var{base-type} and will 1961 inherit its translators, if any. 1962 1963 Here's an example of how the @code{:boolean} type could be defined in 1964 terms of @code{:wrapper}. 1965 1966 @lisp 1967 (defun bool-c-to-lisp (value) 1968 (not (zerop value))) 1969 1970 (defun bool-lisp-to-c (value) 1971 (if value 1 0)) 1972 1973 (defctype my-bool (:wrapper :int :from-c bool-c-to-lisp 1974 :to-c bool-lisp-to-c)) 1975 1976 (convert-to-foreign nil 'my-bool) @result{} 0 1977 (convert-from-foreign 1 'my-bool) @result{} t 1978 @end lisp 1979 1980 @node Defining Foreign Types, Foreign Type Translators, Other Types, Foreign Types 1981 @section Defining Foreign Types 1982 1983 You can define simple C-like @code{typedef}s through the 1984 @code{defctype} macro. Defining a typedef is as simple as giving 1985 @code{defctype} a new name and the name of the type to be wrapped. 1986 1987 @lisp 1988 ;;; @lispcmt{Define MY-INT as an alias for the built-in type :INT.} 1989 (defctype my-int :int) 1990 @end lisp 1991 1992 With this type definition, one can, for instance, declare arguments to 1993 foreign functions as having the type @code{my-int}, and they will be 1994 passed as integers. 1995 1996 @subheading More complex types 1997 1998 @cffi{} offers another way to define types through 1999 @code{define-foreign-type}, a thin wrapper macro around 2000 @code{defclass}. As an example, let's go through the steps needed to 2001 define a @code{(my-string &key encoding)} type. First, we need to 2002 define our type class: 2003 2004 @lisp 2005 (define-foreign-type my-string-type () 2006 ((encoding :reader string-type-encoding :initarg :encoding)) 2007 (:actual-type :pointer)) 2008 @end lisp 2009 2010 The @code{:actual-type} class option tells CFFI that this type will 2011 ultimately be passed to and received from foreign code as a 2012 @code{:pointer}. Now you need to tell CFFI how to parse a type 2013 specification such as @code{(my-string :encoding :utf8)} into an 2014 instance of @code{my-string-type}. We do that with 2015 @code{define-parse-method}: 2016 2017 @lisp 2018 (define-parse-method my-string (&key (encoding :utf-8)) 2019 (make-instance 'my-string-type :encoding encoding)) 2020 @end lisp 2021 2022 The next section describes how make this type actually translate 2023 between C and Lisp strings. 2024 2025 @node Foreign Type Translators, Optimizing Type Translators, Defining Foreign Types, Foreign Types 2026 @section Foreign Type Translators 2027 2028 Type translators are used to automatically convert Lisp values to or 2029 from foreign values. For example, using type translators, one can 2030 take the @code{my-string} type defined in the previous section and 2031 specify that it should: 2032 2033 @itemize 2034 @item 2035 convert C strings to Lisp strings; 2036 @item 2037 convert Lisp strings to newly allocated C strings; 2038 @item 2039 free said C strings when they are no longer needed. 2040 @end itemize 2041 2042 In order to tell @cffi{} how to automatically convert Lisp values to 2043 foreign values, define a specialized method for the 2044 @code{translate-to-foreign} generic function: 2045 2046 @lisp 2047 ;;; @lispcmt{Define a method that converts Lisp strings to C strings.} 2048 (defmethod translate-to-foreign (string (type my-string-type)) 2049 (foreign-string-alloc string :encoding (string-type-encoding type))) 2050 @end lisp 2051 2052 @noindent 2053 From now on, whenever an object is passed as a @code{my-string} to a 2054 foreign function, this method will be invoked to convert the Lisp 2055 value. To perform the inverse operation, which is needed for functions 2056 that return a @code{my-string}, specialize the 2057 @code{translate-from-foreign} generic function in the same manner: 2058 2059 @lisp 2060 ;;; @lispcmt{Define a method that converts C strings to Lisp strings.} 2061 (defmethod translate-from-foreign (pointer (type my-string-type)) 2062 (foreign-string-to-lisp pointer :encoding (string-type-encoding type))) 2063 @end lisp 2064 2065 @noindent 2066 When a @code{translate-to-foreign} method requires allocation of 2067 foreign memory, you must also define a @code{free-translated-object} 2068 method to free the memory once the foreign object is no longer needed, 2069 otherwise you'll be faced with memory leaks. This generic function is 2070 called automatically by @cffi{} when passing objects to foreign 2071 functions. Let's do that: 2072 2073 @lisp 2074 ;;; @lispcmt{Free strings allocated by translate-to-foreign.} 2075 (defmethod free-translated-object (pointer (type my-string-type) param) 2076 (declare (ignore param)) 2077 (foreign-string-free pointer)) 2078 @end lisp 2079 2080 @noindent 2081 In this specific example, we don't need the @var{param} argument, so 2082 we ignore it. See @ref{free-translated-object}, for an explanation of 2083 its purpose and how you can use it. 2084 2085 A type translator does not necessarily need to convert the value. For 2086 example, one could define a typedef for @code{:pointer} that ensures, 2087 in the @code{translate-to-foreign} method, that the value is not a 2088 null pointer, signalling an error if a null pointer is passed. This 2089 would prevent some pointer errors when calling foreign functions that 2090 cannot handle null pointers. 2091 2092 @strong{Please note:} these methods are meant as extensible hooks 2093 only, and you should not call them directly. Use 2094 @code{convert-to-foreign}, @code{convert-from-foreign} and 2095 @code{free-converted-object} instead. 2096 2097 @xref{Tutorial-Types,, Defining new types}, for another example of 2098 type translators. 2099 2100 @node Optimizing Type Translators, Foreign Structure Types, Foreign Type Translators, Foreign Types 2101 @section Optimizing Type Translators 2102 2103 @cindex type translators, optimizing 2104 @cindex compiler macros for type translation 2105 @cindex defining type-translation compiler macros 2106 Being based on generic functions, the type translation mechanism 2107 described above can add a bit of overhead. This is usually not 2108 significant, but we nevertheless provide a way of getting rid of the 2109 overhead for the cases where it matters. 2110 2111 A good way to understand this issue is to look at the code generated 2112 by @code{defcfun}. Consider the following example using the previously 2113 defined @code{my-string} type: 2114 2115 @lisp 2116 CFFI> (macroexpand-1 '(defcfun foo my-string (x my-string))) 2117 ;; @lispcmt{(simplified, downcased, etc...)} 2118 (defun foo (x) 2119 (multiple-value-bind (#:G2019 #:PARAM3149) 2120 (translate-to-foreign x #<MY-STRING-TYPE @{11ED5A79@}>) 2121 (unwind-protect 2122 (translate-from-foreign 2123 (foreign-funcall "foo" :pointer #:G2019 :pointer) 2124 #<MY-STRING-TYPE @{11ED5659@}>) 2125 (free-translated-object #:G2019 #<MY-STRING-TYPE @{11ED51A79@}> 2126 #:PARAM3149)))) 2127 @end lisp 2128 2129 @noindent 2130 In order to get rid of those generic function calls, @cffi{} has 2131 another set of extensible generic functions that provide functionality 2132 similar to @acronym{CL}'s compiler macros: 2133 @code{expand-to-foreign-dyn}, @code{expand-to-foreign} and 2134 @code{expand-from-foreign}. Here's how one could define a 2135 @code{my-boolean} with them: 2136 2137 @lisp 2138 (define-foreign-type my-boolean-type () 2139 () 2140 (:actual-type :int) 2141 (:simple-parser my-boolean)) 2142 2143 (defmethod expand-to-foreign (value (type my-boolean-type)) 2144 `(if ,value 1 0)) 2145 2146 (defmethod expand-from-foreign (value (type my-boolean-type)) 2147 `(not (zerop ,value))) 2148 @end lisp 2149 2150 @noindent 2151 And here's what the macroexpansion of a function using this type would 2152 look like: 2153 2154 @lisp 2155 CFFI> (macroexpand-1 '(defcfun bar my-boolean (x my-boolean))) 2156 ;; @lispcmt{(simplified, downcased, etc...)} 2157 (defun bar (x) 2158 (let ((#:g3182 (if x 1 0))) 2159 (not (zerop (foreign-funcall "bar" :int #:g3182 :int))))) 2160 @end lisp 2161 2162 @noindent 2163 No generic function overhead. 2164 2165 Let's go back to our @code{my-string} type. The expansion interface 2166 has no equivalent of @code{free-translated-object}; you must instead 2167 define a method on @code{expand-to-foreign-dyn}, the third generic 2168 function in this interface. This is especially useful when you can 2169 allocate something much more efficiently if you know the object has 2170 dynamic extent, as is the case with function calls that don't save the 2171 relevant allocated arguments. 2172 2173 This exactly what we need for the @code{my-string} type: 2174 2175 @lisp 2176 (defmethod expand-from-foreign (form (type my-string-type)) 2177 `(foreign-string-to-lisp ,form)) 2178 2179 (defmethod expand-to-foreign-dyn (value var body (type my-string-type)) 2180 (let ((encoding (string-type-encoding type))) 2181 `(with-foreign-string (,var ,value :encoding ',encoding) 2182 ,@@body))) 2183 @end lisp 2184 2185 @noindent 2186 So let's look at the macro expansion: 2187 2188 @lisp 2189 CFFI> (macroexpand-1 '(defcfun foo my-string (x my-string))) 2190 ;; @lispcmt{(simplified, downcased, etc...)} 2191 (defun foo (x) 2192 (with-foreign-string (#:G2021 X :encoding ':utf-8) 2193 (foreign-string-to-lisp 2194 (foreign-funcall "foo" :pointer #:g2021 :pointer)))) 2195 @end lisp 2196 2197 @noindent 2198 Again, no generic function overhead. 2199 2200 @subheading Other details 2201 2202 To short-circuit expansion and use the @code{translate-*} functions 2203 instead, simply call the next method. Return its result in cases 2204 where your method cannot generate an appropriate replacement for it. 2205 This analogous to the @code{&whole form} mechanism compiler macros 2206 provide. 2207 2208 The @code{expand-*} methods have precedence over their 2209 @code{translate-*} counterparts and are guaranteed to be used in 2210 @code{defcfun}, @code{foreign-funcall}, @code{defcvar} and 2211 @code{defcallback}. If you define a method on each of the 2212 @code{expand-*} generic functions, you are guaranteed to have full 2213 control over the expressions generated for type translation in these 2214 macros. 2215 2216 They may or may not be used in other @cffi{} operators that need to 2217 translate between Lisp and C data; you may only assume that 2218 @code{expand-*} methods will probably only be called during Lisp 2219 compilation. 2220 2221 @code{expand-to-foreign-dyn} has precedence over 2222 @code{expand-to-foreign} and is only used in @code{defcfun} and 2223 @code{foreign-funcall}, only making sense in those contexts. 2224 2225 @strong{Important note:} this set of generic functions is called at 2226 macroexpansion time. Methods are defined when loaded or evaluated, 2227 not compiled. You are responsible for ensuring that your 2228 @code{expand-*} methods are defined when the @code{foreign-funcall} or 2229 other forms that use them are compiled. One way to do this is to put 2230 the method definitions earlier in the file and inside an appropriate 2231 @code{eval-when} form; another way is to always load a separate Lisp 2232 or @acronym{FASL} file containing your @code{expand-*} definitions 2233 before compiling files with forms that ought to use them. Otherwise, 2234 they will not be found and the runtime translators will be used 2235 instead. 2236 2237 @node Foreign Structure Types, Allocating Foreign Objects, Optimizing Type Translators, Foreign Types 2238 @section Foreign Structure Types 2239 2240 For more involved C types than simple aliases to built-in types, such 2241 as you can make with @code{defctype}, @cffi{} allows declaration of 2242 structures and unions with @code{defcstruct} and @code{defcunion}. 2243 2244 For example, consider this fictional C structure declaration holding 2245 some personal information: 2246 2247 @example 2248 struct person @{ 2249 int number; 2250 char* reason; 2251 @}; 2252 @end example 2253 2254 @noindent 2255 The equivalent @code{defcstruct} form follows: 2256 2257 @lisp 2258 (defcstruct person 2259 (number :int) 2260 (reason :string)) 2261 @end lisp 2262 2263 @c LMH structure translation 2264 By default, @ref{convert-from-foreign} (and also @ref{mem-ref}) will 2265 make a plist with slot names as keys, and @ref{convert-to-foreign} will 2266 translate such a plist to a foreign structure. A user wishing to define 2267 other translations should use the @code{:class} argument to 2268 @ref{defcstruct}, and then define methods for 2269 @ref{translate-from-foreign} and 2270 @ref{translate-into-foreign-memory} that specialize on this class, 2271 possibly calling @code{call-next-method} to translate from and to the 2272 plists rather than provide a direct interface to the foreign object. 2273 The macro @code{translation-forms-for-class} will generate the forms 2274 necessary to translate a Lisp class into a foreign structure and vice 2275 versa. 2276 @c Write separate function doc section for translation-forms-for-class? 2277 @c Examples, perhaps taken from the tests? 2278 2279 Please note that this interface is only for those that must know about 2280 the values contained in a relevant struct. If the library you are 2281 interfacing returns an opaque pointer that needs only be passed to 2282 other C library functions, by all means just use @code{:pointer} or a 2283 type-safe definition munged together with @code{defctype} and type 2284 translation. To pass or return a structure by value to a function, load 2285 the cffi-libffi system and specify the structure as @code{(:struct 2286 @var{structure-name})}. To pass or return the pointer, you can use 2287 either @code{:pointer} or @code{(:pointer (:struct 2288 @var{structure-name}))}. 2289 2290 @subheading Optimizing translate-into-foreign-memory 2291 2292 Just like how @ref{translate-from-foreign} had 2293 @code{expand-from-foreign} to optimize away the generic function call 2294 and @ref{translate-to-foreign} had the same in 2295 @code{expand-to-foreign}, @ref{translate-into-foreign-memory} has 2296 @code{expand-into-foreign-memory}. 2297 2298 Let's use our @code{person} struct in an example. However, we are 2299 going to spice it up by using a lisp struct rather than a plist to 2300 represent the person in lisp. 2301 2302 First we redefine @code{person} very slightly. 2303 2304 @lisp 2305 (defcstruct (person :class c-person) 2306 (number :int) 2307 (reason :string)) 2308 @end lisp 2309 2310 By adding @code{:class} we can specialize the @code{translate-*} 2311 methods on the type @code{c-person}. 2312 2313 Next we define a lisp struct to use instead of the plists. 2314 2315 @lisp 2316 (defstruct lisp-person 2317 (number 0 :type integer) 2318 (reason "" :type string)) 2319 @end lisp 2320 2321 And now let's define the type translators we know already: 2322 2323 @lisp 2324 (defmethod translate-from-foreign (ptr (type c-person)) 2325 (with-foreign-slots ((number reason) ptr (:struct person)) 2326 (make-lisp-person :number number :reason reason))) 2327 2328 (defmethod expand-from-foreign (ptr (type c-person)) 2329 `(with-foreign-slots ((number reason) ,ptr (:struct person)) 2330 (make-lisp-person :number number :reason reason))) 2331 2332 (defmethod translate-into-foreign-memory (value (type c-person) ptr) 2333 (with-foreign-slots ((number reason) ptr (:struct person)) 2334 (setf number (lisp-person-number value) 2335 reason (lisp-person-reason value)))) 2336 @end lisp 2337 2338 At this point everything works, we can convert to and from our 2339 @code{lisp-person} and foreign @code{person}. If we macroexpand 2340 2341 @lisp 2342 (setf (mem-aref ptr '(:struct person)) x) 2343 @end lisp 2344 2345 we get something like: 2346 2347 @lisp 2348 (let ((#:store879 x)) 2349 (translate-into-foreign-memory #:store879 #<c-person person> 2350 (inc-pointer ptr 0)) 2351 #:store879) 2352 @end lisp 2353 2354 Which is good, but now we can do better and get rid of that generic 2355 function call to @code{translate-into-foreign-memory}. 2356 2357 @lisp 2358 (defmethod expand-into-foreign-memory (value (type c-person) ptr) 2359 `(with-foreign-slots ((number reason) ,ptr (:struct person)) 2360 (setf number (lisp-person-number ,value) 2361 reason (lisp-person-reason ,value)))) 2362 @end lisp 2363 2364 Now we can expand again so see the changes: 2365 2366 @lisp 2367 ;; this: 2368 (setf (mem-aref ptr '(:struct person)) x) 2369 2370 ;; expands to this 2371 ;; (simplified, downcased, etc..) 2372 (let ((#:store887 x)) 2373 (with-foreign-slots ((number reason) (inc-pointer ptr 0) (:struct person)) 2374 (setf number (lisp-person-number #:store887) 2375 reason (lisp-person-reason #:store887))) #:store887) 2376 @end lisp 2377 2378 And there we are, no generic function overhead. 2379 2380 @subheading Compatibility note 2381 2382 Previous versions of CFFI accepted the 2383 ``bare'' @var{structure-name} as a type specification, which was 2384 interpreted as a pointer to the structure. This is deprecated and 2385 produces a style warning. Using this deprecated form means that 2386 @ref{mem-aref} retains its prior meaning and returns a pointer. Using 2387 the @code{(:struct @var{structure-name})} form for the type, 2388 @ref{mem-aref} provides a Lisp object translated from the 2389 structure (by default a plist). Thus the semantics are consistent with all 2390 types in returning the object as represented in Lisp, and not a pointer, 2391 with the exception of the ``bare'' structure compatibility retained. 2392 In order to obtain the pointer, you should use the function @ref{mem-aptr}. 2393 2394 See @ref{defcstruct} for more details. 2395 2396 @node Allocating Foreign Objects, convert-from-foreign, Foreign Structure Types, Foreign Types 2397 @section Allocating Foreign Objects 2398 2399 @c I moved this because I moved with-foreign-object to the Pointers 2400 @c chapter, where foreign-alloc is. 2401 2402 @xref{Allocating Foreign Memory}. 2403 2404 2405 @c =================================================================== 2406 @c CONVERT-FROM-FOREIGN 2407 2408 @page 2409 @node convert-from-foreign, convert-to-foreign, Allocating Foreign Objects, Foreign Types 2410 @heading convert-from-foreign 2411 @subheading Syntax 2412 @Function{convert-from-foreign foreign-value type @res{} value} 2413 2414 @subheading Arguments and Values 2415 2416 @table @var 2417 @item foreign-value 2418 The primitive C value as returned from a primitive foreign function or 2419 from @code{convert-to-foreign}. 2420 2421 @item type 2422 A @cffi{} type specifier. 2423 2424 @item value 2425 The Lisp value translated from @var{foreign-value}. 2426 @end table 2427 2428 @subheading Description 2429 2430 This is an external interface to the type translation facility. In 2431 the implementation, all foreign functions are ultimately defined as 2432 type translation wrappers around primitive foreign function 2433 invocations. 2434 2435 This function is available mostly for inspection of the type 2436 translation process, and possibly optimization of special cases of 2437 your foreign function calls. 2438 2439 Its behavior is better described under @code{translate-from-foreign}'s 2440 documentation. 2441 2442 @subheading Examples 2443 2444 @lisp 2445 CFFI-USER> (convert-to-foreign "a boat" :string) 2446 @result{} #<FOREIGN-ADDRESS #x097ACDC0> 2447 @result{} T 2448 CFFI-USER> (convert-from-foreign * :string) 2449 @result{} "a boat" 2450 @end lisp 2451 2452 @subheading See Also 2453 @seealso{convert-to-foreign} @* 2454 @seealso{free-converted-object} @* 2455 @seealso{translate-from-foreign} 2456 2457 2458 @c =================================================================== 2459 @c CONVERT-TO-FOREIGN 2460 2461 @page 2462 @node convert-to-foreign, defbitfield, convert-from-foreign, Foreign Types 2463 @heading convert-to-foreign 2464 @subheading Syntax 2465 @Function{convert-to-foreign value type @res{} foreign-value, alloc-params} 2466 2467 @subheading Arguments and Values 2468 2469 @table @var 2470 @item value 2471 The Lisp object to be translated to a foreign object. 2472 2473 @item type 2474 A @cffi{} type specifier. 2475 2476 @item foreign-value 2477 The primitive C value, ready to be passed to a primitive foreign 2478 function. 2479 2480 @item alloc-params 2481 Something of a translation state; you must pass it to 2482 @code{free-converted-object} along with the foreign value for that to 2483 work. 2484 @end table 2485 2486 @subheading Description 2487 2488 This is an external interface to the type translation facility. In 2489 the implementation, all foreign functions are ultimately defined as 2490 type translation wrappers around primitive foreign function 2491 invocations. 2492 2493 This function is available mostly for inspection of the type 2494 translation process, and possibly optimization of special cases of 2495 your foreign function calls. 2496 2497 Its behavior is better described under @code{translate-to-foreign}'s 2498 documentation. 2499 2500 @subheading Examples 2501 2502 @lisp 2503 CFFI-USER> (convert-to-foreign t :boolean) 2504 @result{} 1 2505 @result{} NIL 2506 CFFI-USER> (convert-to-foreign "hello, world" :string) 2507 @result{} #<FOREIGN-ADDRESS #x097C5F80> 2508 @result{} T 2509 CFFI-USER> (code-char (mem-aref * :char 5)) 2510 @result{} #\, 2511 @end lisp 2512 2513 @subheading See Also 2514 @seealso{convert-from-foreign} @* 2515 @seealso{free-converted-object} @* 2516 @seealso{translate-to-foreign} 2517 2518 2519 @c =================================================================== 2520 @c DEFBITFIELD 2521 2522 @page 2523 @node defbitfield, defcstruct, convert-to-foreign, Foreign Types 2524 @heading defbitfield 2525 @subheading Syntax 2526 @Macro{defbitfield name-and-options &body masks} 2527 2528 masks ::= [docstring] @{ (symbol value) @}* @* 2529 name-and-options ::= name | (name &optional (base-type :int)) 2530 2531 @subheading Arguments and Values 2532 2533 @table @var 2534 @item name 2535 The name of the new bitfield type. 2536 2537 @item docstring 2538 A documentation string, ignored. 2539 2540 @item base-type 2541 A symbol denoting a foreign type. 2542 2543 @item symbol 2544 A Lisp symbol. 2545 2546 @item value 2547 An integer representing a bitmask. 2548 @end table 2549 2550 @subheading Description 2551 The @code{defbitfield} macro is used to define foreign types that map 2552 lists of symbols to integer values. 2553 2554 If @var{value} is omitted, it will be computed as follows: find the 2555 greatest @var{value} previously used, including those so computed, 2556 with only a single 1-bit in its binary representation (that is, powers 2557 of two), and left-shift it by one. This rule guarantees that a 2558 computed @var{value} cannot clash with previous values, but may clash 2559 with future explicitly specified values. 2560 2561 Symbol lists will be automatically converted to values and vice versa 2562 when being passed as arguments to or returned from foreign functions, 2563 respectively. The same applies to any other situations where an object 2564 of a bitfield type is expected. 2565 2566 Types defined with @code{defbitfield} canonicalize to @var{base-type} 2567 which is @code{:int} by default. 2568 2569 @subheading Examples 2570 @lisp 2571 (defbitfield open-flags 2572 (:rdonly #x0000) 2573 :wronly ;@lispcmt{#x0001} 2574 :rdwr ;@lispcmt{@dots{}} 2575 :nonblock 2576 :append 2577 (:creat #x0200)) 2578 ;; @lispcmt{etc@dots{}} 2579 2580 CFFI> (foreign-bitfield-symbols 'open-flags #b1101) 2581 @result{} (:WRONLY :NONBLOCK :APPEND) 2582 2583 CFFI> (foreign-bitfield-value 'open-flags '(:rdwr :creat)) 2584 @result{} 514 ; #x0202 2585 2586 (defcfun ("open" unix-open) :int 2587 (path :string) 2588 (flags open-flags) 2589 (mode :uint16)) ; unportable 2590 2591 CFFI> (unix-open "/tmp/foo" '(:wronly :creat) #o644) 2592 @result{} #<an fd> 2593 2594 ;;; @lispcmt{Consider also the following lispier wrapper around open()} 2595 (defun lispier-open (path mode &rest flags) 2596 (unix-open path flags mode)) 2597 @end lisp 2598 2599 @subheading See Also 2600 @seealso{foreign-bitfield-value} @* 2601 @seealso{foreign-bitfield-symbols} 2602 2603 2604 @c =================================================================== 2605 @c DEFCSTRUCT 2606 2607 @page 2608 @node defcstruct, defcunion, defbitfield, Foreign Types 2609 @heading defcstruct 2610 @subheading Syntax 2611 @Macro{defcstruct name-and-options &body doc-and-slots @res{} name} 2612 2613 name-and-options ::= structure-name | (structure-name &key size) 2614 2615 doc-and-slots ::= [docstring] @{ (slot-name slot-type &key count offset) @}* 2616 2617 @subheading Arguments and Values 2618 2619 @table @var 2620 @item structure-name 2621 The name of new structure type. 2622 2623 @item docstring 2624 A documentation string, ignored. 2625 2626 @item slot-name 2627 A symbol naming the slot. It must be unique among slot names in this 2628 structure. 2629 2630 @item size 2631 Use this option to override the size (in bytes) of the struct. 2632 2633 @item slot-type 2634 The type specifier for the slot. 2635 2636 @item count 2637 Used to declare an array of size @var{count} inside the 2638 structure. Defaults to @code{1} as such an array and a single element 2639 are semantically equivalent. 2640 2641 @item offset 2642 Overrides the slot's offset. The next slot's offset is calculated 2643 based on this one. 2644 @end table 2645 2646 @subheading Description 2647 This defines a new @cffi{} aggregate type akin to C @code{struct}s. 2648 In other words, it specifies that foreign objects of the type 2649 @var{structure-name} are groups of different pieces of data, or 2650 ``slots'', of the @var{slot-type}s, distinguished from each other by 2651 the @var{slot-name}s. Each structure is located in memory at a 2652 position, and the slots are allocated sequentially beginning at that 2653 point in memory (with some padding allowances as defined by the C 2654 @acronym{ABI}, unless otherwise requested by specifying an 2655 @var{offset} from the beginning of the structure (offset 0). 2656 2657 In other words, it is isomorphic to the C @code{struct}, giving 2658 several extra features. 2659 2660 There are two kinds of slots, for the two kinds of @cffi{} types: 2661 2662 @table @dfn 2663 @item Simple 2664 Contain a single instance of a type that canonicalizes to a built-in 2665 type, such as @code{:long} or @code{:pointer}. Used for simple 2666 @cffi{} types. 2667 2668 @item Aggregate 2669 Contain an embedded structure or union, or an array of objects. Used 2670 for aggregate @cffi{} types. 2671 @end table 2672 2673 The use of @acronym{CLOS} terminology for the structure-related 2674 features is intentional; structure definitions are very much like 2675 classes with (far) fewer features. 2676 2677 @subheading Examples 2678 @lisp 2679 (defcstruct point 2680 "Point structure." 2681 (x :int) 2682 (y :int)) 2683 2684 CFFI> (with-foreign-object (ptr 'point) 2685 ;; @lispcmt{Initialize the slots} 2686 (setf (foreign-slot-value ptr 'point 'x) 42 2687 (foreign-slot-value ptr 'point 'y) 42) 2688 ;; @lispcmt{Return a list with the coordinates} 2689 (with-foreign-slots ((x y) ptr point) 2690 (list x y))) 2691 @result{} (42 42) 2692 @end lisp 2693 2694 @lisp 2695 ;; @lispcmt{Using the :size and :offset options to define a partial structure.} 2696 ;; @lispcmt{(this is useful when you are interested in only a few slots} 2697 ;; @lispcmt{of a big foreign structure)} 2698 2699 (defcstruct (foo :size 32) 2700 "Some struct with 32 bytes." 2701 ; @lispcmt{<16 bytes we don't care about>} 2702 (x :int :offset 16) ; @lispcmt{an int at offset 16} 2703 (y :int) ; @lispcmt{another int at offset 16+sizeof(int)} 2704 ; @lispcmt{<a couple more bytes we don't care about>} 2705 (z :char :offset 24)) ; @lispcmt{a char at offset 24} 2706 ; @lispcmt{<7 more bytes ignored (since size is 32)>} 2707 2708 CFFI> (foreign-type-size 'foo) 2709 @result{} 32 2710 @end lisp 2711 2712 @lisp 2713 ;;; @lispcmt{Using :count to define arrays inside of a struct.} 2714 (defcstruct video_tuner 2715 (name :char :count 32)) 2716 @end lisp 2717 2718 @subheading See Also 2719 @seealso{foreign-slot-pointer} @* 2720 @seealso{foreign-slot-value} @* 2721 @seealso{with-foreign-slots} 2722 2723 2724 @c =================================================================== 2725 @c DEFCUNION 2726 2727 @page 2728 @node defcunion, defctype, defcstruct, Foreign Types 2729 @heading defcunion 2730 @subheading Syntax 2731 @Macro{defcunion name &body doc-and-slots @res{} name} 2732 2733 doc-and-slots ::= [docstring] @{ (slot-name slot-type &key count) @}* 2734 2735 @subheading Arguments and Values 2736 2737 @table @var 2738 @item name 2739 The name of new union type. 2740 2741 @item docstring 2742 A documentation string, ignored. 2743 2744 @item slot-name 2745 A symbol naming the slot. 2746 2747 @item slot-type 2748 The type specifier for the slot. 2749 2750 @item count 2751 Used to declare an array of size @var{count} inside the 2752 structure. 2753 @end table 2754 2755 @subheading Description 2756 A union is a structure in which all slots have an offset of zero. It 2757 is isomorphic to the C @code{union}. Therefore, you should use the 2758 usual foreign structure operations for accessing a union's slots. 2759 2760 @subheading Examples 2761 @lisp 2762 (defcunion uint32-bytes 2763 (int-value :unsigned-int) 2764 (bytes :unsigned-char :count 4)) 2765 @end lisp 2766 2767 @subheading See Also 2768 @seealso{foreign-slot-pointer} @* 2769 @seealso{foreign-slot-value} 2770 2771 2772 @c =================================================================== 2773 @c DEFCTYPE 2774 2775 @page 2776 @node defctype, defcenum, defcunion, Foreign Types 2777 @heading defctype 2778 @subheading Syntax 2779 @Macro{defctype name base-type &optional documentation} 2780 2781 @subheading Arguments and Values 2782 2783 @table @var 2784 @item name 2785 The name of the new foreign type. 2786 2787 @item base-type 2788 A symbol or a list defining the new type. 2789 2790 @item documentation 2791 A documentation string, currently ignored. 2792 @end table 2793 2794 @subheading Description 2795 The @code{defctype} macro provides a mechanism similar to C's 2796 @code{typedef} to define new types. The new type inherits 2797 @var{base-type}'s translators, if any. There is no way to define 2798 translations for types defined with @code{defctype}. For that, 2799 you should use @ref{define-foreign-type}. 2800 2801 @subheading Examples 2802 @lisp 2803 (defctype my-string :string 2804 "My own string type.") 2805 2806 (defctype long-bools (:boolean :long) 2807 "Booleans that map to C longs.") 2808 @end lisp 2809 2810 @subheading See Also 2811 @seealso{define-foreign-type} 2812 2813 2814 @c =================================================================== 2815 @c DEFCENUM 2816 2817 @page 2818 @node defcenum, define-foreign-type, defctype, Foreign Types 2819 @heading defcenum 2820 @subheading Syntax 2821 @Macro{defcenum name-and-options &body enum-list} 2822 2823 enum-list ::= [docstring] @{ keyword | (keyword value) @}* 2824 name-and-options ::= name | (name &optional (base-type :int)) 2825 2826 @subheading Arguments and Values 2827 2828 @table @var 2829 @item name 2830 The name of the new enum type. 2831 2832 @item docstring 2833 A documentation string, ignored. 2834 2835 @item base-type 2836 A symbol denoting a foreign type. 2837 2838 @item keyword 2839 A keyword symbol. 2840 2841 @item value 2842 An index value for a keyword. 2843 @end table 2844 2845 @subheading Description 2846 The @code{defcenum} macro is used to define foreign types that map 2847 keyword symbols to integer values, similar to the C @code{enum} type. 2848 2849 If @var{value} is omitted its value will either be 0, if it's the 2850 first entry, or it it will continue the progression from the last 2851 specified value. 2852 2853 Keywords will be automatically converted to values and vice-versa when 2854 being passed as arguments to or returned from foreign functions, 2855 respectively. The same applies to any other situations where an object 2856 of an @code{enum} type is expected. 2857 2858 Types defined with @code{defcenum} canonicalize to @var{base-type} 2859 which is @code{:int} by default. 2860 2861 @subheading Examples 2862 @lisp 2863 (defcenum boolean 2864 :no 2865 :yes) 2866 2867 CFFI> (foreign-enum-value 'boolean :no) 2868 @result{} 0 2869 @end lisp 2870 2871 @lisp 2872 (defcenum numbers 2873 (:one 1) 2874 :two 2875 (:four 4)) 2876 2877 CFFI> (foreign-enum-keyword 'numbers 2) 2878 @result{} :TWO 2879 @end lisp 2880 2881 @subheading See Also 2882 @seealso{foreign-enum-value} @* 2883 @seealso{foreign-enum-keyword} 2884 2885 2886 @c =================================================================== 2887 @c DEFINE-FOREIGN-TYPE 2888 2889 @page 2890 @node define-foreign-type, define-parse-method, defcenum, Foreign Types 2891 @heading define-foreign-type 2892 @subheading Syntax 2893 @Macro{define-foreign-type class-name supers slots &rest options @res{} class-name} 2894 2895 options ::= (@code{:actual-type} @var{type}) | @ 2896 (@code{:simple-parser} @var{symbol}) | @ 2897 @emph{regular defclass option} 2898 2899 @subheading Arguments and Values 2900 2901 @table @var 2902 @item class-name 2903 A symbol naming the new foreign type class. 2904 2905 @item supers 2906 A list of symbols naming the super classes. 2907 2908 @item slots 2909 A list of slot definitions, passed to @code{defclass}. 2910 @end table 2911 2912 @subheading Description 2913 2914 @c TODO rewrite 2915 2916 The macro @code{define-foreign-type} defines a new class 2917 @var{class-name}. It is a thin wrapper around @code{defclass}. Among 2918 other things, it ensures that @var{class-name} becomes a subclass of 2919 @var{foreign-type}, what you need to know about that is that there's 2920 an initarg @code{:actual-type} which serves the same purpose as 2921 @code{defctype}'s @var{base-type} argument. 2922 2923 @c TODO mention the type translators here 2924 @c FIX FIX 2925 2926 @subheading Examples 2927 Taken from @cffi{}'s @code{:boolean} type definition: 2928 2929 @lisp 2930 (define-foreign-type :boolean (&optional (base-type :int)) 2931 "Boolean type. Maps to an :int by default. Only accepts integer types." 2932 (ecase base-type 2933 ((:char 2934 :unsigned-char 2935 :int 2936 :unsigned-int 2937 :long 2938 :unsigned-long) base-type))) 2939 2940 CFFI> (canonicalize-foreign-type :boolean) 2941 @result{} :INT 2942 CFFI> (canonicalize-foreign-type '(:boolean :long)) 2943 @result{} :LONG 2944 CFFI> (canonicalize-foreign-type '(:boolean :float)) 2945 ;; @lispcmt{@error{} signalled by ECASE.} 2946 @end lisp 2947 2948 @subheading See Also 2949 @seealso{defctype} @* 2950 @seealso{define-parse-method} 2951 2952 2953 @c =================================================================== 2954 @c DEFINE-PARSE-METHOD 2955 2956 @page 2957 @node define-parse-method, foreign-bitfield-symbols, define-foreign-type, Foreign Types 2958 @heading define-parse-method 2959 @subheading Syntax 2960 @Macro{define-parse-method name lambda-list &body body @res{} name} 2961 2962 @subheading Arguments and Values 2963 2964 @table @var 2965 @item type-name 2966 A symbol naming the new foreign type. 2967 2968 @item lambda-list 2969 A lambda list which is the argument list of the new foreign type. 2970 2971 @item body 2972 One or more forms that provide a definition of the new foreign type. 2973 @end table 2974 2975 @subheading Description 2976 2977 2978 @c TODO: update example. The boolean type is probably a good choice. 2979 2980 @subheading Examples 2981 Taken from @cffi{}'s @code{:boolean} type definition: 2982 2983 @lisp 2984 (define-foreign-type :boolean (&optional (base-type :int)) 2985 "Boolean type. Maps to an :int by default. Only accepts integer types." 2986 (ecase base-type 2987 ((:char 2988 :unsigned-char 2989 :int 2990 :unsigned-int 2991 :long 2992 :unsigned-long) base-type))) 2993 2994 CFFI> (canonicalize-foreign-type :boolean) 2995 @result{} :INT 2996 CFFI> (canonicalize-foreign-type '(:boolean :long)) 2997 @result{} :LONG 2998 CFFI> (canonicalize-foreign-type '(:boolean :float)) 2999 ;; @lispcmt{@error{} signalled by ECASE.} 3000 @end lisp 3001 3002 @subheading See Also 3003 @seealso{define-foreign-type} 3004 3005 3006 @c =================================================================== 3007 @c EXPLAIN-FOREIGN-SLOT-VALUE 3008 3009 @c @node explain-foreign-slot-value 3010 @c @heading explain-foreign-slot-value 3011 @c @subheading Syntax 3012 @c @Macro{explain-foreign-slot-value ptr type &rest slot-names} 3013 3014 @c @subheading Arguments and Values 3015 3016 @c @table @var 3017 @c @item ptr 3018 @c ... 3019 3020 @c @item type 3021 @c ... 3022 3023 @c @item slot-names 3024 @c ... 3025 @c @end table 3026 3027 @c @subheading Description 3028 @c This macro translates the slot access that would occur by calling 3029 @c @code{foreign-slot-value} with the same arguments into an equivalent 3030 @c expression in C and prints it to @code{*standard-output*}. 3031 3032 @c @emph{Note: this is not implemented yet.} 3033 3034 @c @subheading Examples 3035 @c @lisp 3036 @c CFFI> (explain-foreign-slot-value ptr 'timeval 'tv-secs) 3037 @c @result{} ptr->tv_secs 3038 3039 @c CFFI> (explain-foreign-slot-value emp 'employee 'hire-date 'tv-usecs) 3040 @c @result{} emp->hire_date.tv_usecs 3041 @c @end lisp 3042 3043 @c @subheading See Also 3044 3045 3046 @c =================================================================== 3047 @c FOREIGN-BITFIELD-SYMBOLS 3048 3049 @page 3050 @node foreign-bitfield-symbols, foreign-bitfield-value, define-parse-method, Foreign Types 3051 @heading foreign-bitfield-symbols 3052 @subheading Syntax 3053 @Function{foreign-bitfield-symbols type value @res{} symbols} 3054 3055 @subheading Arguments and Values 3056 3057 @table @var 3058 @item type 3059 A bitfield type. 3060 3061 @item value 3062 An integer. 3063 3064 @item symbols 3065 A potentially shared list of symbols. 3066 @code{nil}. 3067 @end table 3068 3069 @subheading Description 3070 The function @code{foreign-bitfield-symbols} returns a possibly shared 3071 list of symbols that correspond to @var{value} in @var{type}. 3072 3073 @subheading Examples 3074 @lisp 3075 (defbitfield flags 3076 (flag-a 1) 3077 (flag-b 2) 3078 (flag-c 4)) 3079 3080 CFFI> (foreign-bitfield-symbols 'flags #b101) 3081 @result{} (FLAG-A FLAG-C) 3082 @end lisp 3083 3084 @subheading See Also 3085 @seealso{defbitfield} @* 3086 @seealso{foreign-bitfield-value} 3087 3088 3089 @c =================================================================== 3090 @c FOREIGN-BITFIELD-VALUE 3091 3092 @page 3093 @node foreign-bitfield-value, foreign-enum-keyword, foreign-bitfield-symbols, Foreign Types 3094 @heading foreign-bitfield-value 3095 @subheading Syntax 3096 @Function{foreign-bitfield-value type symbols @res{} value} 3097 3098 @subheading Arguments and Values 3099 3100 @table @var 3101 @item type 3102 A @code{bitfield} type. 3103 3104 @item symbol 3105 A Lisp symbol. 3106 3107 @item value 3108 An integer. 3109 @end table 3110 3111 @subheading Description 3112 The function @code{foreign-bitfield-value} returns the @var{value} that 3113 corresponds to the symbols in the @var{symbols} list. 3114 3115 @subheading Examples 3116 @lisp 3117 (defbitfield flags 3118 (flag-a 1) 3119 (flag-b 2) 3120 (flag-c 4)) 3121 3122 CFFI> (foreign-bitfield-value 'flags '(flag-a flag-c)) 3123 @result{} 5 ; #b101 3124 @end lisp 3125 3126 @subheading See Also 3127 @seealso{defbitfield} @* 3128 @seealso{foreign-bitfield-symbols} 3129 3130 3131 @c =================================================================== 3132 @c FOREIGN-ENUM-KEYWORD 3133 3134 @page 3135 @node foreign-enum-keyword, foreign-enum-value, foreign-bitfield-value, Foreign Types 3136 @heading foreign-enum-keyword 3137 @subheading Syntax 3138 @Function{foreign-enum-keyword type value &key errorp @res{} keyword} 3139 3140 @subheading Arguments and Values 3141 3142 @table @var 3143 @item type 3144 An @code{enum} type. 3145 3146 @item value 3147 An integer. 3148 3149 @item errorp 3150 If true (the default), signal an error if @var{value} is not defined 3151 in @var{type}. If false, @code{foreign-enum-keyword} returns 3152 @code{nil}. 3153 3154 @item keyword 3155 A keyword symbol. 3156 @end table 3157 3158 @subheading Description 3159 The function @code{foreign-enum-keyword} returns the keyword symbol 3160 that corresponds to @var{value} in @var{type}. 3161 3162 An error is signaled if @var{type} doesn't contain such @var{value} 3163 and @var{errorp} is true. 3164 3165 @subheading Examples 3166 @lisp 3167 (defcenum boolean 3168 :no 3169 :yes) 3170 3171 CFFI> (foreign-enum-keyword 'boolean 1) 3172 @result{} :YES 3173 @end lisp 3174 3175 @subheading See Also 3176 @seealso{defcenum} @* 3177 @seealso{foreign-enum-value} 3178 3179 3180 @c =================================================================== 3181 @c FOREIGN-ENUM-VALUE 3182 3183 @page 3184 @node foreign-enum-value, foreign-slot-names, foreign-enum-keyword, Foreign Types 3185 @heading foreign-enum-value 3186 @subheading Syntax 3187 @Function{foreign-enum-value type keyword &key errorp @res{} value} 3188 3189 @subheading Arguments and Values 3190 3191 @table @var 3192 @item type 3193 An @code{enum} type. 3194 3195 @item keyword 3196 A keyword symbol. 3197 3198 @item errorp 3199 If true (the default), signal an error if @var{keyword} is not 3200 defined in @var{type}. If false, @code{foreign-enum-value} returns 3201 @code{nil}. 3202 3203 @item value 3204 An integer. 3205 @end table 3206 3207 @subheading Description 3208 The function @code{foreign-enum-value} returns the @var{value} that 3209 corresponds to @var{keyword} in @var{type}. 3210 3211 An error is signaled if @var{type} doesn't contain such 3212 @var{keyword}, and @var{errorp} is true. 3213 3214 @subheading Examples 3215 @lisp 3216 (defcenum boolean 3217 :no 3218 :yes) 3219 3220 CFFI> (foreign-enum-value 'boolean :yes) 3221 @result{} 1 3222 @end lisp 3223 3224 @subheading See Also 3225 @seealso{defcenum} @* 3226 @seealso{foreign-enum-keyword} 3227 3228 3229 @c =================================================================== 3230 @c FOREIGN-SLOT-NAMES 3231 3232 @page 3233 @node foreign-slot-names, foreign-slot-offset, foreign-enum-value, Foreign Types 3234 @heading foreign-slot-names 3235 @subheading Syntax 3236 @Function{foreign-slot-names type @res{} names} 3237 3238 @subheading Arguments and Values 3239 3240 @table @var 3241 @item type 3242 A foreign struct type. 3243 3244 @item names 3245 A list. 3246 @end table 3247 3248 @subheading Description 3249 The function @code{foreign-slot-names} returns a potentially shared 3250 list of slot @var{names} for the given structure @var{type}. This list 3251 has no particular order. 3252 3253 @subheading Examples 3254 @lisp 3255 (defcstruct timeval 3256 (tv-secs :long) 3257 (tv-usecs :long)) 3258 3259 CFFI> (foreign-slot-names '(:struct timeval)) 3260 @result{} (TV-SECS TV-USECS) 3261 @end lisp 3262 3263 @subheading See Also 3264 @seealso{defcstruct} @* 3265 @seealso{foreign-slot-offset} @* 3266 @seealso{foreign-slot-value} @* 3267 @seealso{foreign-slot-pointer} 3268 3269 3270 @c =================================================================== 3271 @c FOREIGN-SLOT-OFFSET 3272 3273 @page 3274 @node foreign-slot-offset, foreign-slot-pointer, foreign-slot-names, Foreign Types 3275 @heading foreign-slot-offset 3276 @subheading Syntax 3277 @Function{foreign-slot-offset type slot-name @res{} offset} 3278 3279 @subheading Arguments and Values 3280 3281 @table @var 3282 @item type 3283 A foreign struct type. 3284 3285 @item slot-name 3286 A symbol. 3287 3288 @item offset 3289 An integer. 3290 @end table 3291 3292 @subheading Description 3293 The function @code{foreign-slot-offset} returns the @var{offset} in 3294 bytes of a slot in a foreign struct type. 3295 3296 @subheading Examples 3297 @lisp 3298 (defcstruct timeval 3299 (tv-secs :long) 3300 (tv-usecs :long)) 3301 3302 CFFI> (foreign-slot-offset '(:struct timeval) 'tv-secs) 3303 @result{} 0 3304 CFFI> (foreign-slot-offset '(:struct timeval) 'tv-usecs) 3305 @result{} 4 3306 @end lisp 3307 3308 @subheading See Also 3309 @seealso{defcstruct} @* 3310 @seealso{foreign-slot-names} @* 3311 @seealso{foreign-slot-pointer} @* 3312 @seealso{foreign-slot-value} 3313 3314 3315 @c =================================================================== 3316 @c FOREIGN-SLOT-POINTER 3317 3318 @page 3319 @node foreign-slot-pointer, foreign-slot-value, foreign-slot-offset, Foreign Types 3320 @heading foreign-slot-pointer 3321 @subheading Syntax 3322 @Function{foreign-slot-pointer ptr type slot-name @res{} pointer} 3323 3324 @subheading Arguments and Values 3325 3326 @table @var 3327 @item ptr 3328 A pointer to a structure. 3329 3330 @item type 3331 A foreign structure type. 3332 3333 @item slot-names 3334 A slot name in the @var{type}. 3335 3336 @item pointer 3337 A pointer to the slot @var{slot-name}. 3338 @end table 3339 3340 @subheading Description 3341 Returns a pointer to the location of the slot @var{slot-name} in a 3342 foreign object of type @var{type} at @var{ptr}. The returned pointer 3343 points inside the structure. Both the pointer and the memory it points 3344 to have the same extent as @var{ptr}. 3345 3346 For aggregate slots, this is the same value returned by 3347 @code{foreign-slot-value}. 3348 3349 @subheading Examples 3350 @lisp 3351 (defcstruct point 3352 "Pointer structure." 3353 (x :int) 3354 (y :int)) 3355 3356 CFFI> (with-foreign-object (ptr '(:struct point)) 3357 (foreign-slot-pointer ptr '(:struct point) 'x)) 3358 @result{} #<FOREIGN-ADDRESS #xBFFF6E60> 3359 ;; @lispcmt{Note: the exact pointer representation varies from lisp to lisp.} 3360 @end lisp 3361 3362 @subheading See Also 3363 @seealso{defcstruct} @* 3364 @seealso{foreign-slot-value} @* 3365 @seealso{foreign-slot-names} @* 3366 @seealso{foreign-slot-offset} 3367 3368 3369 @c =================================================================== 3370 @c FOREIGN-SLOT-VALUE 3371 3372 @page 3373 @node foreign-slot-value, foreign-type-alignment, foreign-slot-pointer, Foreign Types 3374 @heading foreign-slot-value 3375 @subheading Syntax 3376 @Accessor{foreign-slot-value ptr type slot-name @res{} object} 3377 3378 @subheading Arguments and Values 3379 3380 @table @var 3381 @item ptr 3382 A pointer to a structure. 3383 3384 @item type 3385 A foreign structure type. 3386 3387 @item slot-name 3388 A symbol naming a slot in the structure type. 3389 3390 @item object 3391 The object contained in the slot specified by @var{slot-name}. 3392 @end table 3393 3394 @subheading Description 3395 For simple slots, @code{foreign-slot-value} returns the value of the 3396 object, such as a Lisp integer or pointer. In C, this would be 3397 expressed as @code{ptr->slot}. 3398 3399 For aggregate slots, a pointer inside the structure to the beginning 3400 of the slot's data is returned. In C, this would be expressed as 3401 @code{&ptr->slot}. This pointer and the memory it points to have the 3402 same extent as @var{ptr}. 3403 3404 There are compiler macros for @code{foreign-slot-value} and its 3405 @code{setf} expansion that open code the memory access when 3406 @var{type} and @var{slot-names} are constant at compile-time. 3407 3408 @subheading Examples 3409 @lisp 3410 (defcstruct point 3411 "Pointer structure." 3412 (x :int) 3413 (y :int)) 3414 3415 CFFI> (with-foreign-object (ptr '(:struct point)) 3416 ;; @lispcmt{Initialize the slots} 3417 (setf (foreign-slot-value ptr '(:struct point) 'x) 42 3418 (foreign-slot-value ptr '(:struct point) 'y) 42) 3419 ;; @lispcmt{Return a list with the coordinates} 3420 (with-foreign-slots ((x y) ptr (:struct point)) 3421 (list x y))) 3422 @result{} (42 42) 3423 @end lisp 3424 3425 @subheading See Also 3426 @seealso{defcstruct} @* 3427 @seealso{foreign-slot-names} @* 3428 @seealso{foreign-slot-offset} @* 3429 @seealso{foreign-slot-pointer} @* 3430 @seealso{with-foreign-slots} 3431 3432 3433 @c =================================================================== 3434 @c FOREIGN-TYPE-ALIGNMENT 3435 3436 @page 3437 @node foreign-type-alignment, foreign-type-size, foreign-slot-value, Foreign Types 3438 @heading foreign-type-alignment 3439 @subheading Syntax 3440 @c XXX: This is actually a generic function. 3441 @Function{foreign-type-alignment type @res{} alignment} 3442 3443 @subheading Arguments and Values 3444 3445 @table @var 3446 @item type 3447 A foreign type. 3448 3449 @item alignment 3450 An integer. 3451 @end table 3452 3453 @subheading Description 3454 The function @code{foreign-type-alignment} returns the 3455 @var{alignment} of @var{type} in bytes. 3456 3457 @subheading Examples 3458 @lisp 3459 CFFI> (foreign-type-alignment :char) 3460 @result{} 1 3461 CFFI> (foreign-type-alignment :short) 3462 @result{} 2 3463 CFFI> (foreign-type-alignment :int) 3464 @result{} 4 3465 @end lisp 3466 3467 @lisp 3468 (defcstruct foo 3469 (a :char)) 3470 3471 CFFI> (foreign-type-alignment '(:struct foo)) 3472 @result{} 1 3473 @end lisp 3474 3475 @subheading See Also 3476 @seealso{foreign-type-size} 3477 3478 3479 @c =================================================================== 3480 @c FOREIGN-TYPE-SIZE 3481 3482 @page 3483 @node foreign-type-size, free-converted-object, foreign-type-alignment, Foreign Types 3484 @heading foreign-type-size 3485 @subheading Syntax 3486 @c XXX: this is actually a generic function. 3487 @Function{foreign-type-size type @res{} size} 3488 3489 @subheading Arguments and Values 3490 3491 @table @var 3492 @item type 3493 A foreign type. 3494 3495 @item size 3496 An integer. 3497 @end table 3498 3499 @subheading Description 3500 The function @code{foreign-type-size} return the @var{size} of 3501 @var{type} in bytes. This includes any padding within and following 3502 the in-memory representation as needed to create an array of 3503 @var{type} objects. 3504 3505 @subheading Examples 3506 @lisp 3507 (defcstruct foo 3508 (a :double) 3509 (c :char)) 3510 3511 CFFI> (foreign-type-size :double) 3512 @result{} 8 3513 CFFI> (foreign-type-size :char) 3514 @result{} 1 3515 CFFI> (foreign-type-size '(:struct foo)) 3516 @result{} 16 3517 @end lisp 3518 3519 @subheading See Also 3520 @seealso{foreign-type-alignment} 3521 3522 3523 @c =================================================================== 3524 @c FREE-CONVERTED-OBJECT 3525 3526 @page 3527 @node free-converted-object, free-translated-object, foreign-type-size, Foreign Types 3528 @heading free-converted-object 3529 @subheading Syntax 3530 @Function{free-converted-object foreign-value type params} 3531 3532 @subheading Arguments and Values 3533 3534 @table @var 3535 @item foreign-value 3536 The C object to be freed. 3537 3538 @item type 3539 A @cffi{} type specifier. 3540 3541 @item params 3542 The state returned as the second value from @code{convert-to-foreign}; 3543 used to implement the third argument to @code{free-translated-object}. 3544 @end table 3545 3546 @subheading Description 3547 3548 The return value is unspecified. 3549 3550 This is an external interface to the type translation facility. In 3551 the implementation, all foreign functions are ultimately defined as 3552 type translation wrappers around primitive foreign function 3553 invocations. 3554 3555 This function is available mostly for inspection of the type 3556 translation process, and possibly optimization of special cases of 3557 your foreign function calls. 3558 3559 Its behavior is better described under @code{free-translated-object}'s 3560 documentation. 3561 3562 @subheading Examples 3563 3564 @lisp 3565 CFFI-USER> (convert-to-foreign "a boat" :string) 3566 @result{} #<FOREIGN-ADDRESS #x097ACDC0> 3567 @result{} T 3568 CFFI-USER> (free-converted-object * :string t) 3569 @result{} NIL 3570 @end lisp 3571 3572 @subheading See Also 3573 @seealso{convert-from-foreign} @* 3574 @seealso{convert-to-foreign} @* 3575 @seealso{free-translated-object} 3576 3577 3578 @c =================================================================== 3579 @c FREE-TRANSLATED-OBJECT 3580 3581 @c TODO: update 3582 3583 @page 3584 @node free-translated-object, translate-from-foreign, free-converted-object, Foreign Types 3585 @heading free-translated-object 3586 @subheading Syntax 3587 @GenericFunction{free-translated-object value type-name param} 3588 3589 @subheading Arguments and Values 3590 3591 @table @var 3592 @item pointer 3593 The foreign value returned by @code{translate-to-foreign}. 3594 3595 @item type-name 3596 A symbol naming a foreign type defined by @code{defctype}. 3597 3598 @item param 3599 The second value, if any, returned by @code{translate-to-foreign}. 3600 @end table 3601 3602 @subheading Description 3603 This generic function may be specialized by user code to perform 3604 automatic deallocation of foreign objects as they are passed to C 3605 functions. 3606 3607 Any methods defined on this generic function must EQL-specialize the 3608 @var{type-name} parameter on a symbol defined as a foreign type by 3609 the @code{defctype} macro. 3610 3611 @subheading See Also 3612 @seealso{Foreign Type Translators} @* 3613 @seealso{translate-to-foreign} 3614 3615 3616 @c =================================================================== 3617 @c TRANSLATE-FROM-FOREIGN 3618 3619 @c TODO: update 3620 3621 @page 3622 @node translate-from-foreign, translate-to-foreign, free-translated-object, Foreign Types 3623 @heading translate-from-foreign 3624 @subheading Syntax 3625 @GenericFunction{translate-from-foreign foreign-value type-name @ 3626 @res{} lisp-value} 3627 3628 @subheading Arguments and Values 3629 3630 @table @var 3631 @item foreign-value 3632 The foreign value to convert to a Lisp object. 3633 3634 @item type-name 3635 A symbol naming a foreign type defined by @code{defctype}. 3636 3637 @item lisp-value 3638 The lisp value to pass in place of @code{foreign-value} to Lisp code. 3639 @end table 3640 3641 @subheading Description 3642 This generic function is invoked by @cffi{} to convert a foreign value to 3643 a Lisp value, such as when returning from a foreign function, passing 3644 arguments to a callback function, or accessing a foreign variable. 3645 3646 To extend the @cffi{} type system by performing custom translations, this 3647 method may be specialized by @sc{eql}-specializing @code{type-name} on a 3648 symbol naming a foreign type defined with @code{defctype}. This 3649 method should return the appropriate Lisp value to use in place of the 3650 foreign value. 3651 3652 The results are undefined if the @code{type-name} parameter is 3653 specialized in any way except an @sc{eql} specializer on a foreign type 3654 defined with @code{defctype}. Specifically, translations may not be 3655 defined for built-in types. 3656 3657 @subheading See Also 3658 @seealso{Foreign Type Translators} @* 3659 @seealso{translate-to-foreign} @* 3660 @seealso{free-translated-object} 3661 3662 3663 @c =================================================================== 3664 @c TRANSLATE-TO-FOREIGN 3665 3666 @c TODO: update 3667 3668 @page 3669 @node translate-to-foreign, translate-into-foreign-memory, translate-from-foreign, Foreign Types 3670 @heading translate-to-foreign 3671 @subheading Syntax 3672 @GenericFunction{translate-to-foreign lisp-value type-name @ 3673 @res{} foreign-value, alloc-param} 3674 3675 @subheading Arguments and Values 3676 3677 @table @var 3678 @item lisp-value 3679 The Lisp value to convert to foreign representation. 3680 3681 @item type-name 3682 A symbol naming a foreign type defined by @code{defctype}. 3683 3684 @item foreign-value 3685 The foreign value to pass in place of @code{lisp-value} to foreign code. 3686 3687 @item alloc-param 3688 If present, this value will be passed to 3689 @code{free-translated-object}. 3690 @end table 3691 3692 @subheading Description 3693 This generic function is invoked by @cffi{} to convert a Lisp value to a 3694 foreign value, such as when passing arguments to a foreign function, 3695 returning a value from a callback, or setting a foreign variable. A 3696 ``foreign value'' is one appropriate for passing to the next-lowest 3697 translator, including the low-level translators that are ultimately 3698 invoked invisibly with @cffi{}. 3699 3700 To extend the @cffi{} type system by performing custom translations, this 3701 method may be specialized by @sc{eql}-specializing @code{type-name} on a 3702 symbol naming a foreign type defined with @code{defctype}. This 3703 method should return the appropriate foreign value to use in place of 3704 the Lisp value. 3705 3706 In cases where @cffi{} can determine the lifetime of the foreign object 3707 returned by this method, it will invoke @code{free-translated-object} 3708 on the foreign object at the appropriate time. If 3709 @code{translate-to-foreign} returns a second value, it will be passed 3710 as the @code{param} argument to @code{free-translated-object}. This 3711 can be used to establish communication between the allocation and 3712 deallocation methods. 3713 3714 The results are undefined if the @code{type-name} parameter is 3715 specialized in any way except an @sc{eql} specializer on a foreign type 3716 defined with @code{defctype}. Specifically, translations may not be 3717 defined for built-in types. 3718 3719 @subheading See Also 3720 @seealso{Foreign Type Translators} @* 3721 @seealso{translate-from-foreign} @* 3722 @seealso{free-translated-object} 3723 3724 3725 @c =================================================================== 3726 @c TRANSLATE-INTO-FOREIGN-MEMORY 3727 3728 @page 3729 @node translate-into-foreign-memory, with-foreign-slots, translate-to-foreign, Foreign Types 3730 @heading translate-into-foreign-memory 3731 @subheading Syntax 3732 @GenericFunction{translate-into-foreign-memory lisp-value type-name pointer} 3733 3734 @subheading Arguments and Values 3735 3736 @table @var 3737 @item lisp-value 3738 The Lisp value to convert to foreign representation. 3739 3740 @item type-name 3741 A symbol or list @code{(:struct @var{structure-name})} naming a foreign type defined by @code{defctype}. 3742 3743 @item pointer 3744 The foreign pointer where the translated object should be stored. 3745 @end table 3746 3747 @subheading Description 3748 Translate the Lisp value into the foreign memory location given by 3749 pointer. The return value is not used. 3750 3751 @c =================================================================== 3752 @c WITH-FOREIGN-SLOTS 3753 3754 @page 3755 @node with-foreign-slots, , translate-into-foreign-memory, Foreign Types 3756 @heading with-foreign-slots 3757 @subheading Syntax 3758 @Macro{with-foreign-slots (vars ptr type) &body body} 3759 3760 @subheading Arguments and Values 3761 3762 @table @var 3763 @item vars 3764 A list with each element a symbol, or list of length two with the 3765 first element @code{:pointer} and the second a symbol. 3766 3767 @item ptr 3768 A foreign pointer to a structure. 3769 3770 @item type 3771 A structure type. 3772 3773 @item body 3774 A list of forms to be executed. 3775 @end table 3776 3777 @subheading Description 3778 The @code{with-foreign-slots} macro creates local symbol macros for each 3779 var in @var{vars} to reference foreign slots in @var{ptr} of @var{type}. 3780 If the var is a list starting with @code{:pointer}, it will bind the 3781 pointer to the slot (rather than the value). It is similar to Common 3782 Lisp's @code{with-slots} macro. 3783 3784 @subheading Examples 3785 @lisp 3786 (defcstruct tm 3787 (sec :int) 3788 (min :int) 3789 (hour :int) 3790 (mday :int) 3791 (mon :int) 3792 (year :int) 3793 (wday :int) 3794 (yday :int) 3795 (isdst :boolean) 3796 (zone :string) 3797 (gmtoff :long)) 3798 3799 CFFI> (with-foreign-object (time :int) 3800 (setf (mem-ref time :int) 3801 (foreign-funcall "time" :pointer (null-pointer) :int)) 3802 (foreign-funcall "gmtime" :pointer time (:pointer (:struct tm)))) 3803 @result{} #<A Mac Pointer #x102A30> 3804 CFFI> (with-foreign-slots ((sec min hour mday mon year) * (:struct tm)) 3805 (format nil "~A:~A:~A, ~A/~A/~A" 3806 hour min sec (+ 1900 year) mon mday)) 3807 @result{} "7:22:47, 2005/8/2" 3808 @end lisp 3809 3810 @subheading See Also 3811 @seealso{defcstruct} @* 3812 @seealso{defcunion} @* 3813 @seealso{foreign-slot-value} 3814 3815 3816 @c =================================================================== 3817 @c CHAPTER: Pointers 3818 3819 @node Pointers, Strings, Foreign Types, Top 3820 @chapter Pointers 3821 3822 All C data in @cffi{} is referenced through pointers. This includes 3823 defined C variables that hold immediate values, and integers. 3824 3825 To see why this is, consider the case of the C integer. It is not 3826 only an arbitrary representation for an integer, congruent to Lisp's 3827 fixnums; the C integer has a specific bit pattern in memory defined by 3828 the C @acronym{ABI}. Lisp has no such constraint on its fixnums; 3829 therefore, it only makes sense to think of fixnums as C integers if 3830 you assume that @cffi{} converts them when necessary, such as when 3831 storing one for use in a C function call, or as the value of a C 3832 variable. This requires defining an area of memory@footnote{The 3833 definition of @dfn{memory} includes the @acronym{CPU} registers.}, 3834 represented through an effective address, and storing it there. 3835 3836 Due to this compartmentalization, it only makes sense to manipulate 3837 raw C data in Lisp through pointers to it. For example, while there 3838 may be a Lisp representation of a @code{struct} that is converted to C 3839 at store time, you may only manipulate its raw data through a pointer. 3840 The C compiler does this also, albeit informally. 3841 3842 @menu 3843 * Basic Pointer Operations:: 3844 * Allocating Foreign Memory:: 3845 * Accessing Foreign Memory:: 3846 3847 Dictionary 3848 3849 * foreign-free:: 3850 * foreign-alloc:: 3851 * foreign-symbol-pointer:: 3852 * inc-pointer:: 3853 * incf-pointer:: 3854 * make-pointer:: 3855 * mem-aptr:: 3856 * mem-aref:: 3857 * mem-ref:: 3858 * null-pointer:: 3859 * null-pointer-p:: 3860 * pointerp:: 3861 * pointer-address:: 3862 * pointer-eq:: 3863 * with-foreign-object:: 3864 * with-foreign-objects:: 3865 * with-foreign-pointer:: 3866 @end menu 3867 3868 @node Basic Pointer Operations, Allocating Foreign Memory, Pointers, Pointers 3869 @section Basic Pointer Operations 3870 3871 Manipulating pointers proper can be accomplished through most of the 3872 other operations defined in the Pointers dictionary, such as 3873 @code{make-pointer}, @code{pointer-address}, and @code{pointer-eq}. 3874 When using them, keep in mind that they merely manipulate the Lisp 3875 representation of pointers, not the values they point to. 3876 3877 @deftp {Lisp Type} foreign-pointer 3878 The pointers' representations differ from implementation to 3879 implementation and have different types. @code{foreign-pointer} 3880 provides a portable type alias to each of these types. 3881 @end deftp 3882 3883 3884 @node Allocating Foreign Memory, Accessing Foreign Memory, Basic Pointer Operations, Pointers 3885 @section Allocating Foreign Memory 3886 3887 @cffi{} provides support for stack and heap C memory allocation. 3888 Stack allocation, done with @code{with-foreign-object}, is sometimes 3889 called ``dynamic'' allocation in Lisp, because memory allocated as 3890 such has dynamic extent, much as with @code{let} bindings of special 3891 variables. 3892 3893 This should not be confused with what C calls ``dynamic'' allocation, 3894 or that done with @code{malloc} and friends. This sort of heap 3895 allocation is done with @code{foreign-alloc}, creating objects that 3896 exist until freed with @code{foreign-free}. 3897 3898 3899 @node Accessing Foreign Memory, foreign-free, Allocating Foreign Memory, Pointers 3900 @section Accessing Foreign Memory 3901 3902 When manipulating raw C data, consider that all pointers are pointing 3903 to an array. When you only want one C value, such as a single 3904 @code{struct}, this array only has one such value. It is worthwhile 3905 to remember that everything is an array, though, because this is also 3906 the semantic that C imposes natively. 3907 3908 C values are accessed as the @code{setf}-able places defined by 3909 @code{mem-aref} and @code{mem-ref}. Given a pointer and a @cffi{} 3910 type (@pxref{Foreign Types}), either of these will dereference the 3911 pointer, translate the C data there back to Lisp, and return the 3912 result of said translation, performing the reverse operation when 3913 @code{setf}-ing. To decide which one to use, consider whether you 3914 would use the array index operator @code{[@var{n}]} or the pointer 3915 dereference @code{*} in C; use @code{mem-aref} for array indexing and 3916 @code{mem-ref} for pointer dereferencing. 3917 3918 3919 @c =================================================================== 3920 @c FOREIGN-FREE 3921 3922 @page 3923 @node foreign-free, foreign-alloc, Accessing Foreign Memory, Pointers 3924 @heading foreign-free 3925 @subheading Syntax 3926 @Function{foreign-free ptr @res{} undefined} 3927 3928 @subheading Arguments and Values 3929 3930 @table @var 3931 @item ptr 3932 A foreign pointer. 3933 @end table 3934 3935 @subheading Description 3936 The @code{foreign-free} function frees a @code{ptr} previously 3937 allocated by @code{foreign-alloc}. The consequences of freeing a given 3938 pointer twice are undefined. 3939 3940 @subheading Examples 3941 3942 @lisp 3943 CFFI> (foreign-alloc :int) 3944 @result{} #<A Mac Pointer #x1022E0> 3945 CFFI> (foreign-free *) 3946 @result{} NIL 3947 @end lisp 3948 3949 @subheading See Also 3950 @seealso{foreign-alloc} @* 3951 @seealso{with-foreign-pointer} 3952 3953 3954 @c =================================================================== 3955 @c FOREIGN-ALLOC 3956 3957 @page 3958 @node foreign-alloc, foreign-symbol-pointer, foreign-free, Pointers 3959 @heading foreign-alloc 3960 @subheading Syntax 3961 @Function{foreign-alloc type &key initial-element initial-contents (count 1) @ 3962 null-terminated-p @res{} pointer} 3963 3964 @subheading Arguments and Values 3965 3966 @table @var 3967 @item type 3968 A foreign type. 3969 3970 @item initial-element 3971 A Lisp object. 3972 3973 @item initial-contents 3974 A sequence. 3975 3976 @item count 3977 An integer. Defaults to 1 or the length of @var{initial-contents} if 3978 supplied. 3979 3980 @item null-terminated-p 3981 A boolean, false by default. 3982 3983 @item pointer 3984 A foreign pointer to the newly allocated memory. 3985 @end table 3986 3987 @subheading Description 3988 The @code{foreign-alloc} function allocates enough memory to hold 3989 @var{count} objects of type @var{type} and returns a 3990 @var{pointer}. This memory must be explicitly freed using 3991 @code{foreign-free} once it is no longer needed. 3992 3993 If @var{initial-element} is supplied, it is used to initialize the 3994 @var{count} objects the newly allocated memory holds. 3995 3996 If an @var{initial-contents} sequence is supplied, it must have a 3997 length less than or equal to @var{count} and each of its elements 3998 will be used to initialize the contents of the newly allocated 3999 memory. 4000 4001 If @var{count} is omitted and @var{initial-contents} is specified, it 4002 will default to @code{(length @var{initial-contents})}. 4003 4004 @var{initial-element} and @var{initial-contents} are mutually 4005 exclusive. 4006 4007 When @var{null-terminated-p} is true, 4008 @code{(1+ (max @var{count} (length @var{initial-contents})))} elements 4009 are allocated and the last one is set to @code{NULL}. Note that in 4010 this case @var{type} must be a pointer type (ie. a type that 4011 canonicalizes to @code{:pointer}), otherwise an error is signaled. 4012 4013 @subheading Examples 4014 @lisp 4015 CFFI> (foreign-alloc :char) 4016 @result{} #<A Mac Pointer #x102D80> ; @lispcmt{A pointer to 1 byte of memory.} 4017 4018 CFFI> (foreign-alloc :char :count 20) 4019 @result{} #<A Mac Pointer #x1024A0> ; @lispcmt{A pointer to 20 bytes of memory.} 4020 4021 CFFI> (foreign-alloc :int :initial-element 12) 4022 @result{} #<A Mac Pointer #x1028B0> 4023 CFFI> (mem-ref * :int) 4024 @result{} 12 4025 4026 CFFI> (foreign-alloc :int :initial-contents '(1 2 3)) 4027 @result{} #<A Mac Pointer #x102950> 4028 CFFI> (loop for i from 0 below 3 4029 collect (mem-aref * :int i)) 4030 @result{} (1 2 3) 4031 4032 CFFI> (foreign-alloc :int :initial-contents #(1 2 3)) 4033 @result{} #<A Mac Pointer #x102960> 4034 CFFI> (loop for i from 0 below 3 4035 collect (mem-aref * :int i)) 4036 @result{} (1 2 3) 4037 4038 ;;; @lispcmt{Allocate a char** pointer that points to newly allocated memory} 4039 ;;; @lispcmt{by the :string type translator for the string "foo".} 4040 CFFI> (foreign-alloc :string :initial-element "foo") 4041 @result{} #<A Mac Pointer #x102C40> 4042 @end lisp 4043 4044 @lisp 4045 ;;; @lispcmt{Allocate a null-terminated array of strings.} 4046 ;;; @lispcmt{(Note: FOREIGN-STRING-TO-LISP returns NIL when passed a null pointer)} 4047 CFFI> (foreign-alloc :string 4048 :initial-contents '("foo" "bar" "baz") 4049 :null-terminated-p t) 4050 @result{} #<A Mac Pointer #x102D20> 4051 CFFI> (loop for i from 0 below 4 4052 collect (mem-aref * :string i)) 4053 @result{} ("foo" "bar" "baz" NIL) 4054 CFFI> (progn 4055 (dotimes (i 3) 4056 (foreign-free (mem-aref ** :pointer i))) 4057 (foreign-free **)) 4058 @result{} nil 4059 @end lisp 4060 4061 @subheading See Also 4062 @seealso{foreign-free} @* 4063 @seealso{with-foreign-object} @* 4064 @seealso{with-foreign-pointer} 4065 4066 4067 @c =================================================================== 4068 @c FOREIGN-SYMBOL-POINTER 4069 4070 @page 4071 @node foreign-symbol-pointer, inc-pointer, foreign-alloc, Pointers 4072 @heading foreign-symbol-pointer 4073 @subheading Syntax 4074 @Function{foreign-symbol-pointer foreign-name &key library @res{} pointer} 4075 4076 @subheading Arguments and Values 4077 4078 @table @var 4079 @item foreign-name 4080 A string. 4081 4082 @item pointer 4083 A foreign pointer, or @code{nil}. 4084 4085 @item library 4086 A Lisp symbol or an instance of @code{foreign-library}. 4087 @end table 4088 4089 @subheading Description 4090 The function @code{foreign-symbol-pointer} will return a foreign 4091 pointer corresponding to the foreign symbol denoted by the string 4092 @var{foreign-name}. If a foreign symbol named @var{foreign-name} 4093 doesn't exist, @code{nil} is returned. 4094 4095 ABI name manglings will be performed on @var{foreign-name} by 4096 @code{foreign-symbol-pointer} if necessary. (eg: adding a leading 4097 underscore on darwin/ppc) 4098 4099 @var{library} should name a foreign library as defined by 4100 @code{define-foreign-library}, @code{:default} (which is the default) 4101 or an instance of @code{foreign-library} as returned by 4102 @code{load-foreign-library}. 4103 4104 @strong{Important note:} do not keep these pointers across saved Lisp 4105 cores as the foreign-library may move across sessions. 4106 4107 @subheading Examples 4108 4109 @lisp 4110 CFFI> (foreign-symbol-pointer "errno") 4111 @result{} #<A Mac Pointer #xA0008130> 4112 CFFI> (foreign-symbol-pointer "strerror") 4113 @result{} #<A Mac Pointer #x9002D0F8> 4114 CFFI> (foreign-funcall-pointer * () :int (mem-ref ** :int) :string) 4115 @result{} "No such file or directory" 4116 4117 CFFI> (foreign-symbol-pointer "inexistent symbol") 4118 @result{} NIL 4119 @end lisp 4120 4121 @subheading See Also 4122 @seealso{defcvar} 4123 4124 4125 @c =================================================================== 4126 @c INC-POINTER 4127 4128 @page 4129 @node inc-pointer, incf-pointer, foreign-symbol-pointer, Pointers 4130 @heading inc-pointer 4131 @subheading Syntax 4132 @Function{inc-pointer pointer offset @res{} new-pointer} 4133 4134 @subheading Arguments and Values 4135 4136 @table @var 4137 @item pointer 4138 @itemx new-pointer 4139 A foreign pointer. 4140 4141 @item offset 4142 An integer. 4143 @end table 4144 4145 @subheading Description 4146 The function @code{inc-pointer} will return a @var{new-pointer} pointing 4147 @var{offset} bytes past @var{pointer}. 4148 4149 @subheading Examples 4150 4151 @lisp 4152 CFFI> (foreign-string-alloc "Common Lisp") 4153 @result{} #<A Mac Pointer #x102EA0> 4154 CFFI> (inc-pointer * 7) 4155 @result{} #<A Mac Pointer #x102EA7> 4156 CFFI> (foreign-string-to-lisp *) 4157 @result{} "Lisp" 4158 @end lisp 4159 4160 @subheading See Also 4161 @seealso{incf-pointer} @* 4162 @seealso{make-pointer} @* 4163 @seealso{pointerp} @* 4164 @seealso{null-pointer} @* 4165 @seealso{null-pointer-p} 4166 4167 4168 @c =================================================================== 4169 @c INCF-POINTER 4170 4171 @page 4172 @node incf-pointer, make-pointer, inc-pointer, Pointers 4173 @heading incf-pointer 4174 @subheading Syntax 4175 @Macro{incf-pointer place &optional (offset 1) @res{} new-pointer} 4176 4177 @subheading Arguments and Values 4178 4179 @table @var 4180 @item place 4181 A @code{setf} place. 4182 4183 @item new-pointer 4184 A foreign pointer. 4185 4186 @item offset 4187 An integer. 4188 @end table 4189 4190 @subheading Description 4191 The @code{incf-pointer} macro takes the foreign pointer from 4192 @var{place} and creates a @var{new-pointer} incremented by 4193 @var{offset} bytes and which is stored in @var{place}. 4194 4195 @subheading Examples 4196 4197 @lisp 4198 CFFI> (defparameter *two-words* (foreign-string-alloc "Common Lisp")) 4199 @result{} *TWO-WORDS* 4200 CFFI> (defparameter *one-word* *two-words*) 4201 @result{} *ONE-WORD* 4202 CFFI> (incf-pointer *one-word* 7) 4203 @result{} #.(SB-SYS:INT-SAP #X00600457) 4204 CFFI> (foreign-string-to-lisp *one-word*) 4205 @result{} "Lisp" 4206 CFFI> (foreign-string-to-lisp *two-words*) 4207 @result{} "Common Lisp" 4208 @end lisp 4209 4210 @subheading See Also 4211 @seealso{inc-pointer} @* 4212 @seealso{make-pointer} @* 4213 @seealso{pointerp} @* 4214 @seealso{null-pointer} @* 4215 @seealso{null-pointer-p} 4216 4217 4218 @c =================================================================== 4219 @c MAKE-POINTER 4220 4221 @page 4222 @node make-pointer, mem-aptr, incf-pointer, Pointers 4223 @heading make-pointer 4224 @subheading Syntax 4225 @Function{make-pointer address @res{} ptr} 4226 4227 @subheading Arguments and Values 4228 4229 @table @var 4230 @item address 4231 An integer. 4232 4233 @item ptr 4234 A foreign pointer. 4235 @end table 4236 4237 @subheading Description 4238 The function @code{make-pointer} will return a foreign pointer 4239 pointing to @var{address}. 4240 4241 @subheading Examples 4242 4243 @lisp 4244 CFFI> (make-pointer 42) 4245 @result{} #<FOREIGN-ADDRESS #x0000002A> 4246 CFFI> (pointerp *) 4247 @result{} T 4248 CFFI> (pointer-address **) 4249 @result{} 42 4250 CFFI> (inc-pointer *** -42) 4251 @result{} #<FOREIGN-ADDRESS #x00000000> 4252 CFFI> (null-pointer-p *) 4253 @result{} T 4254 CFFI> (typep ** 'foreign-pointer) 4255 @result{} T 4256 @end lisp 4257 4258 @subheading See Also 4259 @seealso{inc-pointer} @* 4260 @seealso{null-pointer} @* 4261 @seealso{null-pointer-p} @* 4262 @seealso{pointerp} @* 4263 @seealso{pointer-address} @* 4264 @seealso{pointer-eq} @* 4265 @seealso{mem-ref} 4266 4267 4268 @c =================================================================== 4269 @c MEM-APTR 4270 4271 @page 4272 @node mem-aptr, mem-aref, make-pointer, Pointers 4273 @heading mem-aptr 4274 @subheading Syntax 4275 @Accessor{mem-aptr ptr type &optional (index 0)} 4276 4277 @subheading Arguments and Values 4278 4279 @table @var 4280 @item ptr 4281 A foreign pointer. 4282 4283 @item type 4284 A foreign type. 4285 4286 @item index 4287 An integer. 4288 4289 @item new-value 4290 A Lisp value compatible with @var{type}. 4291 @end table 4292 4293 @subheading Description 4294 The @code{mem-aptr} function finds the pointer to an element of the array. 4295 4296 @lisp 4297 (mem-aptr ptr type n) 4298 4299 ;; @lispcmt{is identical to:} 4300 4301 (inc-pointer ptr (* n (foreign-type-size type))) 4302 @end lisp 4303 4304 @subheading Examples 4305 4306 @lisp 4307 CFFI> (with-foreign-string (str "Hello, foreign world!") 4308 (mem-aptr str :char 6)) 4309 @result{} #.(SB-SYS:INT-SAP #X0063D4B6) 4310 @end lisp 4311 4312 @c =================================================================== 4313 @c MEM-AREF 4314 4315 @page 4316 @node mem-aref, mem-ref, mem-aptr, Pointers 4317 @heading mem-aref 4318 @subheading Syntax 4319 @Accessor{mem-aref ptr type &optional (index 0)} 4320 4321 (setf (@strong{mem-aref} @emph{ptr type &optional (index 0)) new-value}) 4322 4323 @subheading Arguments and Values 4324 4325 @table @var 4326 @item ptr 4327 A foreign pointer. 4328 4329 @item type 4330 A foreign type. 4331 4332 @item index 4333 An integer. 4334 4335 @item new-value 4336 A Lisp value compatible with @var{type}. 4337 @end table 4338 4339 @subheading Description 4340 The @code{mem-aref} function is similar to @code{mem-ref} but will 4341 automatically calculate the offset from an @var{index}. 4342 4343 @lisp 4344 (mem-aref ptr type n) 4345 4346 ;; @lispcmt{is identical to:} 4347 4348 (mem-ref ptr type (* n (foreign-type-size type))) 4349 @end lisp 4350 4351 @subheading Examples 4352 4353 @lisp 4354 CFFI> (with-foreign-string (str "Hello, foreign world!") 4355 (mem-aref str :char 6)) 4356 @result{} 32 4357 CFFI> (code-char *) 4358 @result{} #\Space 4359 4360 CFFI> (with-foreign-object (array :int 10) 4361 (loop for i below 10 4362 do (setf (mem-aref array :int i) (random 100))) 4363 (loop for i below 10 collect (mem-aref array :int i))) 4364 @result{} (22 7 22 52 69 1 46 93 90 65) 4365 @end lisp 4366 4367 @subheading Compatibility Note 4368 4369 For compatibility with older versions of CFFI, @ref{mem-aref} will 4370 produce a pointer for the deprecated bare structure specification, but 4371 it is consistent with other types for the current specification form 4372 @code{(:struct @var{structure-name})} and provides a Lisp object 4373 translated from the structure (by default a plist). In order to obtain 4374 the pointer, you should use the new function @ref{mem-aptr}. 4375 4376 @subheading See Also 4377 @seealso{mem-ref} @* 4378 @seealso{mem-aptr} 4379 4380 @c =================================================================== 4381 @c MEM-REF 4382 4383 @page 4384 @node mem-ref, null-pointer, mem-aref, Pointers 4385 @heading mem-ref 4386 @subheading Syntax 4387 @Accessor{mem-ref ptr type &optional offset @res{} object} 4388 4389 @subheading Arguments and Values 4390 4391 @table @var 4392 @item ptr 4393 A pointer. 4394 4395 @item type 4396 A foreign type. 4397 4398 @item offset 4399 An integer (in byte units). 4400 4401 @item object 4402 The value @var{ptr} points to. 4403 @end table 4404 4405 @subheading Description 4406 @subheading Examples 4407 4408 @lisp 4409 CFFI> (with-foreign-string (ptr "Saluton") 4410 (setf (mem-ref ptr :char 3) (char-code #\a)) 4411 (loop for i from 0 below 8 4412 collect (code-char (mem-ref ptr :char i)))) 4413 @result{} (#\S #\a #\l #\a #\t #\o #\n #\Null) 4414 CFFI> (setq ptr-to-int (foreign-alloc :int)) 4415 @result{} #<A Mac Pointer #x1047D0> 4416 CFFI> (mem-ref ptr-to-int :int) 4417 @result{} 1054619 4418 CFFI> (setf (mem-ref ptr-to-int :int) 1984) 4419 @result{} 1984 4420 CFFI> (mem-ref ptr-to-int :int) 4421 @result{} 1984 4422 @end lisp 4423 4424 @subheading See Also 4425 @seealso{mem-aref} 4426 4427 4428 @c =================================================================== 4429 @c NULL-POINTER 4430 4431 @page 4432 @node null-pointer, null-pointer-p, mem-ref, Pointers 4433 @heading null-pointer 4434 @subheading Syntax 4435 @Function{null-pointer @res{} pointer} 4436 4437 @subheading Arguments and Values 4438 4439 @table @var 4440 @item pointer 4441 A @code{NULL} pointer. 4442 @end table 4443 4444 @subheading Description 4445 The function @code{null-pointer} returns a null pointer. 4446 4447 @subheading Examples 4448 4449 @lisp 4450 CFFI> (null-pointer) 4451 @result{} #<A Null Mac Pointer> 4452 CFFI> (pointerp *) 4453 @result{} T 4454 @end lisp 4455 4456 @subheading See Also 4457 @seealso{null-pointer-p} @* 4458 @seealso{make-pointer} 4459 4460 4461 @c =================================================================== 4462 @c NULL-POINTER-P 4463 4464 @page 4465 @node null-pointer-p, pointerp, null-pointer, Pointers 4466 @heading null-pointer-p 4467 @subheading Syntax 4468 @Function{null-pointer-p ptr @res{} boolean} 4469 4470 @subheading Arguments and Values 4471 4472 @table @var 4473 @item ptr 4474 A foreign pointer that may be a null pointer. 4475 4476 @item boolean 4477 @code{T} or @code{NIL}. 4478 @end table 4479 4480 @subheading Description 4481 The function @code{null-pointer-p} returns true if @var{ptr} is a null 4482 pointer and false otherwise. 4483 4484 @subheading Examples 4485 4486 @lisp 4487 CFFI> (null-pointer-p (null-pointer)) 4488 @result{} T 4489 @end lisp 4490 4491 @lisp 4492 (defun contains-str-p (big little) 4493 (not (null-pointer-p 4494 (foreign-funcall "strstr" :string big :string little :pointer)))) 4495 4496 CFFI> (contains-str-p "Popcorns" "corn") 4497 @result{} T 4498 CFFI> (contains-str-p "Popcorns" "salt") 4499 @result{} NIL 4500 @end lisp 4501 4502 @subheading See Also 4503 @seealso{null-pointer} @* 4504 @seealso{pointerp} 4505 4506 4507 @c =================================================================== 4508 @c POINTERP 4509 4510 @page 4511 @node pointerp, pointer-address, null-pointer-p, Pointers 4512 @heading pointerp 4513 @subheading Syntax 4514 @Function{pointerp ptr @res{} boolean} 4515 4516 @subheading Arguments and Values 4517 4518 @table @var 4519 @item ptr 4520 An object that may be a foreign pointer. 4521 4522 @item boolean 4523 @code{T} or @code{NIL}. 4524 @end table 4525 4526 @subheading Description 4527 The function @code{pointerp} returns true if @var{ptr} is a foreign 4528 pointer and false otherwise. 4529 4530 @subheading Implementation-specific Notes 4531 In Allegro CL, foreign pointers are integers thus in this 4532 implementation @code{pointerp} will return true for any ordinary integer. 4533 4534 @subheading Examples 4535 4536 @lisp 4537 CFFI> (foreign-alloc 32) 4538 @result{} #<A Mac Pointer #x102D20> 4539 CFFI> (pointerp *) 4540 @result{} T 4541 CFFI> (pointerp "this is not a pointer") 4542 @result{} NIL 4543 @end lisp 4544 4545 @subheading See Also 4546 @seealso{make-pointer} 4547 @seealso{null-pointer-p} 4548 4549 4550 @c =================================================================== 4551 @c POINTER-ADDRESS 4552 4553 @page 4554 @node pointer-address, pointer-eq, pointerp, Pointers 4555 @heading pointer-address 4556 @subheading Syntax 4557 @Function{pointer-address ptr @res{} address} 4558 4559 @subheading Arguments and Values 4560 4561 @table @var 4562 @item ptr 4563 A foreign pointer. 4564 4565 @item address 4566 An integer. 4567 @end table 4568 4569 @subheading Description 4570 The function @code{pointer-address} will return the @var{address} of 4571 a foreign pointer @var{ptr}. 4572 4573 @subheading Examples 4574 4575 @lisp 4576 CFFI> (pointer-address (null-pointer)) 4577 @result{} 0 4578 CFFI> (pointer-address (make-pointer 123)) 4579 @result{} 123 4580 @end lisp 4581 4582 @subheading See Also 4583 @seealso{make-pointer} @* 4584 @seealso{inc-pointer} @* 4585 @seealso{null-pointer} @* 4586 @seealso{null-pointer-p} @* 4587 @seealso{pointerp} @* 4588 @seealso{pointer-eq} @* 4589 @seealso{mem-ref} 4590 4591 4592 @c =================================================================== 4593 @c POINTER-EQ 4594 4595 @page 4596 @node pointer-eq, with-foreign-object, pointer-address, Pointers 4597 @heading pointer-eq 4598 @subheading Syntax 4599 @Function{pointer-eq ptr1 ptr2 @res{} boolean} 4600 4601 @subheading Arguments and Values 4602 4603 @table @var 4604 @item ptr1 4605 @itemx ptr2 4606 A foreign pointer. 4607 4608 @item boolean 4609 @code{T} or @code{NIL}. 4610 @end table 4611 4612 @subheading Description 4613 The function @code{pointer-eq} returns true if @var{ptr1} and 4614 @var{ptr2} point to the same memory address and false otherwise. 4615 4616 @subheading Implementation-specific Notes 4617 The representation of foreign pointers varies across the various Lisp 4618 implementations as does the behaviour of the built-in Common Lisp 4619 equality predicates. Comparing two pointers that point to the same 4620 address with @code{EQ} Lisps will return true on some Lisps, others require 4621 more general predicates like @code{EQL} or @code{EQUALP} and finally 4622 some will return false using any of these predicates. Therefore, for 4623 portability, you should use @code{POINTER-EQ}. 4624 4625 @subheading Examples 4626 This is an example using @acronym{SBCL}, see the 4627 implementation-specific notes above. 4628 4629 @lisp 4630 CFFI> (eql (null-pointer) (null-pointer)) 4631 @result{} NIL 4632 CFFI> (pointer-eq (null-pointer) (null-pointer)) 4633 @result{} T 4634 @end lisp 4635 4636 @subheading See Also 4637 @seealso{inc-pointer} 4638 4639 4640 @c =================================================================== 4641 @c WITH-FOREIGN-OBJECT 4642 4643 @page 4644 @node with-foreign-object, with-foreign-pointer, pointer-eq, Pointers 4645 @heading with-foreign-object, with-foreign-objects 4646 @subheading Syntax 4647 @Macro{with-foreign-object (var type &optional count) &body body} 4648 4649 @anchor{with-foreign-objects} 4650 @Macro{with-foreign-objects (bindings) &body body} 4651 4652 bindings ::= @{(var type &optional count)@}* 4653 4654 @subheading Arguments and Values 4655 4656 @table @var 4657 @item var 4658 A symbol. 4659 4660 @item type 4661 A foreign type, evaluated. 4662 4663 @item count 4664 An integer. 4665 @end table 4666 4667 @subheading Description 4668 The macros @code{with-foreign-object} and @code{with-foreign-objects} 4669 bind @var{var} to a pointer to @var{count} newly allocated objects 4670 of type @var{type} during @var{body}. The buffer has dynamic extent 4671 and may be stack allocated if supported by the host Lisp. 4672 4673 @subheading Examples 4674 4675 @lisp 4676 CFFI> (with-foreign-object (array :int 10) 4677 (dotimes (i 10) 4678 (setf (mem-aref array :int i) (random 100))) 4679 (loop for i below 10 4680 collect (mem-aref array :int i))) 4681 @result{} (22 7 22 52 69 1 46 93 90 65) 4682 @end lisp 4683 4684 @subheading See Also 4685 @seealso{foreign-alloc} 4686 4687 4688 @c =================================================================== 4689 @c WITH-FOREIGN-POINTER 4690 4691 @page 4692 @node with-foreign-pointer, , with-foreign-object, Pointers 4693 @heading with-foreign-pointer 4694 @subheading Syntax 4695 @Macro{with-foreign-pointer (var size &optional size-var) &body body} 4696 4697 @subheading Arguments and Values 4698 4699 @table @var 4700 @item var 4701 @itemx size-var 4702 A symbol. 4703 4704 @item size 4705 An integer. 4706 4707 @item body 4708 A list of forms to be executed. 4709 @end table 4710 4711 @subheading Description 4712 The @code{with-foreign-pointer} macro, binds @var{var} to @var{size} 4713 bytes of foreign memory during @var{body}. The pointer in @var{var} 4714 is invalid beyond the dynamic extend of @var{body} and may be 4715 stack-allocated if supported by the implementation. 4716 4717 If @var{size-var} is supplied, it will be bound to @var{size} during 4718 @var{body}. 4719 4720 @subheading Examples 4721 4722 @lisp 4723 CFFI> (with-foreign-pointer (string 4 size) 4724 (setf (mem-ref string :char (1- size)) 0) 4725 (lisp-string-to-foreign "Popcorns" string size) 4726 (loop for i from 0 below size 4727 collect (code-char (mem-ref string :char i)))) 4728 @result{} (#\P #\o #\p #\Null) 4729 @end lisp 4730 4731 @subheading See Also 4732 @seealso{foreign-alloc} @* 4733 @seealso{foreign-free} 4734 4735 4736 @c =================================================================== 4737 @c CHAPTER: Strings 4738 4739 @node Strings, Variables, Pointers, Top 4740 @chapter Strings 4741 4742 As with many languages, Lisp and C have special support for logical 4743 arrays of characters, going so far as to give them a special name, 4744 ``strings''. In that spirit, @cffi{} provides special support for 4745 translating between Lisp and C strings. 4746 4747 The @code{:string} type and the symbols related below also serve as an 4748 example of what you can do portably with @cffi{}; were it not 4749 included, you could write an equally functional @file{strings.lisp} 4750 without referring to any implementation-specific symbols. 4751 4752 @menu 4753 Dictionary 4754 4755 * *default-foreign-encoding*:: 4756 * foreign-string-alloc:: 4757 * foreign-string-free:: 4758 * foreign-string-to-lisp:: 4759 * lisp-string-to-foreign:: 4760 * with-foreign-string:: 4761 * with-foreign-strings:: 4762 * with-foreign-pointer-as-string:: 4763 @end menu 4764 4765 4766 @c =================================================================== 4767 @c *DEFAULT-FOREIGN-ENCODING* 4768 4769 @page 4770 @node *default-foreign-encoding*, foreign-string-alloc, Strings, Strings 4771 @heading *default-foreign-encoding* 4772 @subheading Syntax 4773 4774 @Variable{*default-foreign-encoding*} 4775 4776 @subheading Value type 4777 4778 A keyword. 4779 4780 @subheading Initial value 4781 4782 @code{:utf-8} 4783 4784 @subheading Description 4785 4786 This special variable holds the default foreign encoding. 4787 4788 @subheading Examples 4789 4790 @lisp 4791 CFFI> *default-foreign-encoding* 4792 :utf-8 4793 CFFI> (foreign-funcall "strdup" (:string :encoding :utf-16) "foo" :string) 4794 "f" 4795 CFFI> (let ((*default-foreign-encoding* :utf-16)) 4796 (foreign-funcall "strdup" (:string :encoding :utf-16) "foo" :string)) 4797 "foo" 4798 @end lisp 4799 4800 @subheading See also 4801 4802 @seealso{Other Types} (@code{:string} type) @* 4803 @seealso{foreign-string-alloc} @* 4804 @seealso{foreign-string-to-lisp} @* 4805 @seealso{lisp-string-to-foreign} @* 4806 @seealso{with-foreign-string} @* 4807 @seealso{with-foreign-pointer-as-string} 4808 4809 4810 @c =================================================================== 4811 @c FOREIGN-STRING-ALLOC 4812 4813 @page 4814 @node foreign-string-alloc, foreign-string-free, *default-foreign-encoding*, Strings 4815 @heading foreign-string-alloc 4816 @subheading Syntax 4817 @Function{foreign-string-alloc string &key encoding null-terminated-p @ 4818 start end @res{} pointer} 4819 4820 @subheading Arguments and Values 4821 4822 @table @emph 4823 @item @var{string} 4824 A Lisp string. 4825 4826 @item @var{encoding} 4827 Foreign encoding. Defaults to @code{*default-foreign-encoding*}. 4828 4829 @item @var{null-terminated-p} 4830 Boolean, defaults to true. 4831 4832 @item @var{start}, @var{end} 4833 Bounding index designators of @var{string}. 0 and @code{nil}, by 4834 default. 4835 4836 @item @var{pointer} 4837 A pointer to the newly allocated foreign string. 4838 @end table 4839 4840 @subheading Description 4841 The @code{foreign-string-alloc} function allocates foreign memory 4842 holding a copy of @var{string} converted using the specified 4843 @var{encoding}. @var{Start} specifies an offset into @var{string} and 4844 @var{end} marks the position following the last element of the foreign 4845 string. 4846 4847 This string must be freed with @code{foreign-string-free}. 4848 4849 If @var{null-terminated-p} is false, the string will not be 4850 null-terminated. 4851 4852 @subheading Examples 4853 4854 @lisp 4855 CFFI> (defparameter *str* (foreign-string-alloc "Hello, foreign world!")) 4856 @result{} #<FOREIGN-ADDRESS #x00400560> 4857 CFFI> (foreign-funcall "strlen" :pointer *str* :int) 4858 @result{} 21 4859 @end lisp 4860 4861 @subheading See Also 4862 @seealso{foreign-string-free} @* 4863 @seealso{with-foreign-string} 4864 @c @seealso{:string} 4865 4866 4867 @c =================================================================== 4868 @c FOREIGN-STRING-FREE 4869 4870 @page 4871 @node foreign-string-free, foreign-string-to-lisp, foreign-string-alloc, Strings 4872 @heading foreign-string-free 4873 @subheading Syntax 4874 @Function{foreign-string-free pointer} 4875 4876 @subheading Arguments and Values 4877 4878 @table @var 4879 @item pointer 4880 A pointer to a string allocated by @code{foreign-string-alloc}. 4881 @end table 4882 4883 @subheading Description 4884 The @code{foreign-string-free} function frees a foreign string 4885 allocated by @code{foreign-string-alloc}. 4886 4887 @subheading Examples 4888 4889 @subheading See Also 4890 @seealso{foreign-string-alloc} 4891 4892 4893 @c =================================================================== 4894 @c FOREIGN-STRING-TO-LISP 4895 4896 @page 4897 @node foreign-string-to-lisp, lisp-string-to-foreign, foreign-string-free, Strings 4898 @heading foreign-string-to-lisp 4899 @subheading Syntax 4900 @Function{foreign-string-to-lisp ptr &key offset count max-chars @ 4901 encoding @res{} string} 4902 4903 @subheading Arguments and Values 4904 4905 @table @var 4906 @item ptr 4907 A pointer. 4908 4909 @item offset 4910 An integer greater than or equal to 0. Defauls to 0. 4911 4912 @item count 4913 Either @code{nil} (the default), or an integer greater than or equal to 0. 4914 4915 @item max-chars 4916 An integer greater than or equal to 0. 4917 @code{(1- array-total-size-limit)}, by default. 4918 4919 @item encoding 4920 Foreign encoding. Defaults to @code{*default-foreign-encoding*}. 4921 4922 @item string 4923 A Lisp string. 4924 @end table 4925 4926 @subheading Description 4927 The @code{foreign-string-to-lisp} function converts at most 4928 @var{count} octets from @var{ptr} into a Lisp string, using the 4929 defined @var{encoding}. 4930 4931 If @var{count} is @code{nil} (the default), characters are copied 4932 until @var{max-chars} is reached or a @code{NULL} character is found. 4933 4934 If @var{ptr} is a null pointer, returns @code{nil}. 4935 4936 Note that the @code{:string} type will automatically convert between 4937 Lisp strings and foreign strings. 4938 4939 @subheading Examples 4940 4941 @lisp 4942 CFFI> (foreign-funcall "getenv" :string "HOME" :pointer) 4943 @result{} #<FOREIGN-ADDRESS #xBFFFFFD5> 4944 CFFI> (foreign-string-to-lisp *) 4945 @result{} "/Users/luis" 4946 @end lisp 4947 4948 @subheading See Also 4949 @seealso{lisp-string-to-foreign} @* 4950 @seealso{foreign-string-alloc} 4951 @c @seealso{:string} 4952 4953 4954 @c =================================================================== 4955 @c LISP-STRING-TO-FOREIGN 4956 4957 @page 4958 @node lisp-string-to-foreign, with-foreign-string, foreign-string-to-lisp, Strings 4959 @heading lisp-string-to-foreign 4960 @subheading Syntax 4961 @Function{lisp-string-to-foreign string buffer bufsize &key start @ 4962 end offset encoding @res{} buffer} 4963 4964 @subheading Arguments and Values 4965 4966 @table @emph 4967 @item @var{string} 4968 A Lisp string. 4969 4970 @item @var{buffer} 4971 A foreign pointer. 4972 4973 @item @var{bufsize} 4974 An integer. 4975 4976 @item @var{start}, @var{end} 4977 Bounding index designators of @var{string}. 0 and @code{nil}, by 4978 default. 4979 4980 @item @var{offset} 4981 An integer greater than or equal to 0. Defauls to 0. 4982 4983 @item @var{encoding} 4984 Foreign encoding. Defaults to @code{*default-foreign-encoding*}. 4985 @end table 4986 4987 @subheading Description 4988 The @code{lisp-string-to-foreign} function copies at most 4989 @var{bufsize}-1 octets from a Lisp @var{string} using the specified 4990 @var{encoding} into @var{buffer}+@var{offset}. The foreign string will 4991 be null-terminated. 4992 4993 @var{Start} specifies an offset into @var{string} and 4994 @var{end} marks the position following the last element of the foreign 4995 string. 4996 4997 @subheading Examples 4998 4999 @lisp 5000 CFFI> (with-foreign-pointer-as-string (str 255) 5001 (lisp-string-to-foreign "Hello, foreign world!" str 6)) 5002 @result{} "Hello" 5003 @end lisp 5004 5005 @subheading See Also 5006 @seealso{foreign-string-alloc} @* 5007 @seealso{foreign-string-to-lisp} @* 5008 @seealso{with-foreign-pointer-as-string} 5009 5010 5011 @c =================================================================== 5012 @c WITH-FOREIGN-STRING 5013 5014 @page 5015 @node with-foreign-string, with-foreign-pointer-as-string, lisp-string-to-foreign, Strings 5016 @heading with-foreign-string, with-foreign-strings 5017 @subheading Syntax 5018 @Macro{with-foreign-string (var-or-vars string &rest args) &body body} 5019 5020 @anchor{with-foreign-strings} 5021 @Macro{with-foreign-strings (bindings) &body body} 5022 5023 var-or-vars ::= var | (var &optional octet-size-var) 5024 bindings ::= @{(var-or-vars string &rest args)@}* 5025 5026 @subheading Arguments and Values 5027 5028 @table @emph 5029 @item @var{var}, @var{byte-size-var} 5030 A symbol. 5031 5032 @item @var{string} 5033 A Lisp string. 5034 5035 @item @var{body} 5036 A list of forms to be executed. 5037 @end table 5038 5039 @subheading Description 5040 The @code{with-foreign-string} macro will bind @var{var} to a newly 5041 allocated foreign string containing @var{string}. @var{Args} is passed 5042 to the underlying @code{foreign-string-alloc} call. 5043 5044 If @var{octet-size-var} is provided, it will be bound the length of 5045 foreign string in octets including the null terminator. 5046 5047 @subheading Examples 5048 5049 @lisp 5050 CFFI> (with-foreign-string (foo "12345") 5051 (foreign-funcall "strlen" :pointer foo :int)) 5052 @result{} 5 5053 5054 CFFI> (let ((array (coerce #(84 117 114 97 110 103 97) 5055 '(array (unsigned-byte 8))))) 5056 (with-foreign-string (foreign-string array) 5057 (foreign-string-to-lisp foreign-string))) 5058 @result{} "Turanga" 5059 @end lisp 5060 5061 @subheading See Also 5062 @seealso{foreign-string-alloc} @* 5063 @seealso{with-foreign-pointer-as-string} 5064 5065 5066 @c =================================================================== 5067 @c WITH-FOREIGN-POINTER-AS-STRING 5068 5069 @page 5070 @node with-foreign-pointer-as-string, , with-foreign-string, Strings 5071 @heading with-foreign-pointer-as-string 5072 @subheading Syntax 5073 @Macro{with-foreign-pointer-as-string (var size &optional size-var @ 5074 &rest args) &body body @res{} string} 5075 5076 @subheading Arguments and Values 5077 5078 @table @var 5079 @item var 5080 A symbol. 5081 5082 @item string 5083 A Lisp string. 5084 5085 @item body 5086 List of forms to be executed. 5087 @end table 5088 5089 @subheading Description 5090 The @code{with-foreign-pointer-as-string} macro is similar to 5091 @code{with-foreign-pointer} except that @var{var} is used as the 5092 returned value of an implicit @code{progn} around @var{body}, after 5093 being converted to a Lisp string using the provided @var{args}. 5094 5095 @subheading Examples 5096 5097 @lisp 5098 CFFI> (with-foreign-pointer-as-string (str 6 str-size :encoding :ascii) 5099 (lisp-string-to-foreign "Hello, foreign world!" str str-size)) 5100 @result{} "Hello" 5101 @end lisp 5102 5103 @subheading See Also 5104 @seealso{foreign-string-alloc} @* 5105 @seealso{with-foreign-string} 5106 5107 5108 @c =================================================================== 5109 @c CHAPTER: Variables 5110 5111 @node Variables, Functions, Strings, Top 5112 @chapter Variables 5113 5114 @menu 5115 Dictionary 5116 5117 * defcvar:: 5118 * get-var-pointer:: 5119 @end menu 5120 5121 5122 @c =================================================================== 5123 @c DEFCVAR 5124 5125 @page 5126 @node defcvar, get-var-pointer, Variables, Variables 5127 @heading defcvar 5128 @subheading Syntax 5129 @Macro{defcvar name-and-options type &optional documentation @res{} lisp-name} 5130 5131 @var{name-and-options} ::= name | (name &key read-only (library :default)) @* 5132 @var{name} ::= lisp-name [foreign-name] | foreign-name [lisp-name] 5133 5134 @subheading Arguments and Values 5135 5136 @table @var 5137 @item foreign-name 5138 A string denoting a foreign function. 5139 5140 @item lisp-name 5141 A symbol naming the Lisp function to be created. 5142 5143 @item type 5144 A foreign type. 5145 5146 @item read-only 5147 A boolean. 5148 5149 @item documentation 5150 A Lisp string; not evaluated. 5151 @end table 5152 5153 @subheading Description 5154 The @code{defcvar} macro defines a symbol macro @var{lisp-name} that looks 5155 up @var{foreign-name} and dereferences it acording to @var{type}. It 5156 can also be @code{setf}ed, unless @var{read-only} is true, in which 5157 case an error will be signaled. 5158 5159 When one of @var{lisp-name} or @var{foreign-name} is omitted, the 5160 other is automatically derived using the following rules: 5161 5162 @itemize 5163 @item 5164 Foreign names are converted to Lisp names by uppercasing, replacing 5165 underscores with hyphens, and wrapping around asterisks. 5166 @item 5167 Lisp names are converted to foreign names by lowercasing, replacing 5168 hyphens with underscores, and removing asterisks, if any. 5169 @end itemize 5170 5171 @subheading Examples 5172 5173 @lisp 5174 CFFI> (defcvar "errno" :int) 5175 @result{} *ERRNO* 5176 CFFI> (foreign-funcall "strerror" :int *errno* :string) 5177 @result{} "Inappropriate ioctl for device" 5178 CFFI> (setf *errno* 1) 5179 @result{} 1 5180 CFFI> (foreign-funcall "strerror" :int *errno* :string) 5181 @result{} "Operation not permitted" 5182 @end lisp 5183 5184 Trying to modify a read-only foreign variable: 5185 5186 @lisp 5187 CFFI> (defcvar ("errno" +error-number+ :read-only t) :int) 5188 @result{} +ERROR-NUMBER+ 5189 CFFI> (setf +error-number+ 12) 5190 ;; @lispcmt{@error{} Trying to modify read-only foreign var: +ERROR-NUMBER+.} 5191 @end lisp 5192 5193 @emph{Note that accessing @code{errno} this way won't work with every 5194 implementation of the C standard library.} 5195 5196 @subheading See Also 5197 @seealso{get-var-pointer} 5198 5199 5200 @c =================================================================== 5201 @c GET-VAR-POINTER 5202 5203 @page 5204 @node get-var-pointer, , defcvar, Variables 5205 @heading get-var-pointer 5206 @subheading Syntax 5207 @Function{get-var-pointer symbol @res{} pointer} 5208 5209 @subheading Arguments and Values 5210 5211 @table @var 5212 @item symbol 5213 A symbol denoting a foreign variable defined with @code{defcvar}. 5214 5215 @item pointer 5216 A foreign pointer. 5217 @end table 5218 5219 @subheading Description 5220 The function @code{get-var-pointer} will return a @var{pointer} to the 5221 foreign global variable @var{symbol} previously defined with 5222 @code{defcvar}. 5223 5224 @subheading Examples 5225 5226 @lisp 5227 CFFI> (defcvar "errno" :int :read-only t) 5228 @result{} *ERRNO* 5229 CFFI> *errno* 5230 @result{} 25 5231 CFFI> (get-var-pointer '*errno*) 5232 @result{} #<A Mac Pointer #xA0008130> 5233 CFFI> (mem-ref * :int) 5234 @result{} 25 5235 @end lisp 5236 5237 @subheading See Also 5238 @seealso{defcvar} 5239 5240 5241 @c =================================================================== 5242 @c CHAPTER: Functions 5243 5244 @node Functions, Libraries, Variables, Top 5245 @chapter Functions 5246 5247 @menu 5248 @c * Defining Foreign Functions:: 5249 @c * Calling Foreign Functions:: 5250 5251 Dictionary 5252 5253 * defcfun:: 5254 * foreign-funcall:: 5255 * foreign-funcall-pointer:: 5256 * foreign-funcall-varargs:: 5257 * foreign-funcall-pointer-varargs:: 5258 * translate-camelcase-name:: 5259 * translate-name-from-foreign:: 5260 * translate-name-to-foreign:: 5261 * translate-underscore-separated-name:: 5262 @end menu 5263 5264 @c @node Calling Foreign Functions 5265 @c @section Calling Foreign Functions 5266 5267 @c @node Defining Foreign Functions 5268 @c @section Defining Foreign Functions 5269 5270 5271 @c =================================================================== 5272 @c DEFCFUN 5273 5274 @page 5275 @node defcfun, foreign-funcall, Functions, Functions 5276 @heading defcfun 5277 @subheading Syntax 5278 @Macro{defcfun name-and-options return-type &body [docstring] arguments [&rest] @ 5279 @res{} lisp-name} 5280 5281 @var{name-and-options} ::= @var{name} | (@var{name} &key @var{library} @var{convention}) @* 5282 @var{name} ::= @var{lisp-name} [@var{foreign-name}] | @var{foreign-name} [@var{lisp-name}] @* 5283 @var{arguments} ::= @{ (@var{arg-name} @var{arg-type}) @}* @* 5284 5285 @subheading Arguments and Values 5286 5287 @table @var 5288 @item foreign-name 5289 A string denoting a foreign function. 5290 5291 @item lisp-name 5292 A symbol naming the Lisp function to be created. 5293 5294 @item arg-name 5295 A symbol. 5296 5297 @item return-type 5298 @itemx arg-type 5299 A foreign type. 5300 5301 @item convention 5302 One of @code{:cdecl} (default) or @code{:stdcall}. 5303 5304 @item library 5305 A symbol designating a foreign library. 5306 5307 @item docstring 5308 A documentation string. 5309 @end table 5310 5311 @subheading Description 5312 The @code{defcfun} macro provides a declarative interface for defining 5313 Lisp functions that call foreign functions. 5314 5315 When one of @var{lisp-name} or @var{foreign-name} is omitted, the 5316 other is automatically derived using the following rules: 5317 5318 @itemize 5319 @item 5320 Foreign names are converted to Lisp names by uppercasing and replacing 5321 underscores with hyphens. 5322 @item 5323 Lisp names are converted to foreign names by lowercasing and replacing 5324 hyphens with underscores. 5325 @end itemize 5326 5327 If you place the symbol @code{&rest} in the end of the argument list 5328 after the fixed arguments, @code{defcfun} will treat the foreign 5329 function as a @strong{variadic function}. The variadic arguments 5330 should be passed in a way similar to what @code{foreign-funcall} would 5331 expect. Unlike @code{foreign-funcall} though, @code{defcfun} will take 5332 care of doing argument promotion. Note that in this case 5333 @code{defcfun} will generate a Lisp @emph{macro} instead of a 5334 function and will only work for Lisps that support 5335 @code{foreign-funcall.} 5336 5337 If a foreign structure is to be passed or returned by value (that is, 5338 the type is of the form @code{(:struct ...)}), then the cffi-libffi system 5339 must be loaded, which in turn depends on 5340 @uref{http://sourceware.org/libffi/,libffi}, including the header files. 5341 Failure to load that system will result in an error. 5342 Variadic functions cannot at present accept or return structures by 5343 value. 5344 5345 @subheading Examples 5346 5347 @lisp 5348 (defcfun "strlen" :int 5349 "Calculate the length of a string." 5350 (n :string)) 5351 5352 CFFI> (strlen "123") 5353 @result{} 3 5354 @end lisp 5355 5356 @lisp 5357 (defcfun ("abs" c-abs) :int (n :int)) 5358 5359 CFFI> (c-abs -42) 5360 @result{} 42 5361 @end lisp 5362 5363 Function without arguments: 5364 5365 @lisp 5366 (defcfun "rand" :int) 5367 5368 CFFI> (rand) 5369 @result{} 1804289383 5370 @end lisp 5371 5372 Variadic function example: 5373 5374 @lisp 5375 (defcfun "sprintf" :int 5376 (str :pointer) 5377 (control :string) 5378 &rest) 5379 5380 CFFI> (with-foreign-pointer-as-string (s 100) 5381 (sprintf s "%c %d %.2f %s" :char 90 :short 42 :float pi 5382 :string "super-locrian")) 5383 @result{} "A 42 3.14 super-locrian" 5384 @end lisp 5385 5386 @subheading See Also 5387 @seealso{foreign-funcall} @* 5388 @seealso{foreign-funcall-pointer} @* 5389 @seealso{foreign-funcall-varargs} @* 5390 @seealso{foreign-funcall-pointer-varargs} 5391 5392 5393 @c =================================================================== 5394 @c FOREIGN-FUNCALL 5395 5396 @page 5397 @node foreign-funcall, foreign-funcall-pointer, defcfun, Functions 5398 @heading foreign-funcall 5399 @subheading Syntax 5400 @Macro{foreign-funcall name-and-options &rest arguments @res{} return-value} 5401 5402 @var{arguments} ::= @{ @var{arg-type} @var{arg} @}* [@var{return-type}] @* 5403 @var{name-and-options} ::= @var{name} | (@var{name} &key @var{library} @var{convention}) @* 5404 5405 @subheading Arguments and Values 5406 5407 @table @var 5408 @item name 5409 A Lisp string. 5410 5411 @item arg-type 5412 A foreign type. 5413 5414 @item arg 5415 An argument of type @var{arg-type}. 5416 5417 @item return-type 5418 A foreign type, @code{:void} by default. 5419 5420 @item return-value 5421 A lisp object. 5422 5423 @item library 5424 A lisp symbol; not evaluated. 5425 5426 @item convention 5427 One of @code{:cdecl} (default) or @code{:stdcall}. 5428 @end table 5429 5430 @subheading Description 5431 The @code{foreign-funcall} macro is the main primitive for calling 5432 foreign functions. 5433 5434 If a foreign structure is to be passed or returned by value (that is, 5435 the type is of the form @code{(:struct ...)}), then the cffi-libffi system 5436 must be loaded, which in turn depends on 5437 @uref{http://sourceware.org/libffi/,libffi}, including the header files. 5438 Failure to load that system will result in an error. 5439 Variadic functions cannot at present accept or return structures by 5440 value. 5441 5442 @emph{Note: The return value of foreign-funcall on functions with a 5443 :void return type is still undefined.} 5444 5445 @subheading Implementation-specific Notes 5446 @itemize 5447 @item 5448 Corman Lisp does not support @code{foreign-funcall}. On 5449 implementations that @strong{don't} support @code{foreign-funcall} 5450 @code{cffi-sys::no-foreign-funcall} will be present in 5451 @code{*features*}. Note: in these Lisps you can still use the 5452 @code{defcfun} interface. 5453 @end itemize 5454 5455 @subheading Examples 5456 5457 @lisp 5458 CFFI> (foreign-funcall "strlen" :string "foo" :int) 5459 @result{} 3 5460 @end lisp 5461 5462 Given the C code: 5463 5464 @example 5465 void print_number(int n) 5466 @{ 5467 printf("N: %d\n", n); 5468 @} 5469 @end example 5470 5471 @lisp 5472 CFFI> (foreign-funcall "print_number" :int 123456) 5473 @print{} N: 123456 5474 @result{} NIL 5475 @end lisp 5476 5477 @noindent 5478 Or, equivalently: 5479 5480 @lisp 5481 CFFI> (foreign-funcall "print_number" :int 123456 :void) 5482 @print{} N: 123456 5483 @result{} NIL 5484 @end lisp 5485 5486 @lisp 5487 CFFI> (foreign-funcall "printf" :string (format nil "%s: %d.~%") 5488 :string "So long and thanks for all the fish" 5489 :int 42 :int) 5490 @print{} So long and thanks for all the fish: 42. 5491 @result{} 41 5492 @end lisp 5493 5494 @subheading See Also 5495 @seealso{defcfun} @* 5496 @seealso{foreign-funcall-pointer} 5497 5498 5499 @c =================================================================== 5500 @c FOREIGN-FUNCALL-POINTER 5501 5502 @page 5503 @node foreign-funcall-pointer, foreign-funcall-varargs, foreign-funcall, Functions 5504 @heading foreign-funcall-pointer 5505 @subheading Syntax 5506 @Macro{foreign-funcall-pointer pointer options &rest arguments @res{} return-value} 5507 5508 @var{arguments} ::= @{ @var{arg-type} @var{arg} @}* [@var{return-type}] @* 5509 @var{options} ::= (&key @var{convention}) @* 5510 5511 @subheading Arguments and Values 5512 5513 @table @var 5514 @item pointer 5515 A foreign pointer. 5516 5517 @item arg-type 5518 A foreign type. 5519 5520 @item arg 5521 An argument of type @var{arg-type}. 5522 5523 @item return-type 5524 A foreign type, @code{:void} by default. 5525 5526 @item return-value 5527 A lisp object. 5528 5529 @item convention 5530 One of @code{:cdecl} (default) or @code{:stdcall}. 5531 @end table 5532 5533 @subheading Description 5534 The @code{foreign-funcall} macro is the main primitive for calling 5535 foreign functions. 5536 5537 @emph{Note: The return value of foreign-funcall on functions with a 5538 :void return type is still undefined.} 5539 5540 @subheading Implementation-specific Notes 5541 @itemize 5542 @item 5543 Corman Lisp does not support @code{foreign-funcall}. On 5544 implementations that @strong{don't} support @code{foreign-funcall} 5545 @code{cffi-sys::no-foreign-funcall} will be present in 5546 @code{*features*}. Note: in these Lisps you can still use the 5547 @code{defcfun} interface. 5548 @end itemize 5549 5550 @subheading Examples 5551 5552 @lisp 5553 CFFI> (foreign-funcall-pointer (foreign-symbol-pointer "abs") () 5554 :int -42 :int) 5555 @result{} 42 5556 @end lisp 5557 5558 @subheading See Also 5559 @seealso{defcfun} @* 5560 @seealso{foreign-funcall} 5561 5562 5563 @c =================================================================== 5564 @c FOREIGN-FUNCALL-VARARGS 5565 5566 @page 5567 @node foreign-funcall-varargs, foreign-funcall-pointer-varargs, foreign-funcall-pointer, Functions 5568 @heading foreign-funcall-varargs 5569 @subheading Syntax 5570 @Macro{foreign-funcall-varargs name-and-options (fixed-arguments) &rest arguments @res{} return-value} 5571 5572 @var{fixed-arguments} ::= @{ @var{arg-type} @var{arg} @}* [@var{return-type}] @* 5573 @var{arguments} ::= @{ @var{arg-type} @var{arg} @}* [@var{return-type}] @* 5574 @var{name-and-options} ::= @var{name} | (@var{name} &key @var{library} @var{convention}) @* 5575 5576 @subheading Arguments and Values 5577 5578 @table @var 5579 @item name 5580 A Lisp string. 5581 5582 @item arg-type 5583 A foreign type. 5584 5585 @item arg 5586 An argument of type @var{arg-type}. 5587 5588 @item return-type 5589 A foreign type, @code{:void} by default. 5590 5591 @item return-value 5592 A lisp object. 5593 5594 @item library 5595 A lisp symbol; not evaluated. 5596 5597 @item convention 5598 One of @code{:cdecl} (default) or @code{:stdcall}. 5599 @end table 5600 5601 @subheading Description 5602 The @code{foreign-funcall-varargs} macro is the main primitive for 5603 calling foreign variadic functions. It behaves similarily to 5604 @code{foreign-funcall} except @code{fixed-arguments} are distinguished 5605 from the remaining arguments. 5606 5607 @subheading Examples 5608 5609 @lisp 5610 CFFI> (with-foreign-pointer-as-string (s 100) 5611 (setf (mem-ref s :char) 0) 5612 (foreign-funcall-varargs 5613 "sprintf" (:pointer s :string) "%.2f") 5614 :double (coerce pi 'double-float) :int)) 5615 @result{} 3.14 5616 @end lisp 5617 5618 5619 @c =================================================================== 5620 @c FOREIGN-FUNCALL-POINTER-VARARGS 5621 5622 @page 5623 @node foreign-funcall-pointer-varargs, translate-camelcase-name, foreign-funcall-varargs, Functions 5624 @heading foreign-funcall-pointer-varargs 5625 @subheading Syntax 5626 @Macro{foreign-funcall-pointer-varargs pointer options (fixed-arguments) &rest arguments @res{} return-value} 5627 5628 @var{fixed-arguments} ::= @{ @var{arg-type} @var{arg} @}* [@var{return-type}] @* 5629 @var{arguments} ::= @{ @var{arg-type} @var{arg} @}* [@var{return-type}] @* 5630 @var{options} ::= (&key @var{convention}) @* 5631 5632 @subheading Arguments and Values 5633 5634 @table @var 5635 @item pointer 5636 A foreign pointer. 5637 5638 @item arg-type 5639 A foreign type. 5640 5641 @item arg 5642 An argument of type @var{arg-type}. 5643 5644 @item return-type 5645 A foreign type, @code{:void} by default. 5646 5647 @item return-value 5648 A lisp object. 5649 5650 @item convention 5651 One of @code{:cdecl} (default) or @code{:stdcall}. 5652 @end table 5653 5654 @subheading Description 5655 The @code{foreign-funcall-pointer-varargs} macro is the main primitive 5656 for calling foreign variadic functions. It behaves similarily to 5657 @code{foreign-funcall-pointer} except @code{fixed-arguments} are 5658 distinguished from the remaining arguments. 5659 5660 @subheading Examples 5661 5662 @lisp 5663 CFFI> (with-foreign-pointer-as-string (s 100) 5664 (setf (mem-ref s :char) 0) 5665 (foreign-funcall-pointer-varargs 5666 (foreign-symbol-pointer "sprintf") () (:pointer s :string "%.2f") 5667 :double (coerce pi 'double-float) :int)) 5668 @result{} 3.14 5669 @end lisp 5670 5671 5672 @c =================================================================== 5673 @c TRANSLATE-CAMELCASE-NAME 5674 5675 @page 5676 @node translate-camelcase-name, translate-name-from-foreign, foreign-funcall-pointer-varargs, Functions 5677 @heading translate-camelcase-name 5678 @subheading Syntax 5679 @Function{translate-camelcase-name name &key upper-initial-p special-words @res{} return-value} 5680 5681 @subheading Arguments and Values 5682 5683 @table @var 5684 @item name 5685 Either a symbol or a string. 5686 5687 @item upper-initial-p 5688 A generalized boolean. 5689 5690 @item special words 5691 A list of strings. 5692 5693 @item return-value 5694 If @var{name} is a symbol, this is a string, and vice versa. 5695 @end table 5696 5697 @subheading Description 5698 @code{translate-camelcase-name} is a helper function for 5699 specializations of @code{translate-name-from-foreign} and 5700 @code{translate-name-to-foreign}. It handles the common case of 5701 converting between foreign camelCase names and lisp 5702 names. @var{upper-initial-p} indicates whether the first letter of the 5703 foreign name should be uppercase. @var{special-words} is a list of 5704 strings that should be treated atomically in translation. This list is 5705 case-sensitive. 5706 5707 @subheading Examples 5708 5709 @lisp 5710 CFFI> (translate-camelcase-name some-xml-function) 5711 @result{} "someXmlFunction" 5712 CFFI> (translate-camelcase-name some-xml-function :upper-initial-p t) 5713 @result{} "SomeXmlFunction" 5714 CFFI> (translate-camelcase-name some-xml-function :special-words '("XML")) 5715 @result{} "someXMLFunction" 5716 CFFI> (translate-camelcase-name "someXMLFunction") 5717 @result{} SOME-X-M-L-FUNCTION 5718 CFFI> (translate-camelcase-name "someXMLFunction" :special-words '("XML")) 5719 @result{} SOME-XML-FUNCTION 5720 @end lisp 5721 5722 @subheading See Also 5723 @seealso{translate-name-from-foreign} @* 5724 @seealso{translate-name-to-foreign} @* 5725 @seealso{translate-underscore-separated-name} 5726 5727 5728 @c =================================================================== 5729 @c TRANSLATE-NAME-FROM-FOREIGN 5730 5731 @page 5732 @node translate-name-from-foreign, translate-name-to-foreign, translate-camelcase-name, Functions 5733 @heading translate-name-from-foreign 5734 @subheading Syntax 5735 @Function{translate-name-from-foreign foreign-name package &optional varp @res{} symbol} 5736 5737 @subheading Arguments and Values 5738 5739 @table @var 5740 @item foreign-name 5741 A string denoting a foreign function. 5742 5743 @item package 5744 A Lisp package 5745 5746 @item varp 5747 A generalized boolean. 5748 5749 @item symbol 5750 The Lisp symbol to be used a function name. 5751 @end table 5752 5753 @subheading Description 5754 @code{translate-name-from-foreign} is used by @ref{defcfun} to handle 5755 the conversion of foreign names to lisp names. By default, it 5756 translates using @ref{translate-underscore-separated-name}. However, 5757 you can create specialized methods on this function to make 5758 translating more closely match the foreign library's naming 5759 conventions. 5760 5761 Specialize @var{package} on some package. This allows other packages 5762 to load libraries with different naming conventions. 5763 5764 @subheading Examples 5765 5766 @lisp 5767 CFFI> (defcfun "someXmlFunction" ...) 5768 @result{} SOMEXMLFUNCTION 5769 CFFI> (defmethod translate-name-from-foreign ((spec string) 5770 (package (eql *package*)) 5771 &optional varp) 5772 (let ((name (translate-camelcase-name spec))) 5773 (if varp (intern (format nil "*~a*" name)) name))) 5774 @result{} #<STANDARD-METHOD TRANSLATE-NAME-FROM-FOREIGN (STRING (EQL #<Package "SOME-PACKAGE">))> 5775 CFFI> (defcfun "someXmlFunction" ...) 5776 @result{} SOME-XML-FUNCTION 5777 @end lisp 5778 5779 @subheading See Also 5780 @seealso{defcfun} @* 5781 @seealso{translate-camelcase-name} @* 5782 @seealso{translate-name-to-foreign} @* 5783 @seealso{translate-underscore-separated-name} 5784 5785 5786 @c =================================================================== 5787 @c TRANSLATE-NAME-TO-FOREIGN 5788 5789 @page 5790 @node translate-name-to-foreign, translate-underscore-separated-name, translate-name-from-foreign, Functions 5791 @heading translate-name-to-foreign 5792 @subheading Syntax 5793 @Function{translate-name-to-foreign lisp-name package &optional varp @res{} string} 5794 5795 @subheading Arguments and Values 5796 5797 @table @var 5798 @item lisp-name 5799 A symbol naming the Lisp function to be created. 5800 5801 @item package 5802 A Lisp package 5803 5804 @item varp 5805 A generalized boolean. 5806 5807 @item string 5808 The string representing the foreign function name. 5809 @end table 5810 5811 @subheading Description 5812 @code{translate-name-to-foreign} is used by @ref{defcfun} to handle 5813 the conversion of lisp names to foreign names. By default, it 5814 translates using @ref{translate-underscore-separated-name}. However, 5815 you can create specialized methods on this function to make 5816 translating more closely match the foreign library's naming 5817 conventions. 5818 5819 Specialize @var{package} on some package. This allows other packages 5820 to load libraries with different naming conventions. 5821 5822 @subheading Examples 5823 5824 @lisp 5825 CFFI> (defcfun some-xml-function ...) 5826 @result{} "some_xml_function" 5827 CFFI> (defmethod translate-name-to-foreign ((spec symbol) 5828 (package (eql *package*)) 5829 &optional varp) 5830 (let ((name (translate-camelcase-name spec))) 5831 (if varp (subseq name 1 (1- (length name))) name))) 5832 @result{} #<STANDARD-METHOD TRANSLATE-NAME-TO-FOREIGN (STRING (EQL #<Package "SOME-PACKAGE">))> 5833 CFFI> (defcfun some-xml-function ...) 5834 @result{} "someXmlFunction" 5835 @end lisp 5836 5837 @subheading See Also 5838 @seealso{defcfun} @* 5839 @seealso{translate-camelcase-name} @* 5840 @seealso{translate-name-from-foreign} @* 5841 @seealso{translate-underscore-separated-name} 5842 5843 5844 @c =================================================================== 5845 @c TRANSLATE-UNDERSCORE-SEPARATED-NAME 5846 5847 @page 5848 @node translate-underscore-separated-name, , translate-name-to-foreign, Functions 5849 @heading translate-underscore-separated-name 5850 @subheading Syntax 5851 @Function{translate-underscore-separated-name name @res{} return-value} 5852 5853 @subheading Arguments and Values 5854 5855 @table @var 5856 @item name 5857 Either a symbol or a string. 5858 5859 @item return-value 5860 If @var{name} is a symbol, this is a string, and vice versa. 5861 @end table 5862 5863 @subheading Description 5864 @code{translate-underscore-separated-name} is a helper function for 5865 specializations of @ref{translate-name-from-foreign} and 5866 @ref{translate-name-to-foreign}. It handles the common case of 5867 converting between foreign underscore_separated names and lisp names. 5868 5869 @subheading Examples 5870 5871 @lisp 5872 CFFI> (translate-underscore-separated-name some-xml-function) 5873 @result{} "some_xml_function" 5874 CFFI> (translate-camelcase-name "some_xml_function") 5875 @result{} SOME-XML-FUNCTION 5876 @end lisp 5877 5878 @subheading See Also 5879 @seealso{translate-name-from-foreign} @* 5880 @seealso{translate-name-to-foreign} @* 5881 @seealso{translate-camelcase-name} 5882 5883 5884 @c =================================================================== 5885 @c CHAPTER: Libraries 5886 5887 @node Libraries, Callbacks, Functions, Top 5888 @chapter Libraries 5889 5890 @menu 5891 * Defining a library:: 5892 * Library definition style:: 5893 5894 Dictionary 5895 5896 * close-foreign-library:: Close a foreign library. 5897 * *darwin-framework-directories*:: Search path for Darwin frameworks. 5898 * define-foreign-library:: Explain how to load a foreign library. 5899 * *foreign-library-directories*:: Search path for shared libraries. 5900 * load-foreign-library:: Load a foreign library. 5901 * load-foreign-library-error:: Signalled on failure of its namesake. 5902 * use-foreign-library:: Load a foreign library when needed. 5903 @end menu 5904 5905 5906 @node Defining a library, Library definition style, Libraries, Libraries 5907 @section Defining a library 5908 5909 Almost all foreign code you might want to access exists in some kind 5910 of shared library. The meaning of @dfn{shared library} varies among 5911 platforms, but for our purposes, we will consider it to include 5912 @file{.so} files on @sc{unix}, frameworks on Darwin (and derivatives 5913 like Mac @acronym{OS X}), and @file{.dll} files on Windows. 5914 5915 Bringing one of these libraries into the Lisp image is normally a 5916 two-step process. 5917 5918 @enumerate 5919 @item 5920 Describe to @cffi{} how to load the library at some future point, 5921 depending on platform and other factors, with a 5922 @code{define-foreign-library} top-level form. 5923 5924 @item 5925 Load the library so defined with either a top-level 5926 @code{use-foreign-library} form or by calling the function 5927 @code{load-foreign-library}. 5928 @end enumerate 5929 5930 @xref{Tutorial-Loading,, Loading foreign libraries}, for a working 5931 example of the above two steps. 5932 5933 5934 @node Library definition style, close-foreign-library, Defining a library, Libraries 5935 @section Library definition style 5936 5937 Looking at the @code{libcurl} library definition presented earlier, 5938 you may ask why we did not simply do this: 5939 5940 @lisp 5941 (define-foreign-library libcurl 5942 (t (:default "libcurl"))) 5943 @end lisp 5944 5945 @noindent 5946 Indeed, this would work just as well on the computer on which I tested 5947 the tutorial. There are a couple of good reasons to provide the 5948 @file{.so}'s current version number, however. Namely, the versionless 5949 @file{.so} is not packaged on most @sc{unix} systems along with the 5950 actual, fully-versioned library; instead, it is included in the 5951 ``development'' package along with C headers and static @file{.a} 5952 libraries. 5953 5954 The reason @cffi{} does not try to account for this lies in the 5955 meaning of the version numbers. A full treatment of shared library 5956 versions is beyond this manual's scope; see @ref{Versioning,, Library 5957 interface versions, libtool, @acronym{GNU} Libtool}, for helpful 5958 information for the unfamiliar. For our purposes, consider that a 5959 mismatch between the library version with which you tested and the 5960 installed library version may cause undefined 5961 behavior.@footnote{Windows programmers may chafe at adding a 5962 @sc{unix}-specific clause to @code{define-foreign-library}. Instead, 5963 ask why the Windows solution to library incompatibility is ``include 5964 your own version of every library you use with every program''.} 5965 5966 @impnote{Maybe some notes should go here about OS X, which I know 5967 little about. --stephen} 5968 5969 5970 @c =================================================================== 5971 @c CLOSE-FOREIGN-LIBRARY 5972 5973 @page 5974 @node close-foreign-library, *darwin-framework-directories*, Library definition style, Libraries 5975 @heading close-foreign-library 5976 @subheading Syntax 5977 @Function{close-foreign-library library @res{} success} 5978 5979 @subheading Arguments and Values 5980 5981 @table @var 5982 @item library 5983 A symbol or an instance of @code{foreign-library}. 5984 5985 @item success 5986 A Lisp boolean. 5987 @end table 5988 5989 @subheading Description 5990 5991 Closes @var{library} which can be a symbol designating a library 5992 define through @code{define-foreign-library} or an instance of 5993 @code{foreign-library} as returned by @code{load-foreign-library}. 5994 5995 @c @subheading Examples 5996 @c @xref{Tutorial-Loading,, Loading foreign libraries}. 5997 5998 @subheading See Also 5999 6000 @seealso{define-foreign-library} @* 6001 @seealso{load-foreign-library} @* 6002 @seealso{use-foreign-library} 6003 6004 6005 @c =================================================================== 6006 @c *DARWIN-FRAMEWORK-DIRECTORIES* 6007 6008 @page 6009 @node *darwin-framework-directories*, define-foreign-library, close-foreign-library, Libraries 6010 @heading *darwin-framework-directories* 6011 @subheading Syntax 6012 6013 @Variable{*darwin-framework-directories*} 6014 6015 @subheading Value type 6016 6017 A list, in which each element is a string, a pathname, or a simple 6018 Lisp expression. 6019 6020 @subheading Initial value 6021 6022 A list containing the following, in order: an expression corresponding 6023 to Darwin path @file{~/Library/Frameworks/}, 6024 @code{#P"/Library/Frameworks/"}, and 6025 @code{#P"/System/Library/Frameworks/"}. 6026 6027 @subheading Description 6028 6029 The meaning of ``simple Lisp expression'' is explained in 6030 @ref{*foreign-library-directories*}. In contrast to that variable, 6031 this is not a fallback search path; the default value described above 6032 is intended to be a reasonably complete search path on Darwin systems. 6033 6034 @subheading Examples 6035 6036 @lisp 6037 CFFI> (let ((lib (load-foreign-library '(:framework "OpenGL")))) 6038 (foreign-library-pathname lib)) 6039 @result{} #P"/System/Library/Frameworks/OpenGL.framework/OpenGL" 6040 @end lisp 6041 6042 @subheading See also 6043 6044 @seealso{*foreign-library-directories*} @* 6045 @seealso{define-foreign-library} 6046 6047 6048 @c =================================================================== 6049 @c DEFINE-FOREIGN-LIBRARY 6050 6051 @page 6052 @node define-foreign-library, *foreign-library-directories*, *darwin-framework-directories*, Libraries 6053 @heading define-foreign-library 6054 6055 @subheading Syntax 6056 6057 @Macro{define-foreign-library name-and-options @{ load-clause @}* @res{} name} 6058 6059 name-and-options ::= name | (name &key convention search-path) 6060 load-clause ::= (feature library &key convention search-path) 6061 6062 @subheading Arguments and Values 6063 6064 @table @var 6065 @item name 6066 A symbol. 6067 6068 @item feature 6069 A feature expression. 6070 6071 @item library 6072 A library designator. 6073 6074 @item convention 6075 One of @code{:cdecl} (default) or @code{:stdcall} 6076 6077 @item search-path 6078 A path or list of paths where the library will be searched if not found in 6079 system-global directories. Paths specified in a load clause take priority over 6080 paths specified as library option, with *foreign-library-directories* having 6081 lowest priority. 6082 @end table 6083 6084 @subheading Description 6085 6086 Creates a new library designator called @var{name}. The 6087 @var{load-clause}s describe how to load that designator when passed to 6088 @code{load-foreign-library} or @code{use-foreign-library}. 6089 6090 When trying to load the library @var{name}, the relevant function 6091 searches the @var{load-clause}s in order for the first one where 6092 @var{feature} evaluates to true. That happens for any of the 6093 following situations: 6094 6095 @enumerate 1 6096 @item 6097 If @var{feature} is a symbol present in @code{common-lisp:*features*}. 6098 6099 @item 6100 If @var{feature} is a list, depending on @code{(first @var{feature})}, 6101 a keyword: 6102 6103 @table @code 6104 @item :and 6105 All of the feature expressions in @code{(rest @var{feature})} are 6106 true. 6107 6108 @item :or 6109 At least one of the feature expressions in @code{(rest @var{feature})} 6110 is true. 6111 6112 @item :not 6113 The feature expression @code{(second @var{feature})} is not true. 6114 @end table 6115 6116 @item 6117 Finally, if @var{feature} is @code{t}, this @var{load-clause} is 6118 picked unconditionally. 6119 @end enumerate 6120 6121 Upon finding the first true @var{feature}, the library loader then 6122 loads the @var{library}. The meaning of ``library designator'' is 6123 described in @ref{load-foreign-library}. 6124 6125 Functions associated to a library defined by 6126 @code{define-foreign-library} (e.g. through @code{defcfun}'s 6127 @code{:library} option, will inherit the library's options. The 6128 precedence is as follows: 6129 6130 @enumerate 1 6131 @item 6132 @code{defcfun}/@code{foreign-funcall} specific options; 6133 6134 @item 6135 @var{load-clause} options; 6136 6137 @item 6138 global library options (the @var{name-and-options} argument) 6139 @end enumerate 6140 6141 6142 @subheading Examples 6143 6144 @xref{Tutorial-Loading,, Loading foreign libraries}. 6145 6146 6147 @subheading See Also 6148 6149 @seealso{close-foreign-library} @* 6150 @seealso{load-foreign-library} 6151 6152 6153 @c =================================================================== 6154 @c *FOREIGN-LIBRARY-DIRECTORIES* 6155 6156 @page 6157 @node *foreign-library-directories*, load-foreign-library, define-foreign-library, Libraries 6158 @heading *foreign-library-directories* 6159 @subheading Syntax 6160 6161 @Variable{*foreign-library-directories*} 6162 6163 @subheading Value type 6164 6165 A list, in which each element is a string, a pathname, or a simple 6166 Lisp expression. 6167 6168 @subheading Initial value 6169 6170 The empty list. 6171 6172 @subheading Description 6173 6174 You should not have to use this variable. 6175 6176 Most, if not all, Lisps supported by @cffi{} have a reasonable default 6177 search algorithm for foreign libraries. For example, Lisps for 6178 @sc{unix} usually call 6179 @uref{http://www.opengroup.org/onlinepubs/009695399/functions/dlopen.html,, 6180 @code{dlopen(3)}}, which in turn looks in the system library 6181 directories. Only if that fails does @cffi{} look for the named 6182 library file in these directories, and load it from there if found. 6183 6184 Thus, this is intended to be a @cffi{}-only fallback to the library 6185 search configuration provided by your operating system. For example, 6186 if you distribute a foreign library with your Lisp package, you can 6187 add the library's containing directory to this list and portably 6188 expect @cffi{} to find it. 6189 6190 A @dfn{simple Lisp expression} is intended to provide functionality 6191 commonly used in search paths such as 6192 @acronym{ASDF}'s@footnote{@xref{Using asdf to load systems,,, asdf, 6193 asdf: another system definition facility}, for information on 6194 @code{asdf:*central-registry*}.}, and is defined recursively as 6195 follows:@footnote{See @code{mini-eval} in @file{libraries.lisp} for 6196 the source of this definition. As is always the case with a Lisp 6197 @code{eval}, it's easier to understand the Lisp definition than the 6198 english.} 6199 6200 @enumerate 6201 @item 6202 A list, whose @samp{first} is a function designator, and whose 6203 @samp{rest} is a list of simple Lisp expressions to be evaluated and 6204 passed to the so-designated function. The result is the result of the 6205 function call. 6206 6207 @item 6208 A symbol, whose result is its symbol value. 6209 6210 @item 6211 Anything else evaluates to itself. 6212 @end enumerate 6213 6214 The result of evaluating the @dfn{simple Lisp expression} should yield 6215 a @emph{designator} for a @emph{list} of @emph{pathname designators}. 6216 6217 @strong{Note}: in Common Lisp, @code{#p"/foo/bar"} designates the 6218 @emph{bar} file within the @emph{/foo} directory whereas 6219 @code{#p"/foo/bar/"} designates the @emph{/foo/bar} directory. Keep 6220 that in mind when customising the value of 6221 @code{*foreign-library-directories*}. 6222 6223 6224 @subheading Examples 6225 6226 @example 6227 $ ls 6228 @print{} liblibli.so libli.lisp 6229 @end example 6230 6231 @noindent 6232 In @file{libli.lisp}: 6233 6234 @lisp 6235 (pushnew #P"/home/sirian/lisp/libli/" *foreign-library-directories* 6236 :test #'equal) 6237 6238 (load-foreign-library '(:default "liblibli")) 6239 @end lisp 6240 6241 @noindent 6242 The following example would achieve the same effect: 6243 6244 @lisp 6245 (pushnew '(merge-pathnames #p"lisp/libli/" (user-homedir-pathname)) 6246 *foreign-library-directories* 6247 :test #'equal) 6248 @result{} ((MERGE-PATHNAMES #P"lisp/libli/" (USER-HOMEDIR-PATHNAME))) 6249 6250 (load-foreign-library '(:default "liblibli")) 6251 @end lisp 6252 6253 @subheading See also 6254 6255 @seealso{*darwin-framework-directories*} @* 6256 @seealso{define-foreign-library} 6257 6258 6259 @c =================================================================== 6260 @c LOAD-FOREIGN-LIBRARY 6261 6262 @page 6263 @node load-foreign-library, load-foreign-library-error, *foreign-library-directories*, Libraries 6264 @heading load-foreign-library 6265 @subheading Syntax 6266 @Function{load-foreign-library library-designator @res{} library} 6267 6268 @subheading Arguments and Values 6269 6270 @table @var 6271 @item library-designator 6272 A library designator. 6273 6274 @item library-designator 6275 An instance of @code{foreign-library}. 6276 @end table 6277 6278 @subheading Description 6279 6280 Load the library indicated by @var{library-designator}. A @dfn{library 6281 designator} is defined as follows: 6282 6283 @enumerate 6284 @item 6285 If a symbol, is considered a name previously defined with 6286 @code{define-foreign-library}. 6287 6288 @item 6289 If a string or pathname, passed as a namestring directly to the 6290 implementation's foreign library loader. If that fails, search the 6291 directories in @code{*foreign-library-directories*} with 6292 @code{cl:probe-file}; if found, the absolute path is passed to the 6293 implementation's loader. 6294 6295 @item 6296 If a list, the meaning depends on @code{(first @var{library})}: 6297 6298 @table @code 6299 @item :framework 6300 The second list element is taken to be a Darwin framework name, which 6301 is then searched in @code{*darwin-framework-directories*}, and loaded 6302 when found. 6303 6304 @item :or 6305 Each remaining list element, itself a @dfn{library designator}, is loaded in 6306 order, until one succeeds. 6307 6308 @item :default 6309 The name is transformed according to the platform's naming convention 6310 to shared libraries, and the resultant string is loaded as a @dfn{library 6311 designator}. For example, on @sc{unix}, the name is suffixed with 6312 @file{.so}. 6313 @end table 6314 @end enumerate 6315 6316 If the library is already loaded it will be reloaded. 6317 6318 If the load fails, signal a @code{load-foreign-library-error}. 6319 6320 @strong{Please note:} For system libraries, you should not need to 6321 specify the directory containing the library. Each operating system 6322 has its own idea of a default search path, and you should rely on it 6323 when it is reasonable. 6324 6325 @subheading Implementation-specific Notes 6326 On ECL platforms where its dynamic FFI is not supported (ie. when 6327 @code{:dffi} is not present in @code{*features*}), 6328 @code{cffi:load-foreign-library} does not work and you must use ECL's 6329 own @code{ffi:load-foreign-library} with a constant string argument. 6330 6331 @subheading Examples 6332 6333 @xref{Tutorial-Loading,, Loading foreign libraries}. 6334 6335 @subheading See Also 6336 6337 @seealso{close-foreign-library} @* 6338 @seealso{*darwin-framework-directories*} @* 6339 @seealso{define-foreign-library} @* 6340 @seealso{*foreign-library-directories*} @* 6341 @seealso{load-foreign-library-error} @* 6342 @seealso{use-foreign-library} 6343 6344 6345 @c =================================================================== 6346 @c LOAD-FOREIGN-LIBRARY-ERROR 6347 6348 @page 6349 @node load-foreign-library-error, use-foreign-library, load-foreign-library, Libraries 6350 @heading load-foreign-library-error 6351 6352 @subheading Syntax 6353 6354 @Condition{load-foreign-library-error} 6355 6356 @subheading Class precedence list 6357 6358 @code{load-foreign-library-error}, @code{error}, 6359 @code{serious-condition}, @code{condition}, @code{t} 6360 6361 @subheading Description 6362 6363 Signalled when a foreign library load completely fails. The exact 6364 meaning of this varies depending on the real conditions at work, but 6365 almost universally, the implementation's error message is useless. 6366 However, @cffi{} does provide the useful restarts @code{retry} and 6367 @code{use-value}; invoke the @code{retry} restart to try loading the 6368 foreign library again, or the @code{use-value} restart to try loading 6369 a different foreign library designator. 6370 6371 @subheading See also 6372 6373 @seealso{load-foreign-library} 6374 6375 6376 @c =================================================================== 6377 @c USE-FOREIGN-LIBRARY 6378 6379 @page 6380 @node use-foreign-library, , load-foreign-library-error, Libraries 6381 @heading use-foreign-library 6382 6383 @subheading Syntax 6384 6385 @Macro{use-foreign-library name} 6386 6387 @subheading Arguments and values 6388 6389 @table @var 6390 @item name 6391 A library designator; unevaluated. 6392 @end table 6393 6394 6395 @subheading Description 6396 6397 @xref{load-foreign-library}, for the meaning of ``library 6398 designator''. This is intended to be the top-level form used 6399 idiomatically after a @code{define-foreign-library} form to go ahead 6400 and load the library. @c ; it also sets the ``current foreign library''. 6401 Finally, on implementations where the regular evaluation rule is 6402 insufficient for foreign library loading, it loads it at the required 6403 time.@footnote{Namely, @acronym{CMUCL}. See 6404 @code{use-foreign-library} in @file{libraries.lisp} for details.} 6405 6406 @c current foreign library is a concept created a few hours ago as of 6407 @c this writing. It is not actually used yet, but probably will be. 6408 6409 @subheading Examples 6410 6411 @xref{Tutorial-Loading,, Loading foreign libraries}. 6412 6413 6414 @subheading See also 6415 6416 @seealso{load-foreign-library} 6417 6418 6419 @c =================================================================== 6420 @c CHAPTER: Callbacks 6421 6422 @node Callbacks, The Groveller, Libraries, Top 6423 @chapter Callbacks 6424 6425 @menu 6426 Dictionary 6427 6428 * callback:: 6429 * defcallback:: 6430 * get-callback:: 6431 @end menu 6432 6433 6434 @c =================================================================== 6435 @c CALLBACK 6436 6437 @page 6438 @node callback, defcallback, Callbacks, Callbacks 6439 @heading callback 6440 @subheading Syntax 6441 @Macro{callback symbol @res{} pointer} 6442 6443 @subheading Arguments and Values 6444 6445 @table @var 6446 @item symbol 6447 A symbol denoting a callback. 6448 6449 @item pointer 6450 @itemx new-value 6451 A pointer. 6452 @end table 6453 6454 @subheading Description 6455 The @code{callback} macro is analogous to the standard CL special 6456 operator @code{function} and will return a pointer to the callback 6457 denoted by the symbol @var{name}. 6458 6459 @subheading Examples 6460 6461 @lisp 6462 CFFI> (defcallback sum :int ((a :int) (b :int)) 6463 (+ a b)) 6464 @result{} SUM 6465 CFFI> (callback sum) 6466 @result{} #<A Mac Pointer #x102350> 6467 @end lisp 6468 6469 @subheading See Also 6470 @seealso{get-callback} @* 6471 @seealso{defcallback} 6472 6473 6474 @c =================================================================== 6475 @c DEFCALLBACK 6476 6477 @page 6478 @node defcallback, get-callback, callback, Callbacks 6479 @heading defcallback 6480 @subheading Syntax 6481 @Macro{defcallback name-and-options return-type arguments &body body @res{} name} 6482 6483 name-and-options ::= name | (name &key convention) 6484 arguments ::= (@{ (arg-name arg-type) @}*) 6485 6486 @subheading Arguments and Values 6487 6488 @table @var 6489 @item name 6490 A symbol naming the callback created. 6491 6492 @item return-type 6493 The foreign type for the callback's return value. 6494 6495 @item arg-name 6496 A symbol. 6497 6498 @item arg-type 6499 A foreign type. 6500 6501 @item convention 6502 One of @code{:cdecl} (default) or @code{:stdcall}. 6503 @end table 6504 6505 @subheading Description 6506 The @code{defcallback} macro defines a Lisp function that can be called 6507 from C. The arguments passed to this function will be converted to the 6508 appropriate Lisp representation and its return value will be converted 6509 to its C representation. 6510 6511 This Lisp function can be accessed by the @code{callback} macro or the 6512 @code{get-callback} function. 6513 6514 @strong{Portability note:} @code{defcallback} will not work correctly 6515 on some Lisps if it's not a top-level form. 6516 6517 @subheading Examples 6518 6519 @lisp 6520 (defcfun "qsort" :void 6521 (base :pointer) 6522 (nmemb :int) 6523 (size :int) 6524 (fun-compar :pointer)) 6525 6526 (defcallback < :int ((a :pointer) (b :pointer)) 6527 (let ((x (mem-ref a :int)) 6528 (y (mem-ref b :int))) 6529 (cond ((> x y) 1) 6530 ((< x y) -1) 6531 (t 0)))) 6532 6533 CFFI> (with-foreign-object (array :int 10) 6534 ;; @lispcmt{Initialize array.} 6535 (loop for i from 0 and n in '(7 2 10 4 3 5 1 6 9 8) 6536 do (setf (mem-aref array :int i) n)) 6537 ;; @lispcmt{Sort it.} 6538 (qsort array 10 (foreign-type-size :int) (callback <)) 6539 ;; @lispcmt{Return it as a list.} 6540 (loop for i from 0 below 10 6541 collect (mem-aref array :int i))) 6542 @result{} (1 2 3 4 5 6 7 8 9 10) 6543 @end lisp 6544 6545 @subheading See Also 6546 @seealso{callback} @* 6547 @seealso{get-callback} 6548 6549 6550 @c =================================================================== 6551 @c GET-CALLBACK 6552 6553 @page 6554 @node get-callback, , defcallback, Callbacks 6555 @heading get-callback 6556 @subheading Syntax 6557 @Accessor{get-callback symbol @res{} pointer} 6558 6559 @subheading Arguments and Values 6560 6561 @table @var 6562 @item symbol 6563 A symbol denoting a callback. 6564 6565 @item pointer 6566 A pointer. 6567 @end table 6568 6569 @subheading Description 6570 This is the functional version of the @code{callback} macro. It 6571 returns a pointer to the callback named by @var{symbol} suitable, for 6572 example, to pass as arguments to foreign functions. 6573 6574 @subheading Examples 6575 6576 @lisp 6577 CFFI> (defcallback sum :int ((a :int) (b :int)) 6578 (+ a b)) 6579 @result{} SUM 6580 CFFI> (get-callback 'sum) 6581 @result{} #<A Mac Pointer #x102350> 6582 @end lisp 6583 6584 @subheading See Also 6585 @seealso{callback} @* 6586 @seealso{defcallback} 6587 6588 6589 @c =================================================================== 6590 @c CHAPTER: The Groveller 6591 6592 @node The Groveller, Limitations, Callbacks, Top 6593 @chapter The Groveller 6594 6595 @cffi{}-Grovel is a tool which makes it easier to write @cffi{} 6596 declarations for libraries that are implemented in C. That is, it 6597 grovels through the system headers, getting information about types 6598 and structures, so you don't have to. This is especially important 6599 for libraries which are implemented in different ways by different 6600 vendors, such as the @sc{unix}/@sc{posix} functions. The @cffi{} 6601 declarations are usually quite different from platform to platform, 6602 but the information you give to @cffi{}-Grovel is the same. Hence, 6603 much less work is required! 6604 6605 If you use @acronym{ASDF}, @cffi{}-Grovel is integrated, so that it 6606 will run automatically when your system is building. This feature was 6607 inspired by SB-Grovel, a similar @acronym{SBCL}-specific project. 6608 @cffi{}-Grovel can also be used without @acronym{ASDF}. 6609 6610 @section Building FFIs with CFFI-Grovel 6611 6612 @cffi{}-Grovel uses a specification file (*.lisp) describing the 6613 features that need groveling. The C compiler is used to retrieve this 6614 data and write a Lisp file (*.cffi.lisp) which contains the necessary 6615 @cffi{} definitions to access the variables, structures, constants, and 6616 enums mentioned in the specification. 6617 6618 @c This is most similar to the SB-Grovel package, upon which it is 6619 @c based. Unlike SB-Grovel, we do not currently support defining 6620 @c regular foreign functions in the specification file; those are best 6621 @c defined in normal Lisp code. 6622 6623 @cffi{}-Grovel provides an @acronym{ASDF} component for handling the 6624 necessary calls to the C compiler and resulting file management. 6625 6626 @c See the included CFFI-Unix package for an example of how to 6627 @c integrate a specification file with ASDF-built packages. 6628 6629 @menu 6630 * Groveller Syntax:: How grovel files should look like. 6631 * Groveller ASDF Integration:: ASDF components for grovel files. 6632 * Groveller Implementation Notes:: Implementation notes. 6633 * Wrapper for Inline/Static Functions and Macros:: Wrapper 6634 @end menu 6635 6636 @node Groveller Syntax, Groveller ASDF Integration, The Groveller, The Groveller 6637 @section Specification File Syntax 6638 6639 The specification files are read by the normal Lisp reader, so they 6640 have syntax very similar to normal Lisp code. In particular, 6641 semicolon-comments and reader-macros will work as expected. 6642 6643 There are several forms recognized by @cffi{}-Grovel: 6644 6645 @deffn {Grovel Form} progn &rest forms 6646 6647 Processes a list of forms. Useful for conditionalizing several 6648 forms. For example: 6649 @end deffn 6650 6651 @lisp 6652 #+freebsd 6653 (progn 6654 (constant (ev-enable "EV_ENABLE")) 6655 (constant (ev-disable "EV_DISABLE"))) 6656 @end lisp 6657 6658 @deffn {Grovel Form} include &rest files 6659 6660 Include the specified files (specified as strings) in the generated C 6661 source code. 6662 @end deffn 6663 6664 @deffn {Grovel Form} in-package symbol 6665 6666 Set the package to be used for the final Lisp output. 6667 @end deffn 6668 6669 @deffn {Grovel Form} ctype lisp-name size-designator 6670 6671 Define a @cffi{} foreign type for the string in @var{size-designator}, 6672 e.g. @code{(ctype :pid "pid_t")}. 6673 @end deffn 6674 6675 @deffn {Grovel Form} constant (lisp-name &rest c-names) &key type documentation optional 6676 6677 Search for the constant named by the first @var{c-name} string found 6678 to be known to the C preprocessor and define it as @var{lisp-name}. 6679 6680 The @var{type} keyword argument specifies how to grovel the constant: 6681 either @code{integer} (the default) or @code{double-float}. If 6682 @var{optional} is true, no error will be raised if all the 6683 @var{c-names} are unknown. If @var{lisp-name} is a keyword, the actual 6684 constant will be a symbol of the same name interned in the current 6685 package. 6686 @end deffn 6687 6688 @deffn {Grovel Form} feature lisp-feature-name c-name &key feature-list 6689 6690 Adds @var{lisp-feature-name} to the list @var{feature-list} if the @var{c-name} 6691 string is known to the C preprocessor. @var{feature-list} defaults 6692 to @code{cl:*features*}. 6693 @end deffn 6694 6695 @deffn {Grovel Form} define name &optional value 6696 6697 Defines an additional C preprocessor symbol, which is useful for 6698 altering the behavior of included system headers. 6699 @end deffn 6700 6701 @deffn {Grovel Form} cc-flags &rest flags 6702 6703 Adds @var{cc-flags} to the command line arguments used for the C compiler 6704 invocation. 6705 @end deffn 6706 6707 @deffn {Grovel Form} pkg-config-cflags pkg &key optional 6708 6709 Adds @var{pkg} to the command line arguments for the external program 6710 @code{pkg-config} and runs it to retrieve the relevant include flags 6711 used for the C compiler invocation. This syntax can be used instead of 6712 hard-coding paths using @code{cc-flags}, and ensures that include 6713 flags are added correctly on the build system. Assumes 6714 @code{pkg-config} is installed and working. @var{pkg} is a string 6715 that identifies an installed @code{pkg-config} package. See the 6716 pkg-config manual for more information. If @var{optional} is true, 6717 failure to execute @code{pkg-config} does @emph{not} abort 6718 compilation. 6719 @end deffn 6720 6721 @deffn {Grovel Form} cstruct lisp-name c-name slots 6722 6723 Define a @cffi{} foreign struct with the slot data specfied. Slots 6724 are of the form @code{(lisp-name c-name &key type count (signed t))}. 6725 @end deffn 6726 6727 @deffn {Grovel Form} cunion lisp-name c-name slots 6728 6729 Identical to @code{cstruct}, but defines a @cffi{} foreign union. 6730 @end deffn 6731 6732 @deffn {Grovel Form} cstruct-and-class c-name slots 6733 6734 Defines a @cffi{} foreign struct, as with @code{cstruct} and defines a 6735 @acronym{CLOS} class to be used with it. This is useful for mapping 6736 foreign structures to application-layer code that shouldn't need to 6737 worry about memory allocation issues. 6738 @end deffn 6739 6740 @deffn {Grovel Form} cvar namespec type &key read-only 6741 6742 Defines a foreign variable of the specified type, even if that 6743 variable is potentially a C preprocessor pseudo-variable. e.g. 6744 @code{(cvar ("errno" errno) errno-values)}, assuming that errno-values 6745 is an enum or equivalent to type @code{:int}. 6746 6747 The @var{namespec} is similar to the one used in @ref{defcvar}. 6748 @end deffn 6749 6750 @deffn {Grovel Form} cenum name-and-opts &rest elements 6751 6752 Defines a true C enum, with elements specified as @code{((lisp-name 6753 &rest c-names) &key optional documentation)}. 6754 @var{name-and-opts} can be either a symbol as name, or a list 6755 @code{(name &key base-type define-constants)}. If @var{define-constants} 6756 is non-null, a Lisp constant will be defined for each enum member. 6757 @end deffn 6758 6759 @deffn {Grovel Form} constantenum name-and-opts &rest elements 6760 6761 Defines an enumeration of pre-processor constants, with elements 6762 specified as @code{((lisp-name &rest c-names) &key optional 6763 documentation)}. 6764 @var{name-and-opts} can be either a symbol as name, or a list 6765 @code{(name &key base-type define-constants)}. If @var{define-constants} 6766 is non-null, a Lisp constant will be defined for each enum member. 6767 6768 This example defines @code{:af-inet} to represent the value held by 6769 @code{AF_INET} or @code{PF_INET}, whichever the pre-processor finds 6770 first. Similarly for @code{:af-packet}, but no error will be 6771 signalled if the platform supports neither @code{AF_PACKET} nor 6772 @code{PF_PACKET}. 6773 @end deffn 6774 6775 @lisp 6776 (constantenum address-family 6777 ((:af-inet "AF_INET" "PF_INET") 6778 :documentation "IPv4 Protocol family") 6779 ((:af-local "AF_UNIX" "AF_LOCAL" "PF_UNIX" "PF_LOCAL") 6780 :documentation "File domain sockets") 6781 ((:af-inet6 "AF_INET6" "PF_INET6") 6782 :documentation "IPv6 Protocol family") 6783 ((:af-packet "AF_PACKET" "PF_PACKET") 6784 :documentation "Raw packet access" 6785 :optional t)) 6786 @end lisp 6787 6788 @deffn {Grovel Form} bitfield name-and-opts &rest elements 6789 6790 Defines a bitfield, with elements specified as @code{((lisp-name &rest 6791 c-names) &key optional documentation)}. @var{name-and-opts} can be either a 6792 symbol as name, or a list @code{(name &key base-type)}. For example: 6793 @end deffn 6794 6795 @lisp 6796 (bitfield flags-ctype 6797 ((:flag-a "FLAG_A") 6798 :documentation "DOCU_A") 6799 ((:flag-b "FLAG_B" "FLAG_B_ALT") 6800 :documentation "DOCU_B") 6801 ((:flag-c "FLAG_C") 6802 :documentation "DOCU_C" 6803 :optional t)) 6804 @end lisp 6805 6806 6807 @c =================================================================== 6808 @c SECTION: Groveller ASDF Integration 6809 6810 @node Groveller ASDF Integration, Groveller Implementation Notes, Groveller Syntax, The Groveller 6811 @section ASDF Integration 6812 6813 An example software project might contain four files; an 6814 @acronym{ASDF} file, a package definition file, an implementation 6815 file, and a @cffi{}-Grovel specification file. 6816 6817 The @acronym{ASDF} file defines the system and its dependencies. 6818 Notice the use of @code{eval-when} to ensure @cffi{}-Grovel is present 6819 and the use of @code{(cffi-grovel:grovel-file name &key cc-flags)} 6820 instead of @code{(:file name)}. 6821 6822 The @file{example-software.asd} file would look like that: 6823 6824 @lisp 6825 ;;; @lispcmt{CFFI-Grovel is needed for processing grovel-file components} 6826 (defsystem "example-software" 6827 :defsystem-depends-on ("cffi-grovel") 6828 :depends-on ("cffi") 6829 :serial t 6830 :components 6831 ((:file "package") 6832 (:cffi-grovel-file "example-grovelling") 6833 (:cffi-wrapper-file "example-wrappers") 6834 (:file "example"))) 6835 @end lisp 6836 6837 The @file{package.lisp} file would contain one or several 6838 @code{defpackage} forms, to remove circular dependencies and make 6839 building the project easier. Note that you may or may not want to 6840 @code{:use} your internal package. 6841 6842 @impnote{Note that it's a not a good idea to @code{:use} when names may 6843 clash with, say, CL symbols. 6844 Or you could use @code{uiop:define-package} and its @code{:mix} option.} 6845 6846 @lisp 6847 (defpackage #:example-internal 6848 (:use) 6849 (:nicknames #:exampleint)) 6850 6851 (defpackage #:example-software 6852 (:export ...) 6853 (:use #:cl #:cffi #:exampleint)) 6854 @end lisp 6855 6856 The internal package is created by Lisp code output from the C program 6857 written by @cffi{}-Grovel; if your specification file is 6858 @file{exampleint.lisp}, the @file{exampleint.cffi.lisp} file will contain the 6859 @cffi{} definitions needed by the rest of your project. 6860 @xref{Groveller Syntax}. 6861 6862 @node Groveller Implementation Notes, Wrapper for Inline/Static Functions and Macros, Groveller ASDF Integration, The Groveller 6863 @section Implementation Notes 6864 6865 @cffi{}-Grovel will generate many files that not only architecture-specific, 6866 but also implementation-specific, and should not be distributed. 6867 ASDF will generate these files in its output cache; 6868 if you build with multiple architectures (e.g. with NFS/AFS home 6869 directories) or implementations, it is critical for avoiding clashes 6870 to keep this cache in an implementation-dependent directory (as is the 6871 default). 6872 6873 For @code{foo-internal.lisp}, the resulting @code{foo-internal.c}, 6874 @code{foo-internal}, and @code{foo-internal.cffi.lisp} are all 6875 platform-specific, either because of possible reader-macros in 6876 foo-internal.lisp, or because of varying C environments on the host 6877 system. For this reason, it is not helpful to distribute any of those 6878 files; end users building @cffi{}-Grovel based software will need 6879 @code{cffi}-Grovel anyway. 6880 6881 @impnote{For now, after some experimentation with @sc{clisp} having no 6882 long-long, it seems appropriate to assert that the generated @code{.c} 6883 files are architecture and operating-system dependent, but 6884 lisp-implementation independent. This way the same @code{.c} file 6885 (and so the same @code{.grovel-tmp.lisp} file) will be shareable 6886 between the implementations running on a given system.} 6887 6888 @c TODO: document the new wrapper stuff. 6889 6890 @node Wrapper for Inline/Static Functions and Macros, , Groveller Implementation Notes, The Groveller 6891 @section Wrapper for Inline/Static Functions and Macros 6892 6893 In a shared library, information in static/inlined functions and 6894 macros are already removed during the compilation. Wrapper file 6895 enables to write an uninlined function wrapping the call to them. 6896 6897 A wrapper file compilation/loading proceeds as follows: 6898 Unlike groveller which generates C code that emits lisp files 6899 containing cffi definitions, it generates C code, compiles it as a 6900 shared library, loads the library, generate the cffi definitions (as 6901 lisp code) and then loads the lisp code. 6902 6903 It has asdf integration similar to groveller. 6904 6905 @lisp 6906 (defsystem "example-software" 6907 :defsystem-depends-on ("cffi-grovel") 6908 :depends-on ("cffi") 6909 :serial t 6910 :components 6911 ((:file "package") 6912 (:cffi-grovel-file "example-grovelling") 6913 (:cffi-wrapper-file "example-wrappers") ;; <<--- this part 6914 (:file "example"))) 6915 @end lisp 6916 6917 @deffn {Wrapper Form} defwrapper name-and-options return-type &rest args 6918 @end deffn 6919 6920 @example 6921 static inline int foo(int i) @{ 6922 return 1+i; 6923 @}; 6924 #define bar(i) (1+(i)) 6925 @end example 6926 6927 @lisp 6928 (in-package :mypackage) 6929 (defwrapper ("foo" foo) :int 6930 (i :int)) 6931 (defwrapper ("bar" bar) :int 6932 (i :int)) 6933 @end lisp 6934 6935 Other forms are similar to grovel files. 6936 6937 @deffn {Wrapper Form} progn &rest forms 6938 6939 Processes a list of forms. Useful for conditionalizing several 6940 forms. For example: 6941 @end deffn 6942 6943 @lisp 6944 #+freebsd 6945 (progn 6946 (constant (ev-enable "EV_ENABLE")) 6947 (constant (ev-disable "EV_DISABLE"))) 6948 @end lisp 6949 6950 @deffn {Wrapper Form} include &rest files 6951 6952 Include the specified files (specified as strings) in the generated C 6953 source code. 6954 @end deffn 6955 6956 @deffn {Wrapper Form} in-package symbol 6957 6958 Set the package to be used for the final Lisp output. 6959 @end deffn 6960 6961 @deffn {Wrapper Form} flags &rest flags 6962 6963 Adds @var{cc-flags} to the command line arguments used for the C compiler 6964 invocation. 6965 @end deffn 6966 6967 @deffn {Wrapper Form} proclaim &rest proclaimations 6968 @end deffn 6969 @deffn {Wrapper Form} declaim &rest declaimations 6970 @end deffn 6971 6972 6973 6974 @c =================================================================== 6975 @c CHAPTER: Static Linking 6976 6977 @node Static Linking, Limitations, The Groveller, Top 6978 @chapter Static Linking 6979 6980 On recent enough versions of supported implementations (currently, 6981 GNU CLISP 2.49, CMUCL 2015-11, and SBCL 1.2.17), and with a recent 6982 enough ASDF (3.1.2 or later), you can create a statically linked 6983 Lisp executable image that includes all the C extensions 6984 (wrappers and any other objects output by @code{compile-op}) 6985 as well as your Lisp code --- or a standalone application executable. 6986 This makes it easier to deliver your code as a single file. 6987 6988 To dump a statically linked executable image, use: 6989 6990 @lisp 6991 (asdf:load-system :cffi-grovel) 6992 (asdf:operate :static-image-op :example-software) 6993 @end lisp 6994 6995 To dump a statically linked executable standalone application, use: 6996 6997 @lisp 6998 (asdf:load-system :cffi-grovel) 6999 (asdf:operate :static-program-op :example-software) 7000 @end lisp 7001 7002 See @uref{https://common-lisp.net/project/asdf/,,the ASDF 7003 manual} for documentation about @code{image-op} and @code{program-op} 7004 which are the parent operation classes that behave similarly except 7005 they don't statically link C code. 7006 7007 @impnote{There is also an operation @code{:static-runtime-op} to create the 7008 statically linked runtime alone, but it's admittedly not very useful 7009 except as an intermediate step dependency towards building 7010 @code{:static-image-op} or @code{:static-program-op}.} 7011 7012 7013 7014 @c =================================================================== 7015 @c CHAPTER: Limitations 7016 7017 @node Limitations, Platform-specific features, The Groveller, Top 7018 @chapter Limitations 7019 7020 These are @cffi{}'s limitations across all platforms; for information 7021 on the warts on particular Lisp implementations, see 7022 @ref{Implementation Support}. 7023 7024 @itemize @bullet 7025 @item 7026 The tutorial includes a treatment of the primary, intractable 7027 limitation of @cffi{}, or any @acronym{FFI}: that the abstractions 7028 commonly used by C are insufficiently expressive. 7029 @xref{Tutorial-Abstraction,, Breaking the abstraction}, for more 7030 details. 7031 7032 @end itemize 7033 7034 7035 @node Platform-specific features, Glossary, Limitations, Top 7036 @appendix Platform-specific features 7037 7038 Whenever a backend doesn't support one of @cffi{}'s features, a 7039 specific symbol is pushed onto @code{common-lisp:*features*}. The 7040 meanings of these symbols follow. 7041 7042 @table @var 7043 @item cffi-sys::flat-namespace 7044 This Lisp has a flat namespace for foreign symbols meaning that you 7045 won't be able to load two different libraries with homograph functions 7046 and successfully differentiate them through the @code{:library} 7047 option to @code{defcfun}, @code{defcvar}, etc@dots{} 7048 7049 @item cffi-sys::no-foreign-funcall 7050 The macro @code{foreign-funcall} is @strong{not} available. On such 7051 platforms, the only way to call a foreign function is through 7052 @code{defcfun}. @xref{foreign-funcall}, and @ref{defcfun}. 7053 7054 @item cffi-sys::no-long-long 7055 The C @code{long long} type is @strong{not} available as a foreign 7056 type. 7057 7058 However, on such platforms @cffi{} provides its own implementation of 7059 the @code{long long} type for all of operations in chapters 7060 @ref{Foreign Types}, @ref{Pointers} and @ref{Variables}. The 7061 functionality described in @ref{Functions} and @ref{Callbacks} will 7062 not be available. 7063 7064 32-bit Lispworks 5.0+ is an exception. In addition to the @cffi{} 7065 implementation described above, Lispworks itself implements the 7066 @code{long long} type for @ref{Functions}. @ref{Callbacks} are still 7067 missing @code{long long} support, though. 7068 7069 @item cffi-sys::no-stdcall 7070 This Lisp doesn't support the @code{stdcall} calling convention. Note 7071 that it only makes sense to support @code{stdcall} on (32-bit) x86 7072 platforms. 7073 7074 @end table 7075 7076 7077 @node Glossary, Comprehensive Index, Platform-specific features, Top 7078 @appendix Glossary 7079 7080 @table @dfn 7081 @item aggregate type 7082 A @cffi{} type for C data defined as an organization of data of simple 7083 type; in structures and unions, which are themselves aggregate types, 7084 they are represented by value. 7085 7086 @item foreign value 7087 This has two meanings; in any context, only one makes sense. 7088 7089 When using type translators, the foreign value is the lower-level Lisp 7090 value derived from the object passed to @code{translate-to-foreign} 7091 (@pxref{translate-to-foreign}). This value should be a Lisp number or 7092 a pointer (satisfies @code{pointerp}), and it can be treated like any 7093 general Lisp object; it only completes the transformation to a true 7094 foreign value when passed through low-level code in the Lisp 7095 implementation, such as the foreign function caller or indirect memory 7096 addressing combined with a data move. 7097 7098 In other contexts, this refers to a value accessible by C, but which 7099 may only be accessed through @cffi{} functions. The closest you can 7100 get to such a foreign value is through a pointer Lisp object, which 7101 itself counts as a foreign value in only the previous sense. 7102 7103 @item simple type 7104 A @cffi{} type that is ultimately represented as a builtin type; 7105 @cffi{} only provides extra semantics for Lisp that are invisible to C 7106 code or data. 7107 @end table 7108 7109 @node Comprehensive Index, , Glossary, Top 7110 @unnumbered Index 7111 @printindex cp 7112 7113 @bye