summaryrefslogtreecommitdiff
path: root/Examples/guile/port
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@baserock.org>2009-08-18 20:56:02 +0000
committerLorry <lorry@roadtrain.codethink.co.uk>2012-09-25 16:59:08 +0000
commit9f8a09ed743cedd9547bf0661d518647966ab114 (patch)
tree9c7803d3b27a8ec22e91792ac7f7932efa128b20 /Examples/guile/port
downloadswig-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/Makefile18
-rw-r--r--Examples/guile/port/README2
-rw-r--r--Examples/guile/port/port.c18
-rw-r--r--Examples/guile/port/port.i15
-rw-r--r--Examples/guile/port/port.scm32
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)))
+