*** empty log message ***
[bpt/guile.git] / libguile / print.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 "chars.h"
46#include "genio.h"
47#include "mbstrings.h"
48#include "smob.h"
49#include "eval.h"
50#include "procprop.h"
51#include "read.h"
52#include "weaks.h"
53#include "unif.h"
dbef8851 54#include "alist.h"
0f2d19dd 55
20e6290e 56#include "print.h"
0f2d19dd
JB
57\f
58
59/* {Names of immediate symbols}
60 *
61 * This table must agree with the declarations in scm.h: {Immediate Symbols}.
62 */
63
64char *scm_isymnames[] =
65{
66 /* This table must agree with the declarations */
67 "#@and",
68 "#@begin",
69 "#@case",
70 "#@cond",
71 "#@do",
72 "#@if",
73 "#@lambda",
74 "#@let",
75 "#@let*",
76 "#@letrec",
77 "#@or",
78 "#@quote",
79 "#@set!",
80 "#@define",
81#if 0
82 "#@literal-variable-ref",
83 "#@literal-variable-set!",
84#endif
85 "#@apply",
86 "#@call-with-current-continuation",
87
88 /* user visible ISYMS */
89 /* other keywords */
90 /* Flags */
91
92 "#f",
93 "#t",
94 "#<undefined>",
95 "#<eof>",
96 "()",
97 "#<unspecified>"
98};
99
e6e4c9af
MD
100#ifdef DEBUG_EXTENSIONS
101scm_option scm_print_opts[] = {
b7ff98dd
MD
102 { SCM_OPTION_BOOLEAN, "procnames", 0,
103 "Print names instead of closures." },
104 { SCM_OPTION_SCM, "closure-hook", SCM_BOOL_F,
105 "Procedure used to print closures." }
e6e4c9af
MD
106};
107
b7ff98dd 108SCM_PROC (s_print_options, "print-options-interface", 0, 1, 0, scm_print_options);
e6e4c9af
MD
109#ifdef __STDC__
110SCM
a51ea417 111scm_print_options (SCM setting)
e6e4c9af
MD
112#else
113SCM
a51ea417
MD
114scm_print_options (setting)
115 SCM setting;
e6e4c9af
MD
116#endif
117{
a51ea417 118 SCM ans = scm_options (setting,
b7ff98dd
MD
119 scm_print_opts,
120 SCM_N_PRINT_OPTIONS,
121 s_print_options);
e6e4c9af
MD
122 return ans;
123}
124#endif
125
0f2d19dd
JB
126\f
127/* {Printing of Scheme Objects}
128 */
129
a51ea417
MD
130/* Detection of circular references.
131 */
132typedef struct ref_stack {
133 SCM vector;
134 SCM *top;
135 SCM *ceiling;
136 SCM *floor;
137} ref_stack;
138
139#define RESET_REF_STACK(stack) { stack.top = stack.floor; }
140#define PUSH_REF(stack, obj, label) \
141{ \
142 register SCM *ref; \
143 for (ref = stack.floor; ref < stack.top; ++ref) \
144 if (*ref == (obj)) \
145 goto label; \
146 *stack.top++ = (obj); \
147 if (stack.top == stack.ceiling) \
148 grow_ref_stack (&stack); \
149} \
150
151#define POP_REF(stack) { --stack.top; }
152#define SAVE_REF_STACK(stack, save) \
153{ \
154 save = stack.floor - SCM_VELTS (stack.vector); \
155 stack.floor = stack.top; \
156} \
157
158#define RESTORE_REF_STACK(stack, save) \
159{ stack.floor = SCM_VELTS (stack.vector) + save; }
160
161#ifdef __STDC__
162static void
163init_ref_stack (ref_stack *stack)
164#else
165static void
166init_ref_stack (stack)
167 ref_stack *stack;
168#endif
169{
170 stack->vector = scm_permanent_object (scm_make_vector (SCM_MAKINUM (30L),
171 SCM_UNDEFINED,
172 SCM_UNDEFINED));
173 stack->top = stack->floor = SCM_VELTS (stack->vector);
174 stack->ceiling = stack->floor + SCM_LENGTH (stack->vector);
175}
176
177#ifdef __STDC__
178static void
179grow_ref_stack (ref_stack *stack)
180#else
181static void
182grow_ref_stack (stack)
183 ref_stack *stack;
184#endif
185{
186 int offset, new_size = 2 * SCM_LENGTH (stack->vector);
187 SCM *old_velts = SCM_VELTS (stack->vector);
188 scm_vector_set_length_x (stack->vector, SCM_MAKINUM (new_size));
189 offset = SCM_VELTS (stack->vector) - old_velts;
190 stack->top += offset;
191 stack->floor += offset;
192 stack->ceiling = SCM_VELTS (stack->vector) + new_size;
193}
194
195
0f2d19dd
JB
196/* Print generally. Handles both write and display according to WRITING.
197 */
a51ea417
MD
198
199static ref_stack pstack;
200
0f2d19dd
JB
201#ifdef __STDC__
202void
203scm_iprin1 (SCM exp, SCM port, int writing)
204#else
205void
206scm_iprin1 (exp, port, writing)
207 SCM exp;
208 SCM port;
209 int writing;
210#endif
211{
212 register long i;
213taloop:
214 switch (7 & (int) exp)
215 {
216 case 2:
217 case 6:
218 scm_intprint (SCM_INUM (exp), 10, port);
219 break;
220 case 4:
221 if (SCM_ICHRP (exp))
222 {
223 i = SCM_ICHR (exp);
224 scm_put_wchar (i, port, writing);
225
226 }
a51ea417 227 else if (SCM_IFLAGP (exp)
0f2d19dd 228 && (SCM_ISYMNUM (exp) < (sizeof scm_isymnames / sizeof (char *))))
08b5b88c 229 scm_gen_puts (scm_regular_string, SCM_ISYMCHARS (exp), port);
0f2d19dd
JB
230 else if (SCM_ILOCP (exp))
231 {
232 scm_gen_puts (scm_regular_string, "#@", port);
233 scm_intprint ((long) SCM_IFRAME (exp), 10, port);
234 scm_gen_putc (SCM_ICDRP (exp) ? '-' : '+', port);
235 scm_intprint ((long) SCM_IDIST (exp), 10, port);
236 }
237 else
238 goto idef;
239 break;
240 case 1:
241 /* gloc */
242 scm_gen_puts (scm_regular_string, "#@", port);
243 exp = SCM_CAR (exp - 1);
244 goto taloop;
245 default:
246 idef:
247 scm_ipruk ("immediate", exp, port);
248 break;
249 case 0:
250 switch (SCM_TYP7 (exp))
251 {
252 case scm_tcs_cons_gloc:
253
254 if (SCM_CDR (SCM_CAR (exp) - 1L) == 0)
255 {
a51ea417 256 scm_gen_write (scm_regular_string, "#<struct ", sizeof ("#<struct ") - 1, port);
0f2d19dd
JB
257 scm_intprint(exp, 16, port);
258 scm_gen_putc ('>', port);
259 break;
260 }
261
262 case scm_tcs_cons_imcar:
263 case scm_tcs_cons_nimcar:
a51ea417 264 PUSH_REF (pstack, exp, circref);
0f2d19dd 265 scm_iprlist ("(", exp, ')', port, writing);
a51ea417
MD
266 POP_REF (pstack);
267 break;
268 circref:
269 scm_gen_write (scm_regular_string, "#<circ ref>", sizeof ("#<circ ref>") - 1, port);
0f2d19dd
JB
270 break;
271 case scm_tcs_closures:
272#ifdef DEBUG_EXTENSIONS
a51ea417
MD
273 if (SCM_NFALSEP (scm_procedure_p (SCM_PRINT_CLOSURE)))
274 {
275 SCM ans = scm_cons2 (exp, port,
276 scm_cons (writing ? SCM_BOOL_T : SCM_BOOL_F, SCM_EOL));
277 int save;
278 SAVE_REF_STACK (pstack, save);
279 ans = scm_apply (SCM_PRINT_CLOSURE, ans, SCM_EOL);
280 RESTORE_REF_STACK (pstack, save);
281 }
282 else if (SCM_PRINT_PROCNAMES_P)
0f2d19dd
JB
283 {
284 SCM name;
285 name = scm_procedure_property (exp, scm_i_name);
286 scm_gen_puts (scm_regular_string, "#<procedure", port);
287 if (SCM_NFALSEP (name))
288 {
289 scm_gen_putc (' ', port);
290 /* FIXME */
291 scm_gen_puts (scm_regular_string, SCM_CHARS (name), port);
292 }
293 scm_gen_putc ('>', port);
294 }
295 else
296#endif
297 {
a51ea417
MD
298 SCM code = SCM_CODE (exp);
299 exp = scm_unmemocopy (code,
08b5b88c 300 SCM_EXTEND_ENV (SCM_CAR (code),
dbef8851
MD
301 SCM_EOL,
302 SCM_ENV (exp)));
0f2d19dd
JB
303 scm_iprlist ("#<CLOSURE ", exp, '>', port, writing);
304 }
305 break;
306 case scm_tc7_mb_string:
307 case scm_tc7_mb_substring:
308 scm_print_mb_string (exp, port, writing);
309 break;
310 case scm_tc7_substring:
311 case scm_tc7_string:
312 if (writing)
313 {
dbef8851 314 scm_gen_putc ('"', port);
0f2d19dd
JB
315 for (i = 0; i < SCM_ROLENGTH (exp); ++i)
316 switch (SCM_ROCHARS (exp)[i])
317 {
dbef8851 318 case '"':
0f2d19dd
JB
319 case '\\':
320 scm_gen_putc ('\\', port);
321 default:
322 scm_gen_putc (SCM_ROCHARS (exp)[i], port);
323 }
dbef8851 324 scm_gen_putc ('"', port);
0f2d19dd
JB
325 break;
326 }
327 else
328 scm_gen_write (scm_regular_string, SCM_ROCHARS (exp),
329 (scm_sizet) SCM_ROLENGTH (exp),
330 port);
331 break;
332 case scm_tcs_symbols:
333 if (SCM_MB_STRINGP (exp))
334 {
335 scm_print_mb_symbol (exp, port);
336 break;
337 }
338 else
339 {
340 int pos;
341 int end;
342 int len;
343 char * str;
344 int weird;
345 int maybe_weird;
346 int mw_pos;
347
348 len = SCM_LENGTH (exp);
349 str = SCM_CHARS (exp);
350 scm_remember (&exp);
351 pos = 0;
352 weird = 0;
353 maybe_weird = 0;
354
355 if (len == 0)
356 scm_gen_write (scm_regular_string, "#{}#", 4, port);
357
358 for (end = pos; end < len; ++end)
359 switch (str[end])
360 {
361#ifdef BRACKETS_AS_PARENS
362 case '[':
363 case ']':
364#endif
365 case '(':
366 case ')':
dbef8851 367 case '"':
0f2d19dd
JB
368 case ';':
369 case SCM_WHITE_SPACES:
370 case SCM_LINE_INCREMENTORS:
371 weird_handler:
372 if (maybe_weird)
373 {
374 end = mw_pos;
375 maybe_weird = 0;
376 }
377 if (!weird)
378 {
379 scm_gen_write (scm_regular_string, "#{", 2, port);
380 weird = 1;
381 }
382 if (pos < end)
383 {
384 scm_gen_write (scm_regular_string, str + pos, end - pos, port);
385 }
386 {
387 char buf[2];
388 buf[0] = '\\';
389 buf[1] = str[end];
390 scm_gen_write (scm_regular_string, buf, 2, port);
391 }
392 pos = end + 1;
393 break;
394 case '\\':
395 if (weird)
396 goto weird_handler;
397 if (!maybe_weird)
398 {
399 maybe_weird = 1;
400 mw_pos = pos;
401 }
402 break;
403 case '}':
404 case '#':
405 if (weird)
406 goto weird_handler;
407 break;
408 default:
409 break;
410 }
411 if (pos < end)
412 scm_gen_write (scm_regular_string, str + pos, end - pos, port);
413 if (weird)
414 scm_gen_write (scm_regular_string, "}#", 2, port);
415 break;
416 }
417 case scm_tc7_wvect:
a51ea417 418 PUSH_REF (pstack, exp, circref);
0f2d19dd
JB
419 if (SCM_IS_WHVEC (exp))
420 scm_gen_puts (scm_regular_string, "#wh(", port);
421 else
422 scm_gen_puts (scm_regular_string, "#w(", port);
423 goto common_vector_printer;
424
425 case scm_tc7_vector:
a51ea417 426 PUSH_REF (pstack, exp, circref);
0f2d19dd
JB
427 scm_gen_puts (scm_regular_string, "#(", port);
428 common_vector_printer:
429 for (i = 0; i + 1 < SCM_LENGTH (exp); ++i)
430 {
431 /* CHECK_INTS; */
432 scm_iprin1 (SCM_VELTS (exp)[i], port, writing);
433 scm_gen_putc (' ', port);
434 }
435 if (i < SCM_LENGTH (exp))
436 {
437 /* CHECK_INTS; */
438 scm_iprin1 (SCM_VELTS (exp)[i], port, writing);
439 }
440 scm_gen_putc (')', port);
a51ea417 441 POP_REF (pstack);
0f2d19dd
JB
442 break;
443 case scm_tc7_bvect:
444 case scm_tc7_byvect:
445 case scm_tc7_svect:
446 case scm_tc7_ivect:
447 case scm_tc7_uvect:
448 case scm_tc7_fvect:
449 case scm_tc7_dvect:
450 case scm_tc7_cvect:
451#ifdef LONGLONGS
452 case scm_tc7_llvect:
453#endif
454 scm_raprin1 (exp, port, writing);
455 break;
456 case scm_tcs_subrs:
457 scm_gen_puts (scm_regular_string, "#<primitive-procedure ", port);
458 scm_gen_puts ((SCM_MB_STRINGP (SCM_SNAME(exp))
459 ? scm_mb_string
460 : scm_regular_string),
461 SCM_CHARS (SCM_SNAME (exp)), port);
462 scm_gen_putc ('>', port);
463 break;
464#ifdef CCLO
465 case scm_tc7_cclo:
466 scm_gen_puts (scm_regular_string, "#<compiled-closure ", port);
467 scm_iprin1 (SCM_CCLO_SUBR (exp), port, writing);
468 scm_gen_putc ('>', port);
469 break;
470#endif
471 case scm_tc7_contin:
472 scm_gen_puts (scm_regular_string, "#<continuation ", port);
473 scm_intprint (SCM_LENGTH (exp), 10, port);
474 scm_gen_puts (scm_regular_string, " @ ", port);
475 scm_intprint ((long) SCM_CHARS (exp), 16, port);
476 scm_gen_putc ('>', port);
477 break;
478 case scm_tc7_port:
479 i = SCM_PTOBNUM (exp);
480 if (i < scm_numptob && scm_ptobs[i].print && (scm_ptobs[i].print) (exp, port, writing))
481 break;
482 goto punk;
483 case scm_tc7_smob:
a51ea417 484 PUSH_REF (pstack, exp, circref);
0f2d19dd
JB
485 i = SCM_SMOBNUM (exp);
486 if (i < scm_numsmob && scm_smobs[i].print
487 && (scm_smobs[i].print) (exp, port, writing))
a51ea417
MD
488 {
489 POP_REF (pstack);
490 break;
491 }
492 POP_REF (pstack);
0f2d19dd 493 default:
a51ea417
MD
494 punk:
495 scm_ipruk ("type", exp, port);
0f2d19dd
JB
496 }
497 }
498}
499
a51ea417
MD
500#ifdef __STDC__
501void
502scm_prin1 (SCM exp, SCM port, int writing)
503#else
504void
505scm_prin1 (exp, port, writing)
506 SCM exp;
507 SCM port;
508 int writing;
509#endif
510{
511 RESET_REF_STACK (pstack);
512 scm_iprin1 (exp, port, writing);
513}
514
0f2d19dd
JB
515
516/* Print an integer.
517 */
518#ifdef __STDC__
519void
520scm_intprint (long n, int radix, SCM port)
521#else
522void
523scm_intprint (n, radix, port)
524 long n;
525 int radix;
526 SCM port;
527#endif
528{
529 char num_buf[SCM_INTBUFLEN];
530 scm_gen_write (scm_regular_string, num_buf, scm_iint2str (n, radix, num_buf), port);
531}
532
533/* Print an object of unrecognized type.
534 */
535#ifdef __STDC__
536void
537scm_ipruk (char *hdr, SCM ptr, SCM port)
538#else
539void
540scm_ipruk (hdr, ptr, port)
541 char *hdr;
542 SCM ptr;
543 SCM port;
544#endif
545{
546 scm_gen_puts (scm_regular_string, "#<unknown-", port);
547 scm_gen_puts (scm_regular_string, hdr, port);
548 if (SCM_CELLP (ptr))
549 {
550 scm_gen_puts (scm_regular_string, " (0x", port);
551 scm_intprint (SCM_CAR (ptr), 16, port);
552 scm_gen_puts (scm_regular_string, " . 0x", port);
553 scm_intprint (SCM_CDR (ptr), 16, port);
554 scm_gen_puts (scm_regular_string, ") @", port);
555 }
556 scm_gen_puts (scm_regular_string, " 0x", port);
557 scm_intprint (ptr, 16, port);
558 scm_gen_putc ('>', port);
559}
560
561/* Print a list.
562 */
a51ea417
MD
563
564static ref_stack lstack;
565
0f2d19dd
JB
566#ifdef __STDC__
567void
568scm_iprlist (char *hdr, SCM exp, char tlr, SCM port, int writing)
569#else
570void
571scm_iprlist (hdr, exp, tlr, port, writing)
572 char *hdr;
573 SCM exp;
574 char tlr;
575 SCM port;
576 int writing;
577#endif
578{
579 scm_gen_puts (scm_regular_string, hdr, port);
580 /* CHECK_INTS; */
581 scm_iprin1 (SCM_CAR (exp), port, writing);
a51ea417
MD
582 RESET_REF_STACK (lstack);
583 PUSH_REF (lstack, exp, circref);
0f2d19dd
JB
584 exp = SCM_CDR (exp);
585 for (; SCM_NIMP (exp); exp = SCM_CDR (exp))
586 {
587 if (SCM_NECONSP (exp))
588 break;
a51ea417 589 PUSH_REF (lstack, exp, circref);
0f2d19dd
JB
590 scm_gen_putc (' ', port);
591 /* CHECK_INTS; */
592 scm_iprin1 (SCM_CAR (exp), port, writing);
593 }
594 if (SCM_NNULLP (exp))
595 {
596 scm_gen_puts (scm_regular_string, " . ", port);
597 scm_iprin1 (exp, port, writing);
598 }
a51ea417 599end:
0f2d19dd 600 scm_gen_putc (tlr, port);
a51ea417
MD
601 return;
602circref:
603 scm_gen_puts (scm_regular_string, " . #<circ ref>", port);
604 goto end;
605}
606
607#ifdef __STDC__
608void
609scm_prlist (char *hdr, SCM exp, char tlr, SCM port, int writing)
610#else
611void
612scm_prlist (hdr, exp, tlr, port, writing)
613 char *hdr;
614 SCM exp;
615 char tlr;
616 SCM port;
617 int writing;
618#endif
619{
620 RESET_REF_STACK (pstack);
621 scm_iprlist (hdr, exp, tlr, port, writing);
0f2d19dd
JB
622}
623
624\f
625
626SCM_PROC(s_write, "write", 1, 1, 0, scm_write);
627#ifdef __STDC__
628SCM
629scm_write (SCM obj, SCM port)
630#else
631SCM
632scm_write (obj, port)
633 SCM obj;
634 SCM port;
635#endif
636{
637 if (SCM_UNBNDP (port))
638 port = scm_cur_outp;
639 else
640 SCM_ASSERT (SCM_NIMP (port) && SCM_OPOUTPORTP (port), port, SCM_ARG2, s_write);
a51ea417 641 scm_prin1 (obj, port, 1);
0f2d19dd
JB
642#ifdef HAVE_PIPE
643# ifdef EPIPE
644 if (EPIPE == errno)
645 scm_close_port (port);
646# endif
647#endif
648 return SCM_UNSPECIFIED;
649}
650
651
652SCM_PROC(s_display, "display", 1, 1, 0, scm_display);
653#ifdef __STDC__
654SCM
655scm_display (SCM obj, SCM port)
656#else
657SCM
658scm_display (obj, port)
659 SCM obj;
660 SCM port;
661#endif
662{
663 if (SCM_UNBNDP (port))
664 port = scm_cur_outp;
665 else
666 SCM_ASSERT (SCM_NIMP (port) && SCM_OPOUTPORTP (port), port, SCM_ARG2, s_display);
a51ea417 667 scm_prin1 (obj, port, 0);
0f2d19dd
JB
668#ifdef HAVE_PIPE
669# ifdef EPIPE
670 if (EPIPE == errno)
671 scm_close_port (port);
672# endif
673#endif
674 return SCM_UNSPECIFIED;
675}
676
677SCM_PROC(s_newline, "newline", 0, 1, 0, scm_newline);
678#ifdef __STDC__
679SCM
680scm_newline(SCM port)
681#else
682SCM
683scm_newline (port)
684 SCM port;
685#endif
686{
687 if (SCM_UNBNDP (port))
688 port = scm_cur_outp;
689 else
690 SCM_ASSERT (SCM_NIMP (port) && SCM_OPOUTPORTP (port), port, SCM_ARG1, s_newline);
691 scm_gen_putc ('\n', port);
692#ifdef HAVE_PIPE
693# ifdef EPIPE
694 if (EPIPE == errno)
695 scm_close_port (port);
696 else
697# endif
698#endif
699 if (port == scm_cur_outp)
700 scm_fflush (port);
701 return SCM_UNSPECIFIED;
702}
703
704SCM_PROC(s_write_char, "write-char", 1, 1, 0, scm_write_char);
705#ifdef __STDC__
706SCM
707scm_write_char (SCM chr, SCM port)
708#else
709SCM
710scm_write_char (chr, port)
711 SCM chr;
712 SCM port;
713#endif
714{
715 if (SCM_UNBNDP (port))
716 port = scm_cur_outp;
717 else
718 SCM_ASSERT (SCM_NIMP (port) && SCM_OPOUTPORTP (port), port, SCM_ARG2, s_write_char);
719 SCM_ASSERT (SCM_ICHRP (chr), chr, SCM_ARG1, s_write_char);
720 scm_gen_putc ((int) SCM_ICHR (chr), port);
721#ifdef HAVE_PIPE
722# ifdef EPIPE
723 if (EPIPE == errno)
724 scm_close_port (port);
725# endif
726#endif
727 return SCM_UNSPECIFIED;
728}
729
730
731\f
732
733#ifdef __STDC__
734void
735scm_init_print (void)
736#else
737void
738scm_init_print ()
739#endif
740{
e6e4c9af 741#ifdef DEBUG_EXTENSIONS
b7ff98dd 742 scm_init_opts (scm_print_options, scm_print_opts, SCM_N_PRINT_OPTIONS);
a51ea417
MD
743 init_ref_stack (&pstack);
744 init_ref_stack (&lstack);
e6e4c9af 745#endif
0f2d19dd
JB
746#include "print.x"
747}