From: N. R. <ra...@mr...> - 2009-10-10 08:20:20
|
I am unable to figure out how to transfer the output of functions like fprintf(1) to given CL streams. Here is a simplified version of what I am trying to do. I have a C function `print_error' in a C source file: $ cat /tmp/bar/foolib.c #include <stdio.h> int print_error(FILE *fp, char *msg) { fprintf(fp, msg); } $ cc -fpic -DPIC -shared -o foolib.so foolib.c $ cat /tmp/bar/foo.lisp (eval-when (:compile-toplevel) (use-package "FFI")) (default-foreign-language :stdc) (default-foreign-library "/tmp/bar/foolib.so") (def-call-out print-error (:name "print_error") (:return-type int) (:arguments (fp c-pointer) (msg c-string))) $ clisp -norc -q [1]> (load (compile-file "/tmp/bar/foo.lisp")) ;; Compiling file /tmp/bar/foo.lisp ... ;; Wrote file /tmp/bar/foo.fas 0 errors, 0 warnings ;; Loading file /tmp/bar/foo.fas ... ;; Loaded file /tmp/bar/foo.fas T [2]> (defun my-print-error (stream message) "Write MESSAGE to STREAM." ;; Want the function STREAM-TO-FILE-POINTER below. (print-error (stream-to-file-pointer stream) message)) I don't know how to define STREAM-TO-FILE-POINTER, and would appreciate any suggestions. Regards, Raghavendra. -- N. Raghavendra <ra...@mr...> | http://www.retrotexts.net/ Harish-Chandra Research Institute | http://www.mri.ernet.in/ See message headers for contact and OpenPGP information. |
From: Sam S. <sd...@gn...> - 2009-10-12 03:46:23
|
> * N. Raghavendra <en...@ze...> [2009-10-10 13:41:47 +0500]: > > I don't know how to define STREAM-TO-FILE-POINTER, and would > appreciate any suggestions. you can't. clisp streams are based on OS file handles, not stdio.h. it is possible to get the handle and wrap it into stdio.h FILE, but the interaction of clisp stream buffering and FILE buffering will have "interesting" consequences. try http://clisp.podval.org/impnotes/syscalls.html#stdio for ffi. -- Sam Steingold (http://sds.podval.org/) on Ubuntu 9.04 (jaunty) http://palestinefacts.org http://ffii.org http://iris.org.il http://honestreporting.com http://www.memritv.org http://thereligionofpeace.com Yeah, yeah, I love cats too... wanna trade recipes? |
From: N. R. <ra...@mr...> - 2009-10-12 12:04:31
|
At 2009-10-11T23:46:31-04:00, Sam Steingold wrote: > you can't. > clisp streams are based on OS file handles, not stdio.h. > it is possible to get the handle and wrap it into stdio.h FILE, but > the interaction of clisp stream buffering and FILE buffering will have > "interesting" consequences. > > try > http://clisp.podval.org/impnotes/syscalls.html#stdio > for ffi. Thanks. I saw the note about the `PQTrace' example there. Using the `syscalls' module for dealing with foreign I/O seems to be complicated. My question was motivated by libxml2, where the error-reporting functions can be customized. I'll try to use that feature to get around this problem. Regards, Raghavendra. -- N. Raghavendra <ra...@mr...> | http://www.retrotexts.net/ Harish-Chandra Research Institute | http://www.mri.ernet.in/ See message headers for contact and OpenPGP information. |
From: Sam S. <sd...@gn...> - 2009-10-12 21:37:53
|
N. Raghavendra wrote: > > Thanks. I saw the note about the `PQTrace' example there. Using the > `syscalls' module for dealing with foreign I/O seems to be complicated. complicated?? the syscalls is a "base" module, i.e., you are not likely to encounter a clisp without it. |