|
|
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.