|
|
1.1 root 1: /*
2: * Micro-EMACS extension for MWC -- Search for next/previous error in
3: * error buffer. This module must "know" the format of each type of
4: * error message produced by the compiler that the error message is
5: * generated by.
6: */
7:
8: #include <stdio.h>
9: #include "ed.h"
10:
11: /*
12: * Find a window associated with the buffer list.
13: */
14:
15: WINDOW *
16: wfind(bp)
17: BUFFER *bp;
18: {
19: register WINDOW *wp;
20:
21: wp = wheadp;
22: while (wp != NULL) {
23: if (wp->w_bufp == bp)
24: return wp;
25: wp = wp->w_wndp;
26: }
27: return NULL;
28: }
29:
30: /*
31: * Search forward in the error buffer for an error message.
32: */
33:
34: forwerr(dir)
35: {
36: register LINE *lp;
37: register WINDOW *wp;
38: register uchar *tp;
39: register int c;
40: register int error_line;
41: uchar error_text[81];
42: uchar *et;
43:
44: if ((wp = wfind(errbp)) == NULL)
45: return FALSE;
46:
47: error_line = 0;
48: lp = wp->w_dotp;
49: if (wp->w_doto)
50: lp = dir ? lback(lp) : lforw(lp);
51:
52: for (; lp != errbp->b_linep; lp = dir ? lback(lp) : lforw(lp)) {
53: int len, prev;
54:
55: tp = lp->l_text;
56: for (len = llength(lp), prev = '(';
57: len && ((*tp < '0') || (*tp > '9') || (prev != '('));
58: prev = *tp++, len--)
59: ;
60: while (len-- && ((c = *tp++ - '0') >= 0) && (c <= 9)) {
61: error_line *= 10;
62: error_line += c;
63: }
64: if (!error_line)
65: continue;
66: et = error_text;
67: while ((len-- > 0) && ((*et++ = *tp++) != 0)) {
68: if ((et - error_text) > (term.t_ncol - 15))
69: break;
70: }
71: *et = 0;
72: mlwrite("[%d:%s]",error_line, error_text);
73: break;
74: }
75:
76: if (!error_line) {
77: mlwrite("[No more errors.]");
78: return FALSE;
79: }
80:
81: wp->w_dotp = lp; /* set dot to this line */
82: wp->w_doto = 1;
83: wp->w_force = 1;
84: wp->w_flag |= WFFORCE | WFMOVE;
85: gotofline(TRUE, error_line);
86: return TRUE;
87: }
88:
89: /*
90: * Make sure we have an error window.
91: */
92:
93: errwind()
94: {
95: register BUFFER *bp;
96: register BUFFER *obp;
97: register WINDOW *wp;
98: register int r;
99:
100: if ((runswitch & CF_ERROR) == 0) {
101: mlwrite("[no error buffer]");
102: return FALSE;
103: }
104:
105: if ((bp = errbp) == NULL) {
106: mlwrite( "[No error buffer]" );
107: return FALSE;
108: }
109:
110: if (bp->b_nwnd == 0) { /* If this buffer is not */
111: if ((wp=wpopup()) == NULL) { /* in a window, display it */
112: mlwrite("[Can't open window for error buffer]");
113: return FALSE;
114: }
115: obp = wp->w_bufp; /* Get the old buffer ptr */
116: if (--obp->b_nwnd == 0) {
117: obp->b_dotp = wp->w_dotp;
118: obp->b_doto = wp->w_doto;
119: obp->b_markp = wp->w_markp;
120: obp->b_marko = wp->w_marko;
121: }
122: wp->w_bufp = bp;
123: ++bp->b_nwnd;
124: wp->w_linep = lback(bp->b_dotp);
125: wp->w_dotp = bp->b_dotp;
126: wp->w_doto = bp->b_doto;
127: wp->w_markp = bp->b_markp;
128: wp->w_marko = bp->b_marko;
129: wp->w_flag |= WFMODE|WFHARD;
130: if ((r = wp->w_ntrows - ERRLINES) > 0) {
131: BUFFER *owp;
132:
133: owp = curwp;
134: curwp = wp;
135: shrinkwind(0,r);
136: curwp = owp;
137: }
138:
139: }
140: return TRUE;
141: }
142:
143: /*
144: * Find the next error line in the error file.
145: */
146: nexterr(f,n)
147: {
148: if (n < 0)
149: return preverr(f, -n);
150:
151: if (errwind() == FALSE)
152: return FALSE;
153:
154: return forwerr(0);
155: }
156:
157: /*
158: * Find the previous error line in the error buffer.
159: */
160: preverr(f,n)
161: {
162: if (n < 0)
163: return nexterr(f, -n);
164:
165: if (errwind() == FALSE)
166: return FALSE;
167:
168: return forwerr(-1);
169: }
170:
171: /*
172: * Read in the error file, giving it a buffer.
173: */
174: readerr()
175: {
176: register BUFFER *bp;
177: uchar bname[NBUFN];
178:
179: makename(bname, "error-buffer"); /* New buffer name. */
180: #if GEM
181: fixname(bname);
182: fixname(errfile);
183: #endif
184: if ((errbp = bp = bfind(bname, TRUE, 0)) == NULL) {
185: mlwrite("Cannot create error buffer");
186: return (FALSE);
187: }
188: if (--curbp->b_nwnd == 0) { /* Undisplay. */
189: curbp->b_dotp = curwp->w_dotp;
190: curbp->b_doto = curwp->w_doto;
191: curbp->b_markp = curwp->w_markp;
192: curbp->b_marko = curwp->w_marko;
193: }
194: bp->b_flag |= BFNOWRT|BFERROR; /* Mark the buffer... */
195: curbp = bp; /* Switch to it. */
196: curwp->w_bufp = bp;
197: curbp->b_nwnd++;
198: return (readin(errfile)); /* Read it in. */
199: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.