1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ 2: /* $Header: b2scr.c,v 1.2 84/07/17 09:51:48 frank Exp $ */ 3: 4: /* B screen handling */ 5: #include "b.h" 6: #include "b1obj.h" 7: #include "b0con.h" /*for CLEAR_EOF*/ 8: #include "b2scr.h" 9: #include "b2fil.h" 10: 11: bool interactive, read_interactive, outeractive, filtered; 12: bool at_nwl= Yes; /*Yes if currently at the start of an output line*/ 13: bool Eof, Eof0; 14: FILE *ofile= stdout; bool woa, wnwl; 15: FILE *ifile; /* input file */ 16: FILE *sv_ifile; /* copy of ifile for restoring after switching to read unit */ 17: value iname= Vnil; /* input name */ 18: 19: jmp_buf reading[MAX_NMB_ACT_READS]; 20: intlet active_reads; 21: 22: string cmd_prompt= ">>> "; /* commands */ 23: string eg_prompt= "?\b"; /* READ EG */ 24: string raw_prompt= "?\b"; /* READ RAW */ 25: string qn_prompt= "?\b"; /* questions */ 26: 27: 28: #define USE_YES_OR_NO \ 29: "\r*** Answer with yes or no (or use interrupt to duck the question)\n" 30: 31: #define LAST_CHANCE \ 32: "*** This is your last chance. Take it. I really don't know what you want if\n\ 33: %s\n\ 34: So answer the question\n" 35: 36: #define NO_THEN \ 37: "*** Well, I shall assume that your refusal to answer the question means no!\n" 38: 39: Visible bool is_intended(m) string m; { 40: char answer; intlet try, k; 41: if (!interactive) return Yes; 42: if (outeractive) line(); 43: fprintf(stderr, "*** %s\n", m); 44: for (try= 1; try<=4; try++){ 45: answer= '?'; 46: if (outeractive) at_nwl= No; 47: fprintf(stderr, qn_prompt); 48: while ((k= getchar()) != EOF && k != '\n') { 49: if ((k == ' ' || k == '\t')); 50: else if (answer == '?') answer= k; 51: } 52: if (k == EOF) { 53: if (filtered) bye(0); /* Editor has died */ 54: CLEAR_EOF; 55: } 56: if (k == EOF && try < 4) { 57: fprintf(stderr, USE_YES_OR_NO); 58: if (outeractive) at_nwl= Yes; 59: } else { 60: if (outeractive && k == '\n') at_nwl= Yes; 61: if (answer == 'y' || answer == 'Y') return Yes; 62: if (answer == 'n' || answer == 'N') return No; 63: if (outeractive) line(); 64: fprintf(stderr, 65: try == 1 ? "*** Please answer with yes or no\n" : 66: try == 2 ? "*** Just yes or no, please\n" : 67: try == 3 ? LAST_CHANCE : 68: NO_THEN, m); 69: } 70: } /* end for */ 71: return No; 72: } 73: 74: Visible Procedure redirect(of) FILE *of; { 75: ofile= of; 76: if (of == stdout) { 77: outeractive= woa; 78: at_nwl= wnwl; 79: } else { 80: woa= outeractive; outeractive= No; 81: wnwl= at_nwl; at_nwl= Yes; 82: } 83: } 84: 85: Hidden Procedure putch(c) char c; { 86: putc(c, ofile); 87: if (c == '\n') at_nwl= Yes; 88: else at_nwl= No; 89: } 90: 91: Visible Procedure newline() { 92: putch('\n'); 93: fflush(stdout); 94: } 95: 96: Visible Procedure line() { 97: if (!at_nwl) newline(); 98: } 99: 100: Visible Procedure wri_space() { /* Experiment: no space before outer strings */ 101: if (!at_nwl) putch(' '); 102: } 103: 104: Visible Procedure writ(v) value v; { 105: wri(v, Yes, Yes, No); 106: fflush(stdout); 107: } 108: 109: #define Putch_sp() {if (!perm) putch(' ');} 110: 111: bool lwt, last_was_text= No; 112: 113: Visible Procedure wri(v, coll, outer, perm) value v; bool coll, outer, perm; { 114: if (outer && !at_nwl && (!Is_text(v) || !last_was_text) 115: && (!Is_compound(v) || !coll)) putch(' '); 116: lwt= No; 117: if (Is_number(v)) { 118: if (perm) printnum(ofile, v); 119: else { 120: string cp= convnum(v); 121: while(*cp) putch(*cp++); 122: } 123: } else if (Is_text(v)) { 124: value ch; char c; 125: value s= size(v); int k, len; 126: if (large(s)) error("text too long to output"); 127: else { len= intval(s); release(s); } 128: lwt= outer; 129: if (!outer) putch('\''); 130: k_Over_len { 131: ch= thof(k+1, v); 132: putch(c= charval(ch)); 133: if (!outer && (c == '\'' || c == '`')) 134: putch(c); 135: release(ch); 136: } 137: if (!outer) putch('\''); 138: } else if (Is_compound(v)) { 139: intlet k, len= Nfields(v); 140: outer&= coll; 141: if (!coll) putch('('); 142: k_Overfields { 143: wri(*field(v, k), No, outer, perm); 144: if (!Lastfield(k)) { 145: if (!outer){ 146: putch(','); 147: Putch_sp(); 148: } 149: } 150: } 151: if (!coll) putch(')'); 152: } else if (Is_list(v) || Is_ELT(v)) { 153: value ve; value s= size(v); int k, len; 154: if (large(s)) error("list too big to output"); 155: else { len= intval(s); release(s); } 156: putch('{'); 157: k_Over_len { 158: wri(ve= thof(k+1, v), No, No, perm); 159: release(ve); 160: if (!Last(k)) { 161: putch(';'); 162: Putch_sp(); 163: } 164: } 165: putch('}'); 166: } else if (Is_table(v)) { 167: value s= size(v); int k, len; 168: if (large(s)) error("table too big to output"); 169: else { len= intval(s); release(s); } 170: putch('{'); 171: k_Over_len { 172: putch('['); wri(*key(v, k), Yes, No, perm); 173: putch(']'); putch(':'); Putch_sp(); 174: wri(*assoc(v, k), No, No, perm); 175: if (!Last(k)) { 176: putch(';'); 177: Putch_sp(); 178: } 179: } 180: putch('}'); 181: } else { 182: if (bugs) { putch('?'); putch(Type(v)); putch('?'); } 183: else syserr("writing value of unknown type"); 184: } 185: last_was_text= lwt; 186: } 187: 188: Visible Procedure vs_ifile() { 189: ifile= sv_ifile; 190: } 191: 192: Visible Procedure re_files() { 193: if (interactive && sv_ifile != ifile) { 194: if (ifile != stdin) fclose(ifile); 195: vs_ifile(); 196: Eof= Eof0= No; 197: } 198: } 199: 200: Visible Procedure initscr() { 201: read_interactive= f_interactive(stdin) || filtered; 202: outeractive= f_interactive(stdout) || filtered; 203: } 204: 205: Visible Procedure re_screen() { 206: sv_ifile= ifile; 207: interactive= f_interactive(ifile) || (ifile == stdin && filtered); 208: }