1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ 2: /* $Header: b2err.c,v 1.1 84/06/28 00:49:07 timo Exp $ */ 3: 4: /* B error message handling */ 5: #include "b.h" 6: #include "b0con.h" 7: #include "b1obj.h" 8: #include "b2err.h" 9: #include "b2scr.h" 10: #include "b2env.h" 11: #include "b2sem.h" /* for xeq */ 12: #include "b2syn.h" 13: #include "b2sig.h" 14: #include "b2fil.h" 15: 16: jmp_buf main_loop; 17: bool skipping; 18: 19: 20: #define Interactive ((cntxt == In_read || active_reads > 0) \ 21: ? read_interactive : interactive) 22: #define Errout (Interactive ? stderr : stdout) 23: #define Skip() {if (skipping) proceed();} 24: 25: Hidden Procedure Line() { 26: if (interactive || Errout == stdout) line(); 27: } 28: 29: Hidden Procedure errmess(m) string m; { 30: fprintf(Errout, m); 31: } 32: 33: Hidden Procedure core_dump() { 34: errmess("*** Core-dump for inspection purposes: "); 35: fflush(stdout); 36: dump(); 37: } 38: 39: Visible Procedure bye(ex) int ex; { 40: at_nwl= Yes; 41: putprmnv(); 42: exit(ex); 43: } 44: 45: Hidden Procedure prname(name) value name; { 46: value ch; int k, len; 47: if (Is_text(name)) { 48: len= length(name); 49: k_Over_len { 50: ch= thof(k+1, name); 51: putc(charval(ch), Errout); 52: release(ch); 53: } 54: } else errmess("???"); 55: } 56: 57: value erruname= Vnil; literal errutype; intlet errlino= 0; 58: 59: Hidden intlet display_line(ax) txptr ax; { 60: /*displays the line that tx is in, and returns the column number that 61: ax is at. 62: */ 63: txptr lx= fcol(); intlet ap= -1, p= 0; char c; 64: while (!Eol(lx) && Char(lx) != Eotc) { 65: if (lx == ax) ap= p; 66: c= *lx++; 67: if (c == '\t') { 68: do { putc(' ', Errout); } while (((++p)%4)!=0); 69: } else { putc(c, Errout); p++; } 70: } 71: putc('\n', Errout); 72: if (ap < 0) return p; 73: return ap; 74: } 75: 76: Hidden Procedure prline(at) bool at; { 77: txptr ax= tx; intlet p, ap; 78: if (cntxt == In_read || cntxt == In_value) errmess(" in your "); 79: else if (cntxt != In_formal) 80: fprintf(Errout, " in line %d of your ", lino); 81: switch (cntxt) { 82: case In_command: errmess("command"); break; 83: case In_read: errmess("expression to be read"); break; 84: case In_value: errmess("edited value"); break; 85: case In_unit:errmess("unit "); prname(uname); 86: erruname= uname; errutype= utype; errlino= lino; 87: break; 88: case In_formal: break; 89: case In_prmnv: errmess("permanent environment"); break; 90: default: errmess("???\n"); return; 91: } 92: errmess("\n "); 93: if (!at) do ax--; while (Space(Char(ax))); 94: ap= display_line(ax)+4; 95: for (p= 0; p < ap; p++) putc(' ', Errout); 96: putc('^', Errout); 97: putc('\n', Errout); 98: } 99: 100: Hidden Procedure show_where(at, wia) bool at, wia; { 101: context cc; 102: if (cntxt == In_formal) { 103: sv_context(&cc); 104: set_context(&how_context); 105: prline(No); 106: set_context(&cc); 107: errmess("originating from your command"); 108: } 109: prline(at); 110: if (!Interactive || !wia) { 111: fprintf(Errout, 112: "(detected after reading %d input line%s of your input file ", 113: alino, alino == 1 ? "" : "s"); 114: if (iname == Vnil) errmess("standard input)"); 115: else { 116: prname(iname); 117: errmess(")"); 118: } 119: putc('\n', Errout); 120: } 121: } 122: 123: Visible Procedure syserr(m) string m; { 124: Line(); 125: errmess("*** Sorry, B system malfunction"); 126: show_where(Yes, Yes); 127: fprintf(Errout, "*** The problem is: %s\n", m); 128: errmess("*** Please save pertinent data for inspection by B guru\n"); 129: core_dump(); 130: } 131: 132: Visible Procedure memexh() { 133: Line(); 134: errmess("*** Sorry, memory exhausted"); 135: show_where(Yes, Yes); 136: errmess("*** Get your boss to buy a larger computer\n"); 137: core_dump(); 138: } 139: 140: Hidden Procedure fix_files() { 141: if (ifile != stdin) fclose(ifile); 142: if (f_interactive(stdin) || filtered) { 143: interactive= Yes; 144: release(iname); 145: iname = Vnil; 146: ifile = stdin; 147: Eof= Eof0= No; 148: } 149: } 150: 151: Hidden Procedure proceed() { 152: if (cntxt == In_prmnv) exit(-1); 153: else if (cntxt == In_read && read_interactive) { 154: errmess("*** please enter a valid expression instead\n"); 155: longjmp(reading[active_reads-1], 1); 156: } else if (active_reads > 0 && read_interactive) { 157: errmess("*** please enter a suitable expression instead\n"); 158: longjmp(reading[active_reads-1], 1); 159: } else { 160: if (cntxt == In_value) fix_files(); 161: longjmp(main_loop, 1); 162: } 163: } 164: 165: Hidden Procedure message(m1, m2, m3, at) string m1, m2, m3; bool at; { 166: Skip(); Line(); 167: errmess(m1); 168: show_where(at, Yes); 169: fprintf(Errout, "*** The problem is: %s%s\n", m2, m3); 170: proceed(); 171: } 172: 173: Visible Procedure error(m) string m; { 174: message("*** Cannot cope with problem", m, "", No); 175: } 176: 177: Visible Procedure parerr(m, ss) string m, ss; { 178: message("*** There's something I don't understand", m, ss, Yes); 179: } 180: 181: Visible Procedure pprerr(m, ss) string m, ss; { 182: message("*** There's something I don't understand", m, ss, No); 183: } 184: 185: Visible Procedure checkerr() { 186: Line(); 187: errmess("*** Your check failed"); 188: show_where(No, Yes); 189: longjmp(main_loop, 1); 190: } 191: 192: Visible Procedure int_signal(in_read) bool in_read; { 193: if (cntxt == In_prmnv) exit(-1); 194: else if (interactive) { 195: interrupt(in_read); 196: if (!in_read) accept_int(); 197: longjmp(main_loop, 1); 198: } else { 199: fix_files(); 200: if (interactive) { 201: interrupt(in_read); 202: if (!in_read) accept_int(); 203: process(); 204: } else bye(1); 205: } 206: } 207: 208: Hidden Procedure interrupt(in_read) bool in_read; { 209: if (!in_read) at_nwl= No; 210: Line(); 211: errmess(in_read ? "*** READ aborted\n" : "*** interrupted\n"); 212: if (filtered) errmess("\177"); 213: if (cntxt == In_read || active_reads > 0) set_context(&read_context); 214: /* show_where(No, was_interactive); */ 215: } 216: 217: bool bugs= No; 218: bool tracing= No; 219: 220: Visible Procedure debug(m) string m; { 221: if (bugs) { 222: Line(); 223: fprintf(Errout, "*** Debugging (xeq = %s, cur_ilev = %d)", 224: xeq ? "Yes" : "No", cur_ilev); 225: show_where(Yes, Yes); 226: fprintf(Errout, "*** %s\n", m); 227: } 228: } 229: 230: Visible Procedure trace() { 231: VOID display_line(tx); 232: }