* pairs.h, eval.c, eval.h, feature.c, gc.c, list.c, load.c,
[bpt/guile.git] / libguile / read.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 "extchrs.h"
44#include <stdio.h>
45#include "_scm.h"
20e6290e
JB
46#include "chars.h"
47#include "genio.h"
48#include "eval.h"
49#include "unif.h"
50#include "mbstrings.h"
51#include "kw.h"
52#include "alist.h"
09a4f039
MD
53#include "srcprop.h"
54#include "hashtab.h"
55#include "hash.h"
20e6290e 56
0f2d19dd
JB
57#include "read.h"
58
59\f
60
61#define default_case_i 0
62
63\f
64
a16f6fe7 65scm_option scm_read_opts[] = {
b7ff98dd
MD
66 { SCM_OPTION_BOOLEAN, "copy", 0,
67 "Copy source code expressions." },
294d3806 68 { SCM_OPTION_BOOLEAN, "positions", 1,
b7ff98dd 69 "Record positions of source code expressions." }
a16f6fe7
MD
70};
71
b7ff98dd 72SCM_PROC (s_read_options, "read-options-interface", 0, 1, 0, scm_read_options);
1cc91f1b 73
a16f6fe7 74SCM
b7ff98dd
MD
75scm_read_options (setting)
76 SCM setting;
a16f6fe7 77{
b7ff98dd
MD
78 SCM ans = scm_options (setting,
79 scm_read_opts,
80 SCM_N_READ_OPTIONS,
81 s_read_options);
82 if (SCM_COPY_SOURCE_P)
83 SCM_RECORD_POSITIONS_P = 1;
a16f6fe7
MD
84 return ans;
85}
a16f6fe7 86
0f2d19dd 87SCM_PROC (s_read, "read", 0, 3, 0, scm_read);
1cc91f1b 88
0f2d19dd 89SCM
95b88819 90scm_read (port, case_insensitive_p, sharp)
0f2d19dd 91 SCM port;
95b88819 92 SCM case_insensitive_p;
0f2d19dd 93 SCM sharp;
0f2d19dd
JB
94{
95 int c;
09a4f039 96 SCM tok_buf, copy;
0f2d19dd
JB
97 int case_i;
98
99 if (SCM_UNBNDP (port))
100 port = scm_cur_inp;
101 else
09a4f039
MD
102 SCM_ASSERT (SCM_NIMP (port) && SCM_OPINPORTP (port),
103 port,
104 SCM_ARG1,
105 s_read);
0f2d19dd 106
95b88819 107 case_i = (SCM_UNBNDP (case_insensitive_p)
0f2d19dd 108 ? default_case_i
95b88819 109 : (case_insensitive_p == SCM_BOOL_F));
0f2d19dd
JB
110
111 if (SCM_UNBNDP (sharp))
112 sharp = SCM_BOOL_F;
113
114 c = scm_flush_ws (port, (char *) NULL);
115 if (EOF == c)
116 return SCM_EOF_VAL;
117 scm_gen_ungetc (c, port);
118
119 tok_buf = scm_makstr (30L, 0);
09a4f039 120 return scm_lreadr (&tok_buf, port, case_i, sharp, &copy);
0f2d19dd
JB
121}
122
123
1cc91f1b 124
0f2d19dd
JB
125char *
126scm_grow_tok_buf (tok_buf)
127 SCM * tok_buf;
0f2d19dd 128{
85ab9947 129 scm_vector_set_length_x (*tok_buf, SCM_MAKINUM (2 * SCM_LENGTH (*tok_buf)));
0f2d19dd
JB
130 return SCM_CHARS (*tok_buf);
131}
132
133
1cc91f1b 134
0f2d19dd
JB
135int
136scm_flush_ws (port, eoferr)
137 SCM port;
138 char *eoferr;
0f2d19dd
JB
139{
140 register int c;
141 while (1)
142 switch (c = scm_gen_getc (port))
143 {
144 case EOF:
145 goteof:
146 if (eoferr)
147 scm_wta (SCM_UNDEFINED, "end of file in ", eoferr);
148 return c;
149 case ';':
150 lp:
151 switch (c = scm_gen_getc (port))
152 {
153 case EOF:
154 goto goteof;
155 default:
156 goto lp;
157 case SCM_LINE_INCREMENTORS:
158 break;
159 }
160 break;
161 case SCM_LINE_INCREMENTORS:
0f2d19dd 162 case SCM_SINGLE_SPACES:
0f2d19dd 163 case '\t':
0f2d19dd
JB
164 break;
165 default:
166 return c;
167 }
168}
169
170
1cc91f1b 171
0f2d19dd
JB
172int
173scm_casei_streq (s1, s2)
174 char * s1;
175 char * s2;
0f2d19dd
JB
176{
177 while (*s1 && *s2)
178 if (scm_downcase((int)*s1) != scm_downcase((int)*s2))
179 return 0;
180 else
181 {
182 ++s1;
183 ++s2;
184 }
185 return !(*s1 || *s2);
186}
187
188
09a4f039
MD
189/* recsexpr is used when recording expressions
190 * constructed by read:sharp.
191 */
1cc91f1b
JB
192
193static SCM recsexpr SCM_P ((SCM obj, int line, int column, SCM filename));
194
09a4f039
MD
195static SCM
196recsexpr (obj, line, column, filename)
197 SCM obj;
198 int line;
199 int column;
200 SCM filename;
09a4f039
MD
201{
202 if (SCM_IMP (obj) || SCM_NCONSP(obj))
203 return obj;
204 {
205 SCM tmp = obj, copy;
206 /* If this sexpr is visible in the read:sharp source, we want to
207 keep that information, so only record non-constant cons cells
208 which haven't previously been read by the reader. */
209 if (SCM_FALSEP (scm_whash_lookup (scm_source_whash, obj)))
210 {
211 if (SCM_COPY_SOURCE_P)
212 {
213 copy = scm_cons (recsexpr (SCM_CAR (obj), line, column, filename),
214 SCM_UNDEFINED);
215 while (SCM_NIMP (tmp = SCM_CDR (tmp)) && SCM_CONSP (tmp))
216 copy = (SCM_CDR (copy) = scm_cons (recsexpr (SCM_CAR (tmp),
217 line,
218 column,
219 filename),
220 SCM_UNDEFINED));
221 SCM_CDR (copy) = tmp;
222 }
223 else
224 {
225 recsexpr (SCM_CAR (obj), line, column, filename);
226 while (SCM_NIMP (tmp = SCM_CDR (tmp)) && SCM_CONSP (tmp))
227 recsexpr (SCM_CAR (tmp), line, column, filename);
228 copy = SCM_UNDEFINED;
229 }
230 scm_whash_insert (scm_source_whash,
231 obj,
232 scm_make_srcprops (line,
233 column,
234 filename,
235 copy,
236 SCM_EOL));
237 }
238 return obj;
239 }
240}
241
242static char s_list[]="list";
1cc91f1b 243
0f2d19dd 244SCM
09a4f039
MD
245scm_lreadr (tok_buf, port, case_i, sharp, copy)
246 SCM *tok_buf;
0f2d19dd
JB
247 SCM port;
248 int case_i;
249 SCM sharp;
09a4f039 250 SCM *copy;
0f2d19dd
JB
251{
252 int c;
253 scm_sizet j;
254 SCM p;
255
256tryagain:
257 c = scm_flush_ws (port, s_read);
258 switch (c)
259 {
260 case EOF:
261 return SCM_EOF_VAL;
262
263 case '(':
09a4f039
MD
264 return SCM_RECORD_POSITIONS_P
265 ? scm_lreadrecparen (tok_buf, port, s_list, case_i, sharp, copy)
266 : scm_lreadparen (tok_buf, port, s_list, case_i, sharp, copy);
0f2d19dd
JB
267 case ')':
268 scm_wta (SCM_UNDEFINED, "unexpected \")\"", "read");
269 goto tryagain;
270
271 case '\'':
09a4f039
MD
272 p = scm_i_quote;
273 goto recquote;
0f2d19dd 274 case '`':
09a4f039
MD
275 p = scm_i_quasiquote;
276 goto recquote;
0f2d19dd
JB
277 case ',':
278 c = scm_gen_getc (port);
279 if ('@' == c)
280 p = scm_i_uq_splicing;
281 else
282 {
283 scm_gen_ungetc (c, port);
284 p = scm_i_unquote;
285 }
09a4f039
MD
286 recquote:
287 p = scm_cons2 (p,
288 scm_lreadr (tok_buf, port, case_i, sharp, copy),
289 SCM_EOL);
290 if (SCM_RECORD_POSITIONS_P)
291 scm_whash_insert (scm_source_whash,
292 p,
293 scm_make_srcprops (SCM_LINUM (port),
294 SCM_COL (port) - 1,
295 SCM_FILENAME (port),
296 SCM_COPY_SOURCE_P
297 ? (*copy = scm_cons2 (SCM_CAR (p),
298 SCM_CAR (SCM_CDR (p)),
299 SCM_EOL))
300 : SCM_UNDEFINED,
301 SCM_EOL));
302 return p;
0f2d19dd
JB
303 case '#':
304 c = scm_gen_getc (port);
305 switch (c)
306 {
307 case '(':
09a4f039 308 p = scm_lreadparen (tok_buf, port, "vector", case_i, sharp, copy);
0f2d19dd
JB
309 return SCM_NULLP (p) ? scm_nullvect : scm_vector (p);
310
311 case 't':
312 case 'T':
313 return SCM_BOOL_T;
314 case 'f':
315 case 'F':
316 return SCM_BOOL_F;
317
318 case 'b':
319 case 'B':
320 case 'o':
321 case 'O':
322 case 'd':
323 case 'D':
324 case 'x':
325 case 'X':
326 case 'i':
327 case 'I':
328 case 'e':
329 case 'E':
330 scm_gen_ungetc (c, port);
331 c = '#';
332 goto num;
333
334 case '*':
335 j = scm_read_token (c, tok_buf, port, case_i, 0);
336 p = scm_istr2bve (SCM_CHARS (*tok_buf) + 1, (long) (j - 1));
337 if (SCM_NFALSEP (p))
338 return p;
339 else
340 goto unkshrp;
341
342 case '{':
343 j = scm_read_token (c, tok_buf, port, case_i, 1);
344 p = scm_intern (SCM_CHARS (*tok_buf), j);
345 if (SCM_PORT_REPRESENTATION (port) != scm_regular_port)
346 scm_set_symbol_multi_byte_x (SCM_CAR (p), SCM_BOOL_T);
347 return SCM_CAR (p);
348
349 case '\\':
350 c = scm_gen_getc (port);
351 j = scm_read_token (c, tok_buf, port, case_i, 0);
352 if (j == 1)
353 return SCM_MAKICHR (c);
354 if (c >= '0' && c < '8')
355 {
356 p = scm_istr2int (SCM_CHARS (*tok_buf), (long) j, 8);
357 if (SCM_NFALSEP (p))
358 return SCM_MAKICHR (SCM_INUM (p));
359 }
360 for (c = 0; c < scm_n_charnames; c++)
361 if (scm_charnames[c]
362 && (scm_casei_streq (scm_charnames[c], SCM_CHARS (*tok_buf))))
363 return SCM_MAKICHR (scm_charnums[c]);
364 scm_wta (SCM_UNDEFINED, "unknown # object: #\\", SCM_CHARS (*tok_buf));
365
366
367 default:
368 callshrp:
369 if (SCM_NIMP (sharp))
370 {
09a4f039
MD
371 int line = SCM_LINUM (port);
372 int column = SCM_COL (port) - 2;
0f2d19dd 373 SCM got;
09a4f039
MD
374 got = scm_apply (sharp,
375 SCM_MAKICHR (c),
376 scm_acons (port, SCM_EOL, SCM_EOL));
0f2d19dd
JB
377 if (SCM_UNSPECIFIED == got)
378 goto unkshrp;
09a4f039
MD
379 if (SCM_RECORD_POSITIONS_P)
380 return *copy = recsexpr (got, line, column,
381 SCM_FILENAME (port));
382 else
383 return got;
0f2d19dd
JB
384 }
385 unkshrp:scm_wta ((SCM) SCM_MAKICHR (c), "unknown # object", "");
386 }
387
388 case '"':
389 j = 0;
390 while ('"' != (c = scm_gen_getc (port)))
391 {
392 SCM_ASSERT (EOF != c, SCM_UNDEFINED, "end of file in ", "string");
393
394 while (j + sizeof(xwchar_t) + XMB_CUR_MAX >= SCM_LENGTH (*tok_buf))
395 scm_grow_tok_buf (tok_buf);
396
397 if (c == '\\')
398 switch (c = scm_gen_getc (port))
399 {
400 case '\n':
401 continue;
402 case '0':
403 c = '\0';
404 break;
405 case 'f':
406 c = '\f';
407 break;
408 case 'n':
409 c = '\n';
410 break;
411 case 'r':
412 c = '\r';
413 break;
414 case 't':
415 c = '\t';
416 break;
417 case 'a':
418 c = '\007';
419 break;
420 case 'v':
421 c = '\v';
422 break;
423 }
424 if (SCM_PORT_REPRESENTATION(port) == scm_regular_port)
425 {
426 SCM_CHARS (*tok_buf)[j] = c;
427 ++j;
428 }
429 else
430 {
431 int len;
432 len = xwctomb (SCM_CHARS (*tok_buf) + j, c);
433 if (len == 0)
434 len = 1;
435 SCM_ASSERT (len > 0, SCM_MAKINUM (c), "bogus char", "read");
436 j += len;
437 }
438 }
439 if (j == 0)
440 return scm_nullstr;
441 SCM_CHARS (*tok_buf)[j] = 0;
442 {
443 SCM str;
444 str = scm_makfromstr (SCM_CHARS (*tok_buf), j, 0);
445 if (SCM_PORT_REPRESENTATION(port) != scm_regular_port)
446 {
447 SCM_SETLENGTH (str, SCM_LENGTH (str), scm_tc7_mb_string);
448 }
449 return str;
450 }
451
452 case'0':case '1':case '2':case '3':case '4':
453 case '5':case '6':case '7':case '8':case '9':
454 case '.':
455 case '-':
456 case '+':
457 num:
458 j = scm_read_token (c, tok_buf, port, case_i, 0);
459 p = scm_istring2number (SCM_CHARS (*tok_buf), (long) j, 10L);
460 if (SCM_NFALSEP (p))
461 return p;
462 if (c == '#')
463 {
464 if ((j == 2) && (scm_gen_getc (port) == '('))
465 {
466 scm_gen_ungetc ('(', port);
467 c = SCM_CHARS (*tok_buf)[1];
468 goto callshrp;
469 }
470 scm_wta (SCM_UNDEFINED, "unknown # object", SCM_CHARS (*tok_buf));
471 }
472 goto tok;
473
474 case ':':
475 j = scm_read_token ('-', tok_buf, port, case_i, 0);
476 p = scm_intern (SCM_CHARS (*tok_buf), j);
477 if (SCM_PORT_REPRESENTATION (port) != scm_regular_port)
478 scm_set_symbol_multi_byte_x (SCM_CAR (p), SCM_BOOL_T);
479 return scm_make_keyword_from_dash_symbol (SCM_CAR (p));
480
481 default:
482 j = scm_read_token (c, tok_buf, port, case_i, 0);
483 /* fallthrough */
484
485 tok:
486 p = scm_intern (SCM_CHARS (*tok_buf), j);
487 if (SCM_PORT_REPRESENTATION (port) != scm_regular_port)
488 scm_set_symbol_multi_byte_x (SCM_CAR (p), SCM_BOOL_T);
489 return SCM_CAR (p);
490 }
491}
492
493#ifdef _UNICOS
494_Pragma ("noopt"); /* # pragma _CRI noopt */
495#endif
1cc91f1b 496
0f2d19dd 497scm_sizet
1cc91f1b 498scm_read_token (ic, tok_buf, port, case_i, weird)
0f2d19dd
JB
499 int ic;
500 SCM *tok_buf;
501 SCM port;
502 int case_i;
503 int weird;
0f2d19dd
JB
504{
505 register scm_sizet j;
506 register int c;
507 register char *p;
508
509 c = ic;
510 p = SCM_CHARS (*tok_buf);
511
512 if (weird)
513 j = 0;
514 else
515 {
516 j = 0;
517 while (j + sizeof(xwchar_t) + XMB_CUR_MAX >= SCM_LENGTH (*tok_buf))
518 p = scm_grow_tok_buf (tok_buf);
519 if (SCM_PORT_REPRESENTATION(port) == scm_regular_port)
520 {
521 p[j] = c;
522 ++j;
523 }
524 else
525 {
526 int len;
527 len = xwctomb (p + j, c);
528 if (len == 0)
529 len = 1;
530 SCM_ASSERT (len > 0, SCM_MAKINUM (c), "bogus char", "read");
531 j += len;
532 }
533 }
534
535 while (1)
536 {
537 while (j + sizeof(xwchar_t) + XMB_CUR_MAX >= SCM_LENGTH (*tok_buf))
538 p = scm_grow_tok_buf (tok_buf);
539 c = scm_gen_getc (port);
540 switch (c)
541 {
542 case '(':
543 case ')':
544 case '"':
545 case ';':
546 case SCM_WHITE_SPACES:
547 case SCM_LINE_INCREMENTORS:
548 if (weird)
549 goto default_case;
550
551 scm_gen_ungetc (c, port);
552 case EOF:
553 eof_case:
554 p[j] = 0;
555 return j;
556 case '\\':
557 if (!weird)
558 goto default_case;
559 else
560 {
561 c = scm_gen_getc (port);
562 if (c == EOF)
563 goto eof_case;
564 else
565 goto default_case;
566 }
567 case '}':
568 if (!weird)
569 goto default_case;
570
571 c = scm_gen_getc (port);
572 if (c == '#')
573 {
574 p[j] = 0;
575 return j;
576 }
577 else
578 {
579 scm_gen_ungetc (c, port);
580 c = '}';
581 goto default_case;
582 }
583
584 default:
585 default_case:
586 {
587 c = (case_i ? scm_downcase(c) : c);
588 if (SCM_PORT_REPRESENTATION(port) == scm_regular_port)
589 {
590 p[j] = c;
591 ++j;
592 }
593 else
594 {
595 int len;
596 len = xwctomb (p + j, c);
597 if (len == 0)
598 len = 1;
599 SCM_ASSERT (len > 0, SCM_MAKINUM (c), "bogus char", "read");
600 j += len;
601 }
602 }
603
604 }
605 }
606}
1cc91f1b 607
0f2d19dd
JB
608#ifdef _UNICOS
609_Pragma ("opt"); /* # pragma _CRI opt */
610#endif
611
0f2d19dd 612SCM
1cc91f1b 613scm_lreadparen (tok_buf, port, name, case_i, sharp, copy)
0f2d19dd
JB
614 SCM *tok_buf;
615 SCM port;
616 char *name;
617 int case_i;
618 SCM sharp;
1cc91f1b 619 SCM *copy;
0f2d19dd
JB
620{
621 SCM tmp;
622 SCM tl;
623 SCM ans;
624 int c;
625
626 c = scm_flush_ws (port, name);
627 if (')' == c)
628 return SCM_EOL;
629 scm_gen_ungetc (c, port);
09a4f039 630 if (scm_i_dot == (tmp = scm_lreadr (tok_buf, port, case_i, sharp, copy)))
0f2d19dd 631 {
09a4f039 632 ans = scm_lreadr (tok_buf, port, case_i, sharp, copy);
0f2d19dd
JB
633 closeit:
634 if (')' != (c = scm_flush_ws (port, name)))
635 scm_wta (SCM_UNDEFINED, "missing close paren", "");
636 return ans;
637 }
638 ans = tl = scm_cons (tmp, SCM_EOL);
639 while (')' != (c = scm_flush_ws (port, name)))
640 {
641 scm_gen_ungetc (c, port);
09a4f039 642 if (scm_i_dot == (tmp = scm_lreadr (tok_buf, port, case_i, sharp, copy)))
0f2d19dd 643 {
09a4f039 644 SCM_CDR (tl) = scm_lreadr (tok_buf, port, case_i, sharp, copy);
0f2d19dd
JB
645 goto closeit;
646 }
647 tl = (SCM_CDR (tl) = scm_cons (tmp, SCM_EOL));
648 }
649 return ans;
650}
651
1cc91f1b 652
09a4f039
MD
653SCM
654scm_lreadrecparen (tok_buf, port, name, case_i, sharp, copy)
655 SCM *tok_buf;
656 SCM port;
657 char *name;
658 int case_i;
659 SCM sharp;
660 SCM *copy;
09a4f039
MD
661{
662 register int c;
663 register SCM tmp;
664 register SCM tl, tl2;
665 SCM ans, ans2;
666 /* Need to capture line and column numbers here. */
667 int line = SCM_LINUM (port);
668 int column = SCM_COL (port) - 1;
669
670 c = scm_flush_ws (port, name);
671 if (')' == c)
672 return SCM_EOL;
673 scm_gen_ungetc (c, port);
674 if (scm_i_dot == (tmp = scm_lreadr (tok_buf, port, case_i, sharp, copy)))
675 {
676 ans = scm_lreadr (tok_buf, port, case_i, sharp, copy);
677 if (')' != (c = scm_flush_ws (port, name)))
678 scm_wta (SCM_UNDEFINED, "missing close paren", "");
679 return ans;
680 }
681 /* Build the head of the list structure. */
682 ans = tl = scm_cons (tmp, SCM_EOL);
683 if (SCM_COPY_SOURCE_P)
684 ans2 = tl2 = scm_cons (SCM_NIMP (tmp) && SCM_CONSP (tmp)
685 ? *copy
686 : tmp,
687 SCM_EOL);
688 while (')' != (c = scm_flush_ws (port, name)))
689 {
690 scm_gen_ungetc (c, port);
691 if (scm_i_dot == (tmp = scm_lreadr (tok_buf, port, case_i, sharp, copy)))
692 {
693 SCM_SETCDR (tl, tmp = scm_lreadr (tok_buf, port, case_i, sharp, copy));
694 if (SCM_COPY_SOURCE_P)
695 SCM_SETCDR (tl2, scm_cons (SCM_NIMP (tmp) && SCM_CONSP (tmp)
696 ? *copy
697 : tmp,
698 SCM_EOL));
699 if (')' != (c = scm_flush_ws (port, name)))
700 scm_wta (SCM_UNDEFINED, "missing close paren", "");
701 goto exit;
702 }
703 tl = SCM_SETCDR (tl, scm_cons (tmp, SCM_EOL));
704 if (SCM_COPY_SOURCE_P)
705 tl2 = SCM_SETCDR (tl2, scm_cons (SCM_NIMP (tmp) && SCM_CONSP (tmp)
706 ? *copy
707 : tmp,
708 SCM_EOL));
709 }
710exit:
711 scm_whash_insert (scm_source_whash,
712 ans,
713 scm_make_srcprops (line,
714 column,
715 SCM_FILENAME (port),
716 SCM_COPY_SOURCE_P
717 ? *copy = ans2
718 : SCM_UNDEFINED,
719 SCM_EOL));
720 return ans;
721}
722
0f2d19dd
JB
723
724\f
725
726
1cc91f1b 727
0f2d19dd
JB
728void
729scm_init_read ()
0f2d19dd 730{
b7ff98dd 731 scm_init_opts (scm_read_options, scm_read_opts, SCM_N_READ_OPTIONS);
0f2d19dd
JB
732#include "read.x"
733}