* stime.c (bdtime2c): Use SCM_LENGTH, not scm_vector_length; the
[bpt/guile.git] / libguile / strports.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
82892bed
JB
15 * the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
16 * Boston, MA 02111-1307 USA
0f2d19dd
JB
17 *
18 * As a special exception, the Free Software Foundation gives permission
19 * for additional uses of the text contained in its release of GUILE.
20 *
21 * The exception is that, if you link the GUILE library with other files
22 * to produce an executable, this does not by itself cause the
23 * resulting executable to be covered by the GNU General Public License.
24 * Your use of that executable is in no way restricted on account of
25 * linking the GUILE library code into it.
26 *
27 * This exception does not however invalidate any other reasons why
28 * the executable file might be covered by the GNU General Public License.
29 *
30 * This exception applies only to the code released by the
31 * Free Software Foundation under the name GUILE. If you copy
32 * code from other Free Software Foundation releases into a copy of
33 * GUILE, as the General Public License permits, the exception does
34 * not apply to the code that you add in this way. To avoid misleading
35 * anyone as to the status of such modified files, you must delete
36 * this exception notice from them.
37 *
38 * If you write modifications of your own for GUILE, it is your choice
39 * whether to permit this exception to apply to your modifications.
82892bed 40 * If you do not wish that, delete this exception notice. */
0f2d19dd
JB
41\f
42
43#include <stdio.h>
44#include "_scm.h"
20e6290e
JB
45#include "unif.h"
46#include "eval.h"
cd07a097 47#include "read.h"
20e6290e
JB
48
49#include "strports.h"
0f2d19dd 50
95b88819
GH
51#ifdef HAVE_STRING_H
52#include <string.h>
53#endif
54
0f2d19dd
JB
55\f
56
57/* {Ports - string ports}
58 *
59 */
60
1cc91f1b
JB
61
62static int prinstpt SCM_P ((SCM exp, SCM port, scm_print_state *pstate));
63
0f2d19dd 64static int
1cc91f1b 65prinstpt (exp, port, pstate)
0f2d19dd
JB
66 SCM exp;
67 SCM port;
1cc91f1b 68 scm_print_state *pstate;
0f2d19dd
JB
69{
70 scm_prinport (exp, port, "string");
71 return !0;
72}
73
1cc91f1b
JB
74
75static int stputc SCM_P ((int c, SCM p));
76
0f2d19dd
JB
77static int
78stputc (c, p)
79 int c;
80 SCM p;
0f2d19dd
JB
81{
82 scm_sizet ind = SCM_INUM (SCM_CAR (p));
83 SCM_DEFER_INTS;
84 if (ind >= SCM_LENGTH (SCM_CDR (p)))
85 scm_vector_set_length_x (SCM_CDR (p), SCM_MAKINUM (ind + (ind >> 1)));
86 SCM_ALLOW_INTS;
87 SCM_CHARS (SCM_CDR (p))[ind] = c;
a6c64c3c 88 SCM_SETCAR (p, SCM_MAKINUM (ind + 1));
0f2d19dd
JB
89 return c;
90}
91
1cc91f1b
JB
92
93static scm_sizet stwrite SCM_P ((char *str, scm_sizet siz, scm_sizet num, SCM p));
94
0f2d19dd
JB
95static scm_sizet
96stwrite (str, siz, num, p)
97 char *str;
98 scm_sizet siz;
99 scm_sizet num;
100 SCM p;
0f2d19dd
JB
101{
102 scm_sizet ind = SCM_INUM (SCM_CAR (p));
103 scm_sizet len = siz * num;
104 char *dst;
105 SCM_DEFER_INTS;
106 if (ind + len >= SCM_LENGTH (SCM_CDR (p)))
107 scm_vector_set_length_x (SCM_CDR (p), SCM_MAKINUM (ind + len + ((ind + len) >> 1)));
108 SCM_ALLOW_INTS;
109 dst = &(SCM_CHARS (SCM_CDR (p))[ind]);
110 while (len--)
111 dst[len] = str[len];
a6c64c3c 112 SCM_SETCAR (p, SCM_MAKINUM (ind + siz * num));
0f2d19dd
JB
113 return num;
114}
115
1cc91f1b
JB
116
117static int stputs SCM_P ((char *s, SCM p));
118
0f2d19dd
JB
119static int
120stputs (s, p)
121 char *s;
122 SCM p;
0f2d19dd
JB
123{
124 stwrite (s, 1, strlen (s), p);
125 return 0;
126}
127
1cc91f1b
JB
128
129static int stgetc SCM_P ((SCM p));
130
0f2d19dd
JB
131static int
132stgetc (p)
133 SCM p;
0f2d19dd
JB
134{
135 scm_sizet ind = SCM_INUM (SCM_CAR (p));
136 if (ind >= SCM_ROLENGTH (SCM_CDR (p)))
137 return EOF;
a6c64c3c 138 SCM_SETCAR (p, SCM_MAKINUM (ind + 1));
0f2d19dd
JB
139 return SCM_ROUCHARS (SCM_CDR (p))[ind];
140}
141
1cc91f1b 142
0f2d19dd
JB
143SCM
144scm_mkstrport (pos, str, modes, caller)
145 SCM pos;
146 SCM str;
147 long modes;
148 char * caller;
0f2d19dd
JB
149{
150 SCM z;
151 SCM stream;
152 struct scm_port_table * pt;
153
154 SCM_ASSERT(SCM_INUMP(pos) && SCM_INUM(pos) >= 0, pos, SCM_ARG1, caller);
155 SCM_ASSERT(SCM_NIMP(str) && SCM_ROSTRINGP(str), str, SCM_ARG1, caller);
156 stream = scm_cons(pos, str);
157 SCM_NEWCELL (z);
158 SCM_DEFER_INTS;
159 pt = scm_add_to_port_table (z);
a6c64c3c 160 SCM_SETCAR (z, scm_tc16_strport | modes);
0f2d19dd
JB
161 SCM_SETPTAB_ENTRY (z, pt);
162 SCM_SETSTREAM (z, stream);
163 SCM_ALLOW_INTS;
164 return z;
165}
166
167SCM_PROC(s_call_with_output_string, "call-with-output-string", 1, 0, 0, scm_call_with_output_string);
1cc91f1b 168
0f2d19dd
JB
169SCM
170scm_call_with_output_string (proc)
171 SCM proc;
0f2d19dd
JB
172{
173 SCM p;
174 p = scm_mkstrport(SCM_INUM0, scm_make_string(SCM_MAKINUM(30), SCM_UNDEFINED),
175 SCM_OPN | SCM_WRTNG,
176 s_call_with_output_string);
177 scm_apply (proc, p, scm_listofnull);
178 {
179 SCM answer;
180 SCM_DEFER_INTS;
181 answer = scm_makfromstr (SCM_CHARS (SCM_CDR (SCM_STREAM (p))),
182 SCM_INUM (SCM_CAR (SCM_STREAM (p))),
183 0);
184 SCM_ALLOW_INTS;
185 return answer;
186 }
187}
188
189
190
191/* Return a Scheme string obtained by printing a given object.
192 */
193
1cc91f1b 194
0f2d19dd
JB
195SCM
196scm_strprint_obj (obj)
197 SCM obj;
0f2d19dd
JB
198{
199 SCM str;
200 SCM port;
201
202 str = scm_makstr (64, 0);
203 port = scm_mkstrport (SCM_MAKINUM (0), str, SCM_OPN | SCM_WRTNG, "scm_strprint_obj");
87818069 204 scm_prin1 (obj, port, 1);
0f2d19dd
JB
205 {
206 SCM answer;
207 SCM_DEFER_INTS;
208 answer = scm_makfromstr (SCM_CHARS (SCM_CDR (SCM_STREAM (port))),
209 SCM_INUM (SCM_CAR (SCM_STREAM (port))),
210 0);
211 SCM_ALLOW_INTS;
212 return answer;
213 }
214}
215
216
217
218
219SCM_PROC(s_call_with_input_string, "call-with-input-string", 2, 0, 0, scm_call_with_input_string);
1cc91f1b 220
0f2d19dd
JB
221SCM
222scm_call_with_input_string (str, proc)
223 SCM str;
224 SCM proc;
0f2d19dd
JB
225{
226 SCM p = scm_mkstrport(SCM_INUM0, str, SCM_OPN | SCM_RDNG, s_call_with_input_string);
227 return scm_apply (proc, p, scm_listofnull);
228}
229
1cc91f1b 230
cd07a097 231
a8aa30d8
MD
232/* Given a null-terminated string EXPR containing a Scheme expression
233 read it, and return it as an SCM value. */
234SCM
235scm_read_0str (expr)
236 char *expr;
237{
238 SCM port = scm_mkstrport (SCM_MAKINUM (0),
239 scm_makfrom0str (expr),
240 SCM_OPN | SCM_RDNG,
241 "scm_eval_0str");
242 SCM form;
243
244 /* Read expressions from that port; ignore the values. */
deca31e1 245 form = scm_read (port);
a8aa30d8
MD
246
247 scm_close_port (port);
248 return form;
249}
250
cd07a097 251/* Given a null-terminated string EXPR containing Scheme program text,
a8aa30d8
MD
252 evaluate it, and return the result of the last expression evaluated. */
253SCM
cd07a097
JB
254scm_eval_0str (expr)
255 char *expr;
256{
b377f53e
JB
257 return scm_eval_string (scm_makfrom0str (expr));
258}
259
260
261SCM_PROC (s_eval_string, "eval-string", 1, 0, 0, scm_eval_string);
262
263SCM
264scm_eval_string (string)
265 SCM string;
266{
267 SCM port = scm_mkstrport (SCM_MAKINUM (0), string, SCM_OPN | SCM_RDNG,
cd07a097
JB
268 "scm_eval_0str");
269 SCM form;
b377f53e 270 SCM ans = SCM_UNSPECIFIED;
cd07a097
JB
271
272 /* Read expressions from that port; ignore the values. */
0c32d76c 273 while (!SCM_EOF_OBJECT_P (form = scm_read (port)))
a8aa30d8 274 ans = scm_eval_x (form);
cd07a097
JB
275
276 scm_close_port (port);
a8aa30d8 277 return ans;
cd07a097
JB
278}
279
280
b377f53e 281
1cc91f1b
JB
282static int noop0 SCM_P ((SCM stream));
283
0f2d19dd
JB
284static int
285noop0 (stream)
1cc91f1b 286 SCM stream;
0f2d19dd
JB
287{
288 return 0;
289}
290
291
292scm_ptobfuns scm_stptob =
293{
294 scm_markstream,
295 noop0,
296 prinstpt,
297 0,
298 stputc,
299 stputs,
300 stwrite,
301 noop0,
302 stgetc,
3cb988bd 303 scm_generic_fgets,
0f2d19dd
JB
304 0
305};
306
307
1cc91f1b 308
0f2d19dd
JB
309void
310scm_init_strports ()
0f2d19dd
JB
311{
312#include "strports.x"
313}
314