|
|
1.1 root 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"
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.