diff options
| author | Lorry Tar Creator <lorry-tar-importer@baserock.org> | 2009-08-18 20:56:02 +0000 |
|---|---|---|
| committer | Lorry <lorry@roadtrain.codethink.co.uk> | 2012-09-25 16:59:08 +0000 |
| commit | 9f8a09ed743cedd9547bf0661d518647966ab114 (patch) | |
| tree | 9c7803d3b27a8ec22e91792ac7f7932efa128b20 /Examples/guile/port | |
| download | swig-tarball-master.tar.gz | |
Imported from /srv/lorry/lorry-area/swig-tarball/swig-1.3.40.tar.gz.HEADswig-1.3.40master
Diffstat (limited to 'Examples/guile/port')
| -rw-r--r-- | Examples/guile/port/Makefile | 18 | ||||
| -rw-r--r-- | Examples/guile/port/README | 2 | ||||
| -rw-r--r-- | Examples/guile/port/port.c | 18 | ||||
| -rw-r--r-- | Examples/guile/port/port.i | 15 | ||||
| -rw-r--r-- | Examples/guile/port/port.scm | 32 |
5 files changed, 85 insertions, 0 deletions
diff --git a/Examples/guile/port/Makefile b/Examples/guile/port/Makefile new file mode 100644 index 0000000..824f3f8 --- /dev/null +++ b/Examples/guile/port/Makefile @@ -0,0 +1,18 @@ +SRCS = port.c +TARGET = port +IFILE = port.i +MKDIR = .. + + +all:: + $(MAKE) -f $(MKDIR)/Makefile \ + SRCS='$(SRCS)' \ + TARGET=$(TARGET) \ + IFILE=$(IFILE) \ + MODULE=$(MODULE) \ + sub-all + +clean:: + $(MAKE) -f $(MKDIR)/Makefile TARGET='$(TARGET)' guile_clean + +check: all diff --git a/Examples/guile/port/README b/Examples/guile/port/README new file mode 100644 index 0000000..5ed0199 --- /dev/null +++ b/Examples/guile/port/README @@ -0,0 +1,2 @@ +This example illustrates the translation from Scheme file ports to +temporary FILE streams. Read the source and run ./port -s port.scm diff --git a/Examples/guile/port/port.c b/Examples/guile/port/port.c new file mode 100644 index 0000000..95867b6 --- /dev/null +++ b/Examples/guile/port/port.c @@ -0,0 +1,18 @@ +#include <stdio.h> +#include <errno.h> + +void print_int(FILE *f, int i) +{ + if (fprintf(f, "%d\n", i)<0) + perror("print_int"); +} + +int read_int(FILE *f) +{ + int i; + if (fscanf(f, "%d", &i)!=1) { + fprintf(stderr, "read_int: error reading from file\n"); + perror("read_int"); + } + return i; +} diff --git a/Examples/guile/port/port.i b/Examples/guile/port/port.i new file mode 100644 index 0000000..eb75391 --- /dev/null +++ b/Examples/guile/port/port.i @@ -0,0 +1,15 @@ +%module port + +%include guilemain.i + +/* Include the required FILE * typemaps */ +%include ports.i + +%{ +#include <stdio.h> +%} + +%inline %{ +void print_int(FILE *f, int i); +int read_int(FILE *f); +%} diff --git a/Examples/guile/port/port.scm b/Examples/guile/port/port.scm new file mode 100644 index 0000000..68e9b8e --- /dev/null +++ b/Examples/guile/port/port.scm @@ -0,0 +1,32 @@ +;; Call with standard output +(print-int (current-output-port) 314159) + +;; Redirection to a file. Note that the port is automatically flushed +;; (via force-output) before calling the C function, and that the C +;; function gets a temporary "FILE" stream, which is closed after the +;; call. So you can simply mix Scheme and C output. +(with-output-to-file "test.out" + (lambda () + (display 4711) + (newline) + (print-int (current-output-port) 314159) + (display 815) + (newline))) + +;; Redirection to a string or soft port won't work -- +;; we can only handle file ports. +(catch #t + (lambda () + (with-output-to-string + (lambda () + (print-int (current-output-port) 314159)))) + (lambda args + (write args) (newline))) + +;; Read from a file port. Note that it is a bad idea to mix Scheme and +;; C input because of buffering. +(with-input-from-file "test.out" + (lambda () + (display (read-int (current-input-port))) + (newline))) + |
