home *** CD-ROM | disk | FTP | other *** search
- /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
-
- /*
- $Header: b2dis.c,v 1.4 85/08/22 16:54:27 timo Exp $
- */
-
- #include "b.h"
- #include "b1obj.h"
- #include "b2par.h"
- #include "b2nod.h"
-
- FILE *d_file;
-
- #define Indent " "
-
- Hidden intlet ilevel= 0;
-
- Hidden Procedure set_ilevel() {
- intlet i;
- for (i= 0; i<ilevel; i++) fprintf(d_file, Indent);
- }
-
- Hidden bool new_line= Yes, in_comment= No;
-
- Hidden Procedure put_char(c) char c; {
- if (new_line && !in_comment) set_ilevel();
- putc(c, d_file);
- new_line= No;
- }
-
- Hidden Procedure put_string(s) string s; {
- if (new_line && !in_comment) set_ilevel();
- fprintf(d_file, "%s", s);
- new_line= No;
- }
-
- Hidden Procedure put_newline() {
- putc('\n', d_file);
- new_line= Yes;
- }
-
- #define Putspace put_char(' ')
-
- /* ******************************************************************** */
-
- Hidden bool displ_one_line, stop_displ;
-
- Visible Procedure display(f, v, one_line) FILE *f; parsetree v; bool one_line; {
- d_file= f;
- ilevel= 0;
- displ_one_line= one_line;
- stop_displ= No;
- new_line= !one_line;
- displ(v);
- if (!new_line) put_newline();
- }
-
- /* ******************************************************************** */
-
- char *text[] = {
- /* HOW_TO */ "HOW'TO #h1:#c2#b34",
- /* YIELD */ "YIELD 2:#c3#b45",
- /* TEST */ "TEST 2:#c3#b45",
- /* REFINEMENT */ "0:#c1#b23",
- /* SUITE */ "1#c23",
-
- /* PUT */ "PUT 0 IN 1",
- /* INSERT */ "INSERT 0 IN 1",
- /* REMOVE */ "REMOVE 0 FROM 1",
- /* CHOOSE */ "CHOOSE 0 FROM 1",
- /* DRAW */ "DRAW 0",
- /* SET_RANDOM */ "SET'RANDOM 0",
- /* DELETE */ "DELETE 0",
- /* CHECK */ "CHECK 0",
- /* SHARE */ "SHARE 0",
-
- /* WRITE */ "WRITE #j",
- /* READ */ "READ 0 EG 1",
- /* READ_RAW */ "READ 0 RAW",
-
- /* IF */ "IF 0:#c1#b2",
- /* WHILE */ "WHILE 0:#c1#b2",
- /* FOR */ "FOR 0 IN 1:#c2#b3",
-
- /* SELECT */ "SELECT:#c0#b1",
- /* TEST_SUITE */ "1#d:#c2#b34",
- /* ELSE */ "ELSE:#c1#b2",
-
- /* QUIT */ "QUIT",
- /* RETURN */ "RETURN 0",
- /* REPORT */ "REPORT 0",
- /* SUCCEED */ "SUCCEED",
- /* FAIL */ "FAIL",
-
- /* USER_COMMAND */ "#h1",
- /* EXTENDED_COMMAND */ "0 ...",
-
- /* TAG */ "0",
- /* COMPOUND */ "(0)",
- /* COLLATERAL */ "#a0",
- /* SELECTION */ "0[1]",
- /* BEHEAD */ "0@1",
- /* CURTAIL */ "0|1",
- /* UNPARSED */ "1",
- /* MONF */ "#l",
- /* DYAF */ "#k",
- /* NUMBER */ "1",
- /* TEXT_DIS */ "#e",
- /* TEXT_LIT */ "#f",
- /* TEXT_CONV */ "`0`1",
- /* ELT_DIS */ "{}",
- /* LIST_DIS */ "{#i0}",
- /* RANGE_DIS */ "{0..1}",
- /* TAB_DIS */ "{#g0}",
- /* AND */ "0 AND 1",
- /* OR */ "0 OR 1",
- /* NOT */ "NOT 0",
- /* SOME_IN */ "SOME 0 IN 1 HAS 2",
- /* EACH_IN */ "EACH 0 IN 1 HAS 2",
- /* NO_IN */ "NO 0 IN 1 HAS 2",
- /* SOME_PARSING */ "SOME 0 PARSING 1 HAS 2",
- /* EACH_PARSING */ "EACH 0 PARSING 1 HAS 2",
- /* NO_PARSING */ "NO 0 PARSING 1 HAS 2",
- /* MONPRD */ "0 1",
- /* DYAPRD */ "0 1 2",
- /* LESS_THAN */ "0 < 1",
- /* AT_MOST */ "0 <= 1",
- /* GREATER_THAN */ "0 > 1",
- /* AT_LEAST */ "0 >= 1",
- /* EQUAL */ "0 = 1",
- /* UNEQUAL */ "0 <> 1",
- /* Nonode */ "",
-
- /* TAGformal */ "0",
- /* TAGlocal */ "0",
- /* TAGglobal */ "0",
- /* TAGmystery */ "0",
- /* TAGrefinement */ "0",
- /* TAGzerfun */ "0",
- /* TAGzerprd */ "0",
- };
-
- #define Is_digit(d) ((d) >= '0' && (d) <= '9')
- #define Fld(v, t) *Branch(v, (*(t) - '0') + First_fieldnr)
-
- Hidden Procedure displ(v) value v; {
- if (Is_text(v)) put_string(strval(v));
- else if (Is_parsetree(v)) {
- string t= text[nodetype(v)];
- while (*t) {
- if (Is_digit(*t)) displ(Fld(v, t));
- else if (*t == '#') {
- special(v, &t);
- if (stop_displ) return;
- } else put_char(*t);
- t++;
- }
- }
- }
-
- Hidden Procedure special(v, t) parsetree v; string *t; {
- (*t)++;
- switch (**t) {
- case 'a': d_collateral(Fld(v, ++*t)); break;
- case 'b': indent(Fld(v, ++*t)); break;
- case 'c': d_comment(Fld(v, ++*t)); break;
- case 'd': /* test suite */
- (*t)++;
- if (!new_line) /* there was a command */
- put_char(**t);
- break;
- case 'e': d_textdis(v); break;
- case 'f': d_textlit(v); break;
- case 'g': d_tabdis(Fld(v, ++*t)); break;
- case 'h': d_actfor_compound(Fld(v, ++*t)); break;
- case 'i': d_listdis(Fld(v, ++*t)); break;
- case 'j': d_write(v); break;
- case 'k': d_dyaf(v); break;
- case 'l': d_monf(v); break;
- }
- }
-
- Hidden Procedure indent(v) parsetree v; {
- if (displ_one_line) { stop_displ= Yes; return; }
- ilevel++;
- displ(v);
- ilevel--;
- }
-
- Hidden bool no_space_before_comment(v) value v; {
- value c, t; bool b;
- c= curtail(v, one); t= mk_text("\\");
- b= compare(c, t) == 0;
- release(c); release(t);
- return b;
- }
-
-
- Hidden Procedure d_comment(v) value v; {
- if ( v != Vnil) {
- in_comment= Yes;
- if (!new_line && no_space_before_comment(v)) Putspace;
- displ(v);
- in_comment= No;
- }
- if (!new_line) put_newline();
- }
-
- Hidden value quote= Vnil;
-
- Hidden Procedure d_textdis(v) parsetree v; {
- value s_quote= quote;
- quote= *Branch(v, XDIS_QUOTE);
- displ(quote);
- displ(*Branch(v, XDIS_NEXT));
- displ(quote);
- quote= s_quote;
- }
-
- Hidden Procedure d_textlit(v) parsetree v; {
- value w;
- displ(w= *Branch(v, XLIT_TEXT));
- if (character(w)) {
- value c= mk_text("`");
- if (compare(quote, w) == 0 || compare(c, w) == 0) displ(w);
- release(c);
- }
- displ(*Branch(v, XLIT_NEXT));
- }
-
- Hidden Procedure d_tabdis(v) value v; {
- intlet k, len= Nfields(v);
- k_Over_len {
- if (k>0) put_string("; ");
- put_char('[');
- displ(*Field(v, k));
- put_string("]: ");
- displ(*Field(v, ++k));
- }
- }
-
- Hidden Procedure d_collateral(v) value v; {
- intlet k, len= Nfields(v);
- k_Over_len {
- if (k>0) put_string(", ");
- displ(*Field(v, k));
- }
- }
-
- Hidden Procedure d_listdis(v) value v; {
- intlet k, len= Nfields(v);
- k_Over_len {
- if (k>0) put_string("; ");
- displ(*Field(v, k));
- }
- }
-
- Hidden Procedure d_actfor_compound(v) value v; {
- while (v != Vnil) {
- displ(*Branch(v, ACT_KEYW));
- if (*Branch(v, ACT_EXPR) != Vnil) {
- Putspace;
- displ(*Branch(v, ACT_EXPR));
- }
- v= *Branch(v, ACT_NEXT);
- if (v != Vnil) Putspace;
- }
- }
-
- Hidden Procedure d_write(v) parsetree v; {
- value l_lines, e, r_lines;
- l_lines= *Branch(v, WRT_L_LINES);
- e= *Branch(v, WRT_EXPR);
- r_lines= *Branch(v, WRT_R_LINES);
- displ(l_lines);
- if (e != NilTree) {
- value n= size(l_lines);
- if (intval(n) > 0) Putspace;
- release(n);
- displ(e);
- n= size(r_lines);
- if (intval(n) > 0) Putspace;
- release(n);
- }
- displ(r_lines);
- }
-
- Hidden Procedure d_dyaf(v) parsetree v; {
- parsetree l, r; value name;
- l= *Branch(v, DYA_LEFT);
- r= *Branch(v, DYA_RIGHT);
- name= *Branch(v, DYA_NAME);
- displ(l);
- if (is_b_tag(name) || nodetype(r) == MONF) {
- Putspace;
- displ(name);
- Putspace;
- }
- else displ(name);
- displ(r);
- }
-
- Hidden Procedure d_monf(v) parsetree v; {
- parsetree r; value name;
- name= *Branch(v, MON_NAME);
- r= *Branch(v, MON_RIGHT);
- displ(name);
- if (is_b_tag(name)) {
- switch (nodetype(r)) {
- case MONF:
- if (!is_b_tag(*Branch(r, MON_NAME))) break;
- case SELECTION:
- case BEHEAD:
- case CURTAIL:
- case TAG:
- case TAGformal:
- case TAGlocal:
- case TAGglobal:
- case TAGmystery:
- case TAGrefinement:
- case TAGzerfun:
- case TAGzerprd:
- case NUMBER:
- case TEXT_DIS:
- Putspace;
- break;
- default:
- break;
- }
- }
- displ(r);
- }
-