1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ 2: static char rcsid[] = "$Header: erro.c,v 2.5 85/08/22 16:02:02 timo Exp $"; 3: 4: /* 5: * B editor -- Handle error messages. 6: */ 7: 8: #include "b.h" 9: #include "feat.h" 10: #include "node.h" 11: 12: 13: extern bool hushbaby; 14: extern bool dflag; 15: 16: string querepr(); 17: 18: extern int winheight; /* From scrn.c */ 19: extern int winstart; /* From scrn.c */ 20: extern int llength; /* From scrn.c */ 21: 22: #define SOBIT 0200 /* Interface with wind.c */ 23: 24: #define MAXMSG 1000 25: 26: static char msgbuffer[MAXMSG]; 27: static bool ringbell; 28: static int priority; 29: 30: 31: /* 32: * Status line. A combination of scroll bar, error message etc. 33: * Put the message on the screen and clear the buffers for next time. 34: * If there is no message, show status and copy buffer and recording mode. 35: */ 36: 37: Visible Procedure 38: stsline(totlines, topline, scrlines, copybuffer, recording) 39: int totlines; 40: int topline; 41: int scrlines; 42: value copybuffer; 43: bool recording; 44: { 45: register string bp; 46: 47: if (ringbell && !hushbaby) 48: trmbell(); 49: if (msgbuffer[0]) { 50: msgbuffer[llength-1] = '\0'; /* Truncate */ 51: if (ringbell) { 52: for (bp = msgbuffer; *bp; ++bp) 53: *bp |= SOBIT; 54: } 55: } 56: else { 57: bp = msgbuffer; 58: #ifdef SCROLLBAR 59: bp += addscrollbar(totlines, topline, scrlines); 60: #endif SCROLLBAR 61: if (recording) { 62: strcpy(bp, "[Recording] "); 63: bp += (sizeof "[Recording] ") - 1; 64: } 65: if (copybuffer) { 66: #ifdef SHOWBUF 67: sprintf(bp, "[Copy buffer: %.80s]", 68: querepr(copybuffer)); 69: while (*bp) 70: ++bp; 71: if (bp >= msgbuffer+80) 72: strcpy(msgbuffer+75, "...]"); 73: #else !SHOWBUF 74: strcpy(bp, "[Copy buffer]"); 75: #endif !SHOWBUF 76: } 77: } 78: trmputdata(winheight, winheight, 0, msgbuffer); 79: msgbuffer[0] = 0; 80: priority = 0; 81: ringbell = No; 82: } 83: 84: #ifdef SCROLLBAR 85: 86: /* 87: * Paint a beautiful scroll bar so the user can see about what part of the 88: * unit is visible on the screen (considering logical lines). 89: */ 90: 91: Hidden int 92: addscrollbar(totlines, topline, scrlines) 93: int totlines; 94: int topline; 95: int scrlines; 96: { 97: int endline; 98: register int i; 99: 100: if (winstart > 0 || scrlines > totlines) 101: return 0; /* Nothing outside screen */ 102: if (totlines <= 0) 103: totlines = 1; /* Don't want to divide by 0 */ 104: topline = topline*winheight / totlines; 105: endline = topline + (scrlines*winheight + totlines-1) / totlines; 106: if (endline > winheight) 107: endline = winheight; 108: if (topline >= endline) 109: topline = endline-1; 110: for (i = 0; i < topline; ++i) 111: msgbuffer[i] = '-'; 112: for (; i < endline; ++i) 113: msgbuffer[i] = '#'; 114: for (; i < winheight; ++i) 115: msgbuffer[i] = '-'; 116: msgbuffer[i++] = ' '; 117: msgbuffer[i] = '\0'; 118: return i; 119: } 120: 121: #endif SCROLLBAR 122: 123: /* 124: * Issue an error message. These have highest priority. 125: * Once an error message is in the buffer, further error messages are ignored 126: * until it has been displayed. 127: */ 128: 129: /* VARARGS 1 */ 130: Visible Procedure 131: error(fmt, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) 132: string fmt; 133: { 134: ringbell = Yes; 135: if (fmt && priority < 3) { 136: priority = 3; 137: sprintf(msgbuffer, fmt, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); 138: } 139: } 140: 141: 142: /* 143: * Issue an informative message. These have medium priority. 144: * Unlike error messages, the last such message is displayed. 145: */ 146: 147: /* VARARGS 1 */ 148: Visible Procedure 149: message(fmt, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) 150: register string fmt; 151: { 152: if (fmt && priority <= 2) { 153: priority = 2; 154: sprintf(msgbuffer, fmt, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); 155: } 156: } 157: 158: 159: /* 160: * Issue a debugging message. These have lowest priority and 161: * are not shown to ordinary users. 162: */ 163: 164: /* VARARGS1 */ 165: Visible Procedure 166: debug(fmt, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) 167: string fmt; 168: { 169: #ifndef NDEBUG 170: if (fmt && priority <= 1) { 171: priority = 1; 172: sprintf(msgbuffer, 173: fmt, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); 174: } 175: #endif NDEBUG 176: } 177: 178: 179: /* 180: * Dump any error message still remaining to stderr. 181: */ 182: 183: Visible Procedure 184: enderro() 185: { 186: if (msgbuffer[0]) { 187: fprintf(stderr, "%s\n", msgbuffer); 188: } 189: msgbuffer[0] = 0; 190: priority = 0; 191: ringbell = No; 192: } 193: 194: 195: /* 196: * This #define causes "erro.h" to compile a table of error messages. 197: */ 198: 199: #define _ERROR(name, message) char name[] = message 200: 201: #include "erro.h"