This is uerror.c in view mode; [Download] [Up]
/* Compiler error handler */
#include "queue.h"
#include "b.h"
#include "vs.h"
#include "ufile.h"
#include "w.h"
#include "bw.h"
#include "zstr.h"
#include "ufile.h"
#include "main.h"
#include "uerror.h"
/* Error database */
typedef struct error ERROR;
struct error
{
LINK(ERROR) link; /* Linked list of errors */
long line; /* Target line number */
long org; /* Original target line number */
char *file; /* Target file name */
long src; /* Error-file line number */
char *msg; /* The message */
} errors={{&errors,&errors}};
ERROR *errptr= &errors; /* Current error row */
B *errbuf=0; /* Buffer with error messages */
/* Insert and delete notices */
void inserr(name,where,n,bol)
char *name;
long where;
long n;
{
ERROR *e;
if(name)
for(e=errors.link.next;e!=&errors;e=e->link.next)
if(!zcmp(e->file,name))
if(e->line>where) e->line+=n;
else if(e->line==where && bol) e->line+=n;
}
void delerr(name,where,n)
char *name;
long where;
long n;
{
ERROR *e;
if(name)
for(e=errors.link.next;e!=&errors;e=e->link.next)
if(!zcmp(e->file,name))
if(e->line>where+n) e->line-=n;
else if(e->line>where) e->line=where;
}
/* Abort notice */
void abrerr(name)
char *name;
{
ERROR *e;
if(name)
for(e=errors.link.next;e!=&errors;e=e->link.next)
if(!zcmp(e->file,name)) e->line=e->org;
}
/* Save notice */
void saverr(name)
char *name;
{
ERROR *e;
if(name)
for(e=errors.link.next;e!=&errors;e=e->link.next)
if(!zcmp(e->file,name)) e->org=e->line;
}
/* Pool of free error nodes */
ERROR errnodes={{&errnodes,&errnodes}};
/* Free an error node */
void freeerr(n)
ERROR *n;
{
vsrm(n->file);
vsrm(n->msg);
enquef(ERROR,link,&errnodes,n);
}
/* Free all errors */
void freeall()
{
while(!qempty(ERROR,link,&errors))
freeerr(deque(ERROR,link,errors.link.next));
errptr= &errors;
}
/* Parse error messages into database */
int parseit(s,row)
char *s;
long row;
{
int x, y;
char *name=0;
long line= -1;
ERROR *err;
/* Skip to first word */
for(x=0;s[x] && !crest(s[x]);++x);
/* Skip to end of first word */
for(y=x;crest(s[y]) || s[y]=='.';++y);
/* Save file name */
if(x!=y) name=vsncpy(NULL,0,s+x,y-x);
/* Skip to first number */
for(x=y;s[x] && (s[x]<'0' || s[x]>'9');++x);
/* Skip to end of first number */
for(y=x;s[y]>='0' && s[y]<='9';++y);
/* Save line number */
if(x!=y) sscanf(s+x,"%ld",&line);
if(line!= -1) --line;
if(name)
if(line!= -1)
{
/* We have an error */
err=(ERROR *)alitem(&errnodes,sizeof(ERROR));
err->file=name;
err->org=err->line=line;
err->src=row;
err->msg=vsncpy(NULL,0,sc("\\i"));
err->msg=vsncpy(sv(err->msg),sv(s));
enqueb(ERROR,link,&errors,err);
return 1;
}
else vsrm(name);
return 0;
}
/* Parse the error output contained in a buffer */
long parserr(b)
B *b;
{
P *p=pdup(b->bof);
P *q=pdup(p);
long nerrs=0;
freeall();
do
{
char *s;
pset(q,p); peol(p);
s=brvs(q,(int)(p->byte-q->byte));
if(s)
{
nerrs+=parseit(s,q->line);
vsrm(s);
}
} while(pgetc(p)!= MAXINT);
prm(p); prm(q);
return nerrs;
}
int uparserr(bw)
BW *bw;
{
errbuf=bw->b;
freeall();
sprintf(msgbuf,"Parsed %ld lines",parserr(bw->b));
msgnw(bw,msgbuf);
return 0;
}
int unxterr(bw)
BW *bw;
{
int omid;
if(errptr->link.next==&errors)
{
msgnw(bw,"No more errors");
return -1;
}
errptr=errptr->link.next;
if(!bw->b->name || zcmp(errptr->file,bw->b->name))
{
if(doedit(bw,vsdup(errptr->file),NULL,NULL)) return -1;
bw=(BW *)maint->curwin->object;
}
omid=mid; mid=1;
pline(bw->cursor,errptr->line);
setline(errbuf,errptr->src);
dofollows();
mid=omid;
bw->cursor->xcol=piscol(bw->cursor);
msgnw(bw,errptr->msg);
return 0;
}
int uprverr(bw)
BW *bw;
{
int omid;
if(errptr->link.prev==&errors)
{
msgnw(bw,"No more errors");
return -1;
}
errptr=errptr->link.prev;
if(!bw->b->name || zcmp(errptr->file,bw->b->name))
{
if(doedit(bw,vsdup(errptr->file),NULL,NULL)) return -1;
bw=(BW *)maint->curwin->object;
}
omid=mid; mid=1;
pline(bw->cursor,errptr->line);
setline(errbuf,errptr->src);
dofollows();
mid=omid;
bw->cursor->xcol=piscol(bw->cursor);
msgnw(bw,errptr->msg);
return 0;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.