* __scm.h, alist.c, alist.h, append.c, append.h, appinit.c,
[bpt/guile.git] / libguile / vports.c
CommitLineData
0f2d19dd
JB
1/* Copyright (C) 1995,1996 Free Software Foundation, Inc.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2, or (at your option)
6 * any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this software; see the file COPYING. If not, write to
15 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
16 *
17 * As a special exception, the Free Software Foundation gives permission
18 * for additional uses of the text contained in its release of GUILE.
19 *
20 * The exception is that, if you link the GUILE library with other files
21 * to produce an executable, this does not by itself cause the
22 * resulting executable to be covered by the GNU General Public License.
23 * Your use of that executable is in no way restricted on account of
24 * linking the GUILE library code into it.
25 *
26 * This exception does not however invalidate any other reasons why
27 * the executable file might be covered by the GNU General Public License.
28 *
29 * This exception applies only to the code released by the
30 * Free Software Foundation under the name GUILE. If you copy
31 * code from other Free Software Foundation releases into a copy of
32 * GUILE, as the General Public License permits, the exception does
33 * not apply to the code that you add in this way. To avoid misleading
34 * anyone as to the status of such modified files, you must delete
35 * this exception notice from them.
36 *
37 * If you write modifications of your own for GUILE, it is your choice
38 * whether to permit this exception to apply to your modifications.
39 * If you do not wish that, delete this exception notice.
40 */
41\f
42
43#include <stdio.h>
44#include "_scm.h"
20e6290e
JB
45#include "eval.h"
46#include "chars.h"
47#include "fports.h"
48
49#include "vports.h"
0f2d19dd 50
95b88819
GH
51#ifdef HAVE_STRING_H
52#include <string.h>
53#endif
54
0f2d19dd
JB
55\f
56
57/* {Ports - soft ports}
58 *
59 */
60
61
62#ifdef __STDC__
63static int
64prinsfpt (SCM exp, SCM port, int writing)
65#else
66static int
67prinsfpt (exp, port, writing)
68 SCM exp;
69 SCM port;
70 int writing;
71#endif
72{
73 scm_prinport (exp, port, "soft");
74 return !0;
75}
76
77/* sfputc sfwrite sfputs sfclose
78 * are called within a SCM_SYSCALL.
79 *
80 * So we need to set errno to 0 before returning. sfflush
81 * may be called within a SCM_SYSCALL. So we need to set errno to 0
82 * before returning.
83 */
84
85#ifdef __STDC__
86static int
87sfputc (int c, SCM p)
88#else
89static int
90sfputc (c, p)
91 int c;
92 SCM p;
93#endif
94{
95 scm_apply (SCM_VELTS (p)[0], SCM_MAKICHR (c), scm_listofnull);
96 errno = 0;
97 return c;
98}
99
100#ifdef __STDC__
101static scm_sizet
102sfwrite (char *str, scm_sizet siz, scm_sizet num, SCM p)
103#else
104static scm_sizet
105sfwrite (str, siz, num, p)
106 char *str;
107 scm_sizet siz;
108 scm_sizet num;
109 SCM p;
110#endif
111{
112 SCM sstr;
113 sstr = scm_makfromstr (str, siz * num, 0);
114 scm_apply (SCM_VELTS (p)[1], sstr, scm_listofnull);
115 errno = 0;
116 return num;
117}
118
119#ifdef __STDC__
120static int
121sfputs (char *s, SCM p)
122#else
123static int
124sfputs (s, p)
125 char *s;
126 SCM p;
127#endif
128{
129 sfwrite (s, 1, strlen (s), p);
130 return 0;
131}
132
133#ifdef __STDC__
134static int
135sfflush (SCM stream)
136#else
137static int
138sfflush (stream)
139 SCM stream;
140#endif
141{
142 SCM f = SCM_VELTS (stream)[2];
143 if (SCM_BOOL_F == f)
144 return 0;
145 f = scm_apply (f, SCM_EOL, SCM_EOL);
146 errno = 0;
147 return SCM_BOOL_F == f ? EOF : 0;
148}
149
150#ifdef __STDC__
151static int
152sfgetc (SCM p)
153#else
154static int
155sfgetc (p)
156 SCM p;
157#endif
158{
159 SCM ans;
160 ans = scm_apply (SCM_VELTS (p)[3], SCM_EOL, SCM_EOL);
161 errno = 0;
162 if (SCM_FALSEP (ans) || SCM_EOF_VAL == ans)
163 return EOF;
164 SCM_ASSERT (SCM_ICHRP (ans), ans, SCM_ARG1, "getc");
165 return SCM_ICHR (ans);
166}
167
168#ifdef __STDC__
169static int
170sfclose (SCM p)
171#else
172static int
173sfclose (p)
174 SCM p;
175#endif
176{
177 SCM f = SCM_VELTS (p)[4];
178 if (SCM_BOOL_F == f)
179 return 0;
180 f = scm_apply (f, SCM_EOL, SCM_EOL);
181 errno = 0;
182 return SCM_BOOL_F == f ? EOF : 0;
183}
184
185
186
187SCM_PROC(s_make_soft_port, "make-soft-port", 2, 0, 0, scm_make_soft_port);
188#ifdef __STDC__
189SCM
190scm_make_soft_port (SCM pv, SCM modes)
191#else
192SCM
193scm_make_soft_port (pv, modes)
194 SCM pv;
195 SCM modes;
196#endif
197{
198 struct scm_port_table * pt;
199 SCM z;
200 SCM_ASSERT (SCM_NIMP (pv) && SCM_VECTORP (pv) && 5 == SCM_LENGTH (pv), pv, SCM_ARG1, s_make_soft_port);
201 SCM_ASSERT (SCM_NIMP (modes) && SCM_STRINGP (modes), modes, SCM_ARG2, s_make_soft_port);
202 SCM_NEWCELL (z);
203 SCM_DEFER_INTS;
204 pt = scm_add_to_port_table (z);
205 SCM_CAR (z) = scm_tc16_sfport | scm_mode_bits (SCM_CHARS (modes));
206 SCM_SETPTAB_ENTRY (z, pt);
207 SCM_SETSTREAM (z, pv);
208 SCM_ALLOW_INTS;
209 return z;
210}
211
212#ifdef __STDC__
213static int
214noop0 (FILE *stream)
215#else
216static int
217noop0 (stream)
218 FILE *stream;
219#endif
220{
221 return 0;
222}
223
224
225scm_ptobfuns scm_sfptob =
226{
227 scm_markstream,
228 noop0,
229 prinsfpt,
230 0,
231 sfputc,
232 sfputs,
233 sfwrite,
234 sfflush,
235 sfgetc,
236 sfclose
237};
238
239
240#ifdef __STDC__
241void
242scm_init_vports (void)
243#else
244void
245scm_init_vports ()
246#endif
247{
248#include "vports.x"
249}
250