📄 error.c
字号:
/*
* 68K/386 32-bit C compiler.
*
* copyright (c) 1997, David Lindauer
*
* This compiler is intended for educational use. It may not be used
* for profit without the express written consent of the author.
*
* It may be freely redistributed, as long as this notice remains intact
* and either the original sources or derived sources
* are distributed along with any executables derived from the originals.
*
* The author is not responsible for any damages that may arise from use
* of this software, either idirect or consequential.
*
* v1.35 March 1997
* David Lindauer, gclind01@starbase.spd.louisville.edu
*
* Credits to Mathew Brandt for original K&R C compiler
*
*/
/*
* error handler
*/
#include <stdio.h>
#include <string.h>
#include "expr.h"
#include "c.h"
#include "errors.h"
#include "diag.h"
extern int prm_errfile;
extern FILE *errFile;
extern int global_flag;
extern FILE *listFile;
extern int errlineno;
extern char *errfile;
extern int prm_asmfile;
extern FILE *outputFile;
extern int prm_maxerr;
extern int prm_diag;
extern int prm_listfile;
extern int lastch;
extern enum e_sym lastst;
extern char lastid[];
extern int lineno;
extern FILE *inclfile[10]; /* shared with preproc */
extern int incldepth; /* shared with preproc */
extern char *infile;
extern SYM *currentfunc;
extern int prm_warning,prm_cplusplus;
int diagcount = 0;
ERRORS *errlist = 0;
static ERRORS *errtail = 0;
static ERRORS *curerr = 0;
static char expectlist[] = { "########################=##############,:;#[]{}()" };
static int errline;
/* table of which warnings are enabled */
char nowarn[ERR_MAX];
/* table of warning keywords for the -w command line option
*/
char warnarray[ERR_MAX][4] = {
"all","","","","","","","",
"","","","","","","","",
"","","","","","","","",
"","","","","","","","",
"","","","","cln","","","",
"","","","","","","","",
"","","","","","ret","sun","sud",
"sas","npo","urc","fun","cno","ieq","","nco",
"lad","","","zer","dpc","nsf","lun","pro",
"cnv","","irg","san","ssu","","","",
"","","tua","","tui","","","",
"","","","","","","","",
"","","","","","suz","fsu","lli",
"","","","","","spc","","",
"","","","","","","","",
"","","","","",""
};
int total_errors = 0;
void initerr(void)
{
errlist = errtail = curerr = 0;
total_errors = 0;
diagcount = 0;
errline = 0;
}
/*
* handling for warnings on the command line
*/
void warning_setup(char select, char *string)
{
int bool = FALSE;
while (*string) {
int i;
if (string[0] == '-') {
bool = TRUE;
string++;
}
else
if (string[0] == '+')
string++;
for (i=0; i < ERR_MAX; i++)
if (!strncmp(warnarray[i],string,3)) {
if (i== 0) {
int j;
for (j =0; j < ERR_MAX; j++)
nowarn[j] = (unsigned char)bool;
}
else
nowarn[i] = (unsigned char)bool;
string += 3;
break;
}
if (i==ERR_MAX) {
fatal("Invalid warning");
}
}
}
#ifdef DIAGNOSTICS
void diag(char *s)
/*
* internal diags come here
*/
{
diagcount++;
if (prm_diag) {
printf("DIAG - %s\n",s);
if (prm_errfile && errFile)
fprintf(errFile,"/*DIAG - %s*/",s);
if (prm_listfile && listFile)
fprintf(listFile,"/*DIAG - %s*/",s);
if (prm_asmfile)
fprintf(outputFile,"DIAG - %s\n",s);
}
}
#endif
int printerr(char *buf, ERRORS *err)
/*
* subroutine gets the error code and returns whether it is an error or
* warning
*/
{
int errlvl = 0;
switch (err->errornumber) {
case ERR_NOCASE:
sprintf(buf,"Expected 'case' or 'default'");
break;
case ERR_PUNCT:
sprintf(buf,"Expected '%c'",expectlist[(int)err->data]);
break;
case ERR_INSERT:
sprintf(buf,"Inserted '%c'",expectlist[(int)err->data]);
break;
case ERR_NEEDCHAR:
sprintf(buf,"Expected '%c'",(char)err->data);
break;
case ERR_ILLCHAR:
sprintf(buf,"Illegal character '%c'",(char)err->data);
break;
case ERR_NEEDCONST:
sprintf(buf,"Constant value expected");
break;
case ERR_UNDEFINED:
sprintf(buf,"Undefined symbol '%s'", (char *)err->data);
break;
case ERR_DUPSYM:
sprintf(buf,"Duplicate symbol '%s'", (char *)err->data);
break;
case ERR_IDENTEXPECT:
sprintf(buf,"Expected '%s'",(char *)err->data);
break;
case ERR_IDEXPECT:
sprintf(buf,"Identifier expected");
break;
case ERR_INITSIZE:
sprintf(buf,"Too many initializers");
break;
case ERR_NOINIT:
sprintf(buf,"Cannot initialize '%s'",(char *)err->data);
break;
case ERR_PREPROCID:
sprintf(buf,"Invalid preprocessor directive '%s'",(char *)err->data);
break;
case ERR_INCLFILE:
sprintf(buf,"File name expected in #include directive");
break;
case ERR_CANTOPEN:
sprintf(buf,"Cannot open file \"%s\" for read access",(char *)err->data);
break;
case ERR_ILLCLASS:
sprintf(buf,"Illegal storage class specifier '%s'",(char *)err->data);
break;
case ERR_ILLCLASS2:
sprintf(buf,"Illegal storage class specifier on '%s'",(char *)err->data);
break;
case ERR_DUPCASE:
sprintf(buf,"Duplicate case %d",(int)err->data);
break;
case ERR_RETMISMATCH:
sprintf(buf,"Type mismatch in return");
break;
case ERR_ARGMISMATCH:
sprintf(buf,"Type mismatch in arg '%s'",(char *)err->data);
break;
case ERR_ARGLENSHORT:
sprintf(buf,"Argument list too short in redeclaration of function '%s'",(char *)err->data);
break;
case ERR_ARGLENLONG:
sprintf(buf,"Argument list too long in redeclaration of function '%s'",(char*)err->data);
break;
case ERR_DECLMISMATCH:
sprintf(buf,"Type mismatch in redeclaration of '%s'",(char *)err->data);
break;
case ERR_CALLMISMATCH:
sprintf(buf,"Type mismatch in arg %s",(char *)err->data);
break;
case ERR_CALLLENSHORT:
sprintf(buf,"Argument list too short %s",(char *)err->data);
break;
case ERR_CALLLENLONG:
sprintf(buf,"Argument list too long %s",(char *)err->data);
errlvl = 1;
break;
case ERR_LABEL:
sprintf(buf,"'%s' is not a label",(char *)err->data);
break;
case ERR_NOPOINTER:
sprintf(buf,"Pointer type expected");
break;
case ERR_LVALUE:
sprintf(buf,"Lvalue expected");
break;
case ERR_NOFUNC:
sprintf(buf,"'%s' is not a function",(char *)err->data);
break;
case ERR_MISMATCH:
sprintf(buf,"Type mismatch");
break;
case ERR_ELSE:
sprintf(buf,"Misplaced else");
break;
case ERR_EXPREXPECT:
sprintf(buf,"Expression expected");
break;
case ERR_DEREF:
sprintf(buf,"Illegal pointer");
break;
case ERR_UNEXPECT:
if (lastst == id)
sprintf(buf,"Unexpected '%s'",lastid);
else
sprintf(buf,"Unexpected '%c'",lastch);
break;
case ERR_ILLTYPE:
sprintf(buf,"Illegal typedef of '%s'",(char *)err->data);
break;
case ERR_ARRAYMISMATCH:
sprintf(buf,"Non-scalar array index");
break;
case ERR_PREPROCMATCH:
sprintf(buf,"Unbalanced preprocessor directives");
break;
case ERR_MACROSUBS:
sprintf(buf,"Macro substitution error");
break;
case ERR_DECLEXPECT:
sprintf(buf,"Declaration expected");
break;
case ERR_INVFLOAT:
sprintf(buf,"Invalid floating point");
break;
case ERR_INVTRAP:
sprintf(buf,"Invalid trap id");
break;
case ERR_BFILLEGAL:
sprintf(buf,"Cannot use bit field as a non-member");
break;
case ERR_BFTOOBIG:
sprintf(buf,"Bit field too big");
break;
case ERR_BFTYPE:
sprintf(buf,"Bit field only allowed on scalar types");
break;
case ERR_ERROR:
sprintf(buf,"User error: %s",(char *)err->data);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -