mirror of
https://github.com/nzp-team/fteqw.git
synced 2025-02-18 09:51:50 +00:00
------------------------------------------------------------------------
r4255 | acceptthis | 2013-03-10 23:55:57 +0000 (Sun, 10 Mar 2013) | 2 lines more verbose type-error messages. fix an issue with chars going missing on the last line (reported by Hectate). ------------------------------------------------------------------------ git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4251 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
066dc81d8b
commit
dd68115e58
4 changed files with 39 additions and 26 deletions
|
@ -944,7 +944,7 @@ static void inline QCC_PR_Expect (char *string)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void editbadfile(char *fname, int line);
|
void editbadfile(char *fname, int line);
|
||||||
char *TypeName(QCC_type_t *type);
|
char *TypeName(QCC_type_t *type, char *buffer, int buffersize);
|
||||||
void QCC_PR_IncludeChunk (char *data, pbool duplicate, char *filename);
|
void QCC_PR_IncludeChunk (char *data, pbool duplicate, char *filename);
|
||||||
void QCC_PR_IncludeChunkEx(char *data, pbool duplicate, char *filename, CompilerConstant_t *cnst);
|
void QCC_PR_IncludeChunkEx(char *data, pbool duplicate, char *filename, CompilerConstant_t *cnst);
|
||||||
void QCC_PR_CloseProcessor(void);
|
void QCC_PR_CloseProcessor(void);
|
||||||
|
|
|
@ -1464,15 +1464,16 @@ static void QCC_fprintfLocals(FILE *f, gofs_t paramstart, gofs_t paramend)
|
||||||
QCC_def_t *var;
|
QCC_def_t *var;
|
||||||
temp_t *t;
|
temp_t *t;
|
||||||
int i;
|
int i;
|
||||||
|
char typebuf[1024];
|
||||||
|
|
||||||
for (var = pr.localvars; var; var = var->nextlocal)
|
for (var = pr.localvars; var; var = var->nextlocal)
|
||||||
{
|
{
|
||||||
if (var->ofs >= paramstart && var->ofs < paramend)
|
if (var->ofs >= paramstart && var->ofs < paramend)
|
||||||
continue;
|
continue;
|
||||||
if (var->arraysize)
|
if (var->arraysize)
|
||||||
fprintf(f, "local %s %s[%i];\n", TypeName(var->type), var->name, var->arraysize);
|
fprintf(f, "local %s %s[%i];\n", TypeName(var->type, typebuf, sizeof(typebuf)), var->name, var->arraysize);
|
||||||
else
|
else
|
||||||
fprintf(f, "local %s %s;\n", TypeName(var->type), var->name);
|
fprintf(f, "local %s %s;\n", TypeName(var->type, typebuf, sizeof(typebuf)), var->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (t = functemps, i = 0; t; t = t->next, i++)
|
for (t = functemps, i = 0; t; t = t->next, i++)
|
||||||
|
@ -3864,13 +3865,16 @@ QCC_def_t *QCC_PR_ParseFunctionCall (QCC_def_t *func) //warning, the func could
|
||||||
}
|
}
|
||||||
if (!inh)
|
if (!inh)
|
||||||
{
|
{
|
||||||
|
char typebuf1[1024];
|
||||||
|
char typebuf2[1024];
|
||||||
if (flag_laxcasts || (p->type == ev_function && e->type->type == ev_function))
|
if (flag_laxcasts || (p->type == ev_function && e->type->type == ev_function))
|
||||||
{
|
{
|
||||||
QCC_PR_ParseWarning(WARN_LAXCAST, "type mismatch on parm %i - (%s should be %s)", arg+1, TypeName(e->type), TypeName(p));
|
|
||||||
|
QCC_PR_ParseWarning(WARN_LAXCAST, "type mismatch on parm %i - (%s should be %s)", arg+1, TypeName(e->type, typebuf1, sizeof(typebuf1)), TypeName(p, typebuf2, sizeof(typebuf2)));
|
||||||
QCC_PR_ParsePrintDef(WARN_LAXCAST, func);
|
QCC_PR_ParsePrintDef(WARN_LAXCAST, func);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
QCC_PR_ParseErrorPrintDef (ERR_TYPEMISMATCHPARM, func, "type mismatch on parm %i - (%s should be %s)", arg+1, TypeName(e->type), TypeName(p));
|
QCC_PR_ParseErrorPrintDef (ERR_TYPEMISMATCHPARM, func, "type mismatch on parm %i - (%s should be %s)", arg+1, TypeName(e->type, typebuf1, sizeof(typebuf1)), TypeName(p, typebuf2, sizeof(typebuf2)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7688,12 +7692,13 @@ void QCC_WriteAsmFunction(QCC_def_t *sc, unsigned int firststatement, gofs_t fir
|
||||||
gofs_t o;
|
gofs_t o;
|
||||||
QCC_type_t *type;
|
QCC_type_t *type;
|
||||||
QCC_def_t *param;
|
QCC_def_t *param;
|
||||||
|
char typebuf[512];
|
||||||
|
|
||||||
if (!asmfile)
|
if (!asmfile)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
type = sc->type;
|
type = sc->type;
|
||||||
fprintf(asmfile, "%s(", TypeName(type->aux_type));
|
fprintf(asmfile, "%s(", TypeName(type->aux_type, typebuf, sizeof(typebuf)));
|
||||||
p = type->num_parms;
|
p = type->num_parms;
|
||||||
for (o = firstparm, i = 0, type = type->param; i < p; i++, type = type->next)
|
for (o = firstparm, i = 0, type = type->param; i < p; i++, type = type->next)
|
||||||
{
|
{
|
||||||
|
@ -7706,9 +7711,9 @@ void QCC_WriteAsmFunction(QCC_def_t *sc, unsigned int firststatement, gofs_t fir
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (param)
|
if (param)
|
||||||
fprintf(asmfile, "%s %s", TypeName(type), param->name);
|
fprintf(asmfile, "%s %s", TypeName(type, typebuf, sizeof(typebuf)), param->name);
|
||||||
else
|
else
|
||||||
fprintf(asmfile, "%s", TypeName(type));
|
fprintf(asmfile, "%s", TypeName(type, typebuf, sizeof(typebuf)));
|
||||||
|
|
||||||
o += type->size;
|
o += type->size;
|
||||||
}
|
}
|
||||||
|
@ -8407,6 +8412,7 @@ QCC_def_t *QCC_PR_DummyDef(QCC_type_t *type, char *name, QCC_def_t *scope, int a
|
||||||
char newname[256];
|
char newname[256];
|
||||||
int a;
|
int a;
|
||||||
QCC_def_t *def, *first=NULL;
|
QCC_def_t *def, *first=NULL;
|
||||||
|
char typebuf[1024];
|
||||||
|
|
||||||
#define KEYWORD(x) if (!STRCMP(name, #x) && keyword_##x) {if (keyword_##x)QCC_PR_ParseWarning(WARN_KEYWORDDISABLED, "\""#x"\" keyword used as variable name%s", keywords_coexist?" - coexisting":" - disabling");keyword_##x=keywords_coexist;}
|
#define KEYWORD(x) if (!STRCMP(name, #x) && keyword_##x) {if (keyword_##x)QCC_PR_ParseWarning(WARN_KEYWORDDISABLED, "\""#x"\" keyword used as variable name%s", keywords_coexist?" - coexisting":" - disabling");keyword_##x=keywords_coexist;}
|
||||||
if (name)
|
if (name)
|
||||||
|
@ -8558,7 +8564,7 @@ QCC_def_t *QCC_PR_DummyDef(QCC_type_t *type, char *name, QCC_def_t *scope, int a
|
||||||
pHash_Add(&globalstable, first->name, first, qccHunkAlloc(sizeof(bucket_t)));
|
pHash_Add(&globalstable, first->name, first, qccHunkAlloc(sizeof(bucket_t)));
|
||||||
|
|
||||||
if (!scope && asmfile)
|
if (!scope && asmfile)
|
||||||
fprintf(asmfile, "%s %s;\n", TypeName(first->type), first->name);
|
fprintf(asmfile, "%s %s;\n", TypeName(first->type, typebuf, sizeof(typebuf)), first->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
return first;
|
return first;
|
||||||
|
@ -8582,6 +8588,7 @@ QCC_def_t *QCC_PR_GetDef (QCC_type_t *type, char *name, QCC_def_t *scope, pbool
|
||||||
QCC_def_t *def;
|
QCC_def_t *def;
|
||||||
// char element[MAX_NAME];
|
// char element[MAX_NAME];
|
||||||
QCC_def_t *foundstatic = NULL;
|
QCC_def_t *foundstatic = NULL;
|
||||||
|
char typebuf1[1024], typebuf2[1024];
|
||||||
|
|
||||||
if (!allocate)
|
if (!allocate)
|
||||||
arraysize = -1;
|
arraysize = -1;
|
||||||
|
@ -8599,7 +8606,7 @@ QCC_def_t *QCC_PR_GetDef (QCC_type_t *type, char *name, QCC_def_t *scope, pbool
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type && typecmp(def->type, type))
|
if (type && typecmp(def->type, type))
|
||||||
QCC_PR_ParseErrorPrintDef (ERR_TYPEMISMATCHREDEC, def, "Type mismatch on redeclaration of %s. %s, should be %s",name, TypeName(type), TypeName(def->type));
|
QCC_PR_ParseErrorPrintDef (ERR_TYPEMISMATCHREDEC, def, "Type mismatch on redeclaration of %s. %s, should be %s",name, TypeName(type, typebuf1, sizeof(typebuf1)), TypeName(def->type, typebuf2, sizeof(typebuf2)));
|
||||||
if (def->arraysize != arraysize && arraysize>=0)
|
if (def->arraysize != arraysize && arraysize>=0)
|
||||||
QCC_PR_ParseErrorPrintDef (ERR_TYPEMISMATCHARRAYSIZE, def, "Array sizes for redecleration of %s do not match",name);
|
QCC_PR_ParseErrorPrintDef (ERR_TYPEMISMATCHARRAYSIZE, def, "Array sizes for redecleration of %s do not match",name);
|
||||||
if (allocate && scope)
|
if (allocate && scope)
|
||||||
|
@ -8638,10 +8645,10 @@ QCC_def_t *QCC_PR_GetDef (QCC_type_t *type, char *name, QCC_def_t *scope, pbool
|
||||||
if (typecmp_lax(def->type, type))
|
if (typecmp_lax(def->type, type))
|
||||||
{
|
{
|
||||||
//unequal even when we're lax
|
//unequal even when we're lax
|
||||||
QCC_PR_ParseError (ERR_TYPEMISMATCHREDEC, "Type mismatch on redeclaration of %s. %s, should be %s",name, TypeName(type), TypeName(def->type));
|
QCC_PR_ParseError (ERR_TYPEMISMATCHREDEC, "Type mismatch on redeclaration of %s. %s, should be %s",name, TypeName(type, typebuf1, sizeof(typebuf1)), TypeName(def->type, typebuf2, sizeof(typebuf2)));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
QCC_PR_ParseWarning (WARN_LAXCAST, "Optional arguments differ on redeclaration of %s. %s, should be %s",name, TypeName(type), TypeName(def->type));
|
QCC_PR_ParseWarning (WARN_LAXCAST, "Optional arguments differ on redeclaration of %s. %s, should be %s",name, TypeName(type, typebuf1, sizeof(typebuf1)), TypeName(def->type, typebuf2, sizeof(typebuf2)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (def->arraysize != arraysize && arraysize>=0)
|
if (def->arraysize != arraysize && arraysize>=0)
|
||||||
|
@ -8677,7 +8684,7 @@ QCC_def_t *QCC_PR_GetDef (QCC_type_t *type, char *name, QCC_def_t *scope, pbool
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type && typecmp(def->type, type))
|
if (type && typecmp(def->type, type))
|
||||||
QCC_PR_ParseError (ERR_TYPEMISMATCHREDEC, "Type mismatch on redeclaration of %s. %s, should be %s",name, TypeName(type), TypeName(def->type));
|
QCC_PR_ParseError (ERR_TYPEMISMATCHREDEC, "Type mismatch on redeclaration of %s. %s, should be %s",name, TypeName(type, typebuf1, sizeof(typebuf1)), TypeName(def->type, typebuf2, sizeof(typebuf2)));
|
||||||
if (def->arraysize != arraysize && arraysize>=0)
|
if (def->arraysize != arraysize && arraysize>=0)
|
||||||
QCC_PR_ParseError (ERR_TYPEMISMATCHARRAYSIZE, "Array sizes for redecleration of %s do not match",name);
|
QCC_PR_ParseError (ERR_TYPEMISMATCHARRAYSIZE, "Array sizes for redecleration of %s do not match",name);
|
||||||
if (allocate && scope)
|
if (allocate && scope)
|
||||||
|
@ -8713,13 +8720,14 @@ QCC_def_t *QCC_PR_GetDef (QCC_type_t *type, char *name, QCC_def_t *scope, pbool
|
||||||
{
|
{
|
||||||
if (!pr_scope)
|
if (!pr_scope)
|
||||||
{
|
{
|
||||||
|
char typebuf1[1024], typebuf2[1024];
|
||||||
if (typecmp_lax(def->type, type))
|
if (typecmp_lax(def->type, type))
|
||||||
{
|
{
|
||||||
//unequal even when we're lax
|
//unequal even when we're lax
|
||||||
QCC_PR_ParseError (ERR_TYPEMISMATCHREDEC, "Type mismatch on redeclaration of %s. %s, should be %s",name, TypeName(type), TypeName(def->type));
|
QCC_PR_ParseError (ERR_TYPEMISMATCHREDEC, "Type mismatch on redeclaration of %s. %s, should be %s",name, TypeName(type, typebuf1, sizeof(typebuf1)), TypeName(def->type, typebuf2, sizeof(typebuf2)));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
QCC_PR_ParseWarning (WARN_LAXCAST, "Optional arguments differ on redeclaration of %s. %s, should be %s",name, TypeName(type), TypeName(def->type));
|
QCC_PR_ParseWarning (WARN_LAXCAST, "Optional arguments differ on redeclaration of %s. %s, should be %s",name, TypeName(type, typebuf1, sizeof(typebuf1)), TypeName(def->type, typebuf2, sizeof(typebuf2)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (def->arraysize != arraysize && arraysize>=0)
|
if (def->arraysize != arraysize && arraysize>=0)
|
||||||
|
@ -9759,11 +9767,12 @@ void QCC_PR_ParseDefs (char *classname)
|
||||||
|
|
||||||
if (classname)
|
if (classname)
|
||||||
{
|
{
|
||||||
|
char typebuf[1024];
|
||||||
char *membername = name;
|
char *membername = name;
|
||||||
name = qccHunkAlloc(strlen(classname) + strlen(name) + 3);
|
name = qccHunkAlloc(strlen(classname) + strlen(name) + 3);
|
||||||
sprintf(name, "%s::"MEMBERFIELDNAME, classname, membername);
|
sprintf(name, "%s::"MEMBERFIELDNAME, classname, membername);
|
||||||
if (!QCC_PR_GetDef(NULL, name, NULL, false, 0, false))
|
if (!QCC_PR_GetDef(NULL, name, NULL, false, 0, false))
|
||||||
QCC_PR_ParseError(ERR_NOTANAME, "%s %s is not a member of class %s\n", TypeName(type), membername, classname);
|
QCC_PR_ParseError(ERR_NOTANAME, "%s %s is not a member of class %s\n", TypeName(type, typebuf, sizeof(typebuf)), membername, classname);
|
||||||
sprintf(name, "%s::%s", classname, membername);
|
sprintf(name, "%s::%s", classname, membername);
|
||||||
|
|
||||||
pr_classtype = QCC_TypeForName(classname);
|
pr_classtype = QCC_TypeForName(classname);
|
||||||
|
|
|
@ -3360,15 +3360,18 @@ QCC_type_t *QCC_PR_DuplicateType(QCC_type_t *in)
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *TypeName(QCC_type_t *type)
|
char *TypeName(QCC_type_t *type, char *buffer, int buffersize)
|
||||||
{
|
{
|
||||||
static char buffer[2][512];
|
|
||||||
static int op;
|
|
||||||
char *ret;
|
char *ret;
|
||||||
|
|
||||||
|
if (type->type == ev_pointer)
|
||||||
|
{
|
||||||
|
TypeName(type->aux_type, buffer, buffersize-2);
|
||||||
|
strcat(buffer, " *");
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
op++;
|
ret = buffer;
|
||||||
ret = buffer[op&1];
|
|
||||||
if (type->type == ev_field)
|
if (type->type == ev_field)
|
||||||
{
|
{
|
||||||
type = type->aux_type;
|
type = type->aux_type;
|
||||||
|
@ -3410,7 +3413,7 @@ char *TypeName(QCC_type_t *type)
|
||||||
}
|
}
|
||||||
else if (type->type == ev_entity && type->parentclass)
|
else if (type->type == ev_entity && type->parentclass)
|
||||||
{
|
{
|
||||||
ret = buffer[op&1];
|
ret = buffer;
|
||||||
*ret = 0;
|
*ret = 0;
|
||||||
strcat(ret, "class ");
|
strcat(ret, "class ");
|
||||||
strcat(ret, type->name);
|
strcat(ret, type->name);
|
||||||
|
@ -3430,7 +3433,7 @@ char *TypeName(QCC_type_t *type)
|
||||||
else
|
else
|
||||||
strcpy(ret, type->name);
|
strcpy(ret, type->name);
|
||||||
|
|
||||||
return buffer[op&1];
|
return buffer;
|
||||||
}
|
}
|
||||||
//#define typecmp(a, b) (a && ((a)->type==(b)->type) && !STRCMP((a)->name, (b)->name))
|
//#define typecmp(a, b) (a && ((a)->type==(b)->type) && !STRCMP((a)->name, (b)->name))
|
||||||
|
|
||||||
|
|
|
@ -477,11 +477,12 @@ char *GetTooltipText(editor_t *editor)
|
||||||
if (def)
|
if (def)
|
||||||
{
|
{
|
||||||
static char buffer[1024];
|
static char buffer[1024];
|
||||||
|
char typebuf[1024];
|
||||||
//note function argument names do not persist beyond the function def. we might be able to read the function's localdefs for them, but that's unreliable/broken with builtins where they're most needed.
|
//note function argument names do not persist beyond the function def. we might be able to read the function's localdefs for them, but that's unreliable/broken with builtins where they're most needed.
|
||||||
if (def->comment)
|
if (def->comment)
|
||||||
_snprintf(buffer, sizeof(buffer)-1, "%s %s\r\n%s", TypeName(def->type), def->name, def->comment);
|
_snprintf(buffer, sizeof(buffer)-1, "%s %s\r\n%s", TypeName(def->type, typebuf, sizeof(typebuf)), def->name, def->comment);
|
||||||
else
|
else
|
||||||
_snprintf(buffer, sizeof(buffer)-1, "%s %s", TypeName(def->type), def->name);
|
_snprintf(buffer, sizeof(buffer)-1, "%s %s", TypeName(def->type, typebuf, sizeof(typebuf)), def->name);
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1190,7 +1191,7 @@ int EditorSave(editor_t *edit)
|
||||||
MessageBox(NULL, "Save failed - not enough mem", "Error", 0);
|
MessageBox(NULL, "Save failed - not enough mem", "Error", 0);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
Edit_GetText(edit->editpane, file, len);
|
Edit_GetText(edit->editpane, file, len+1);
|
||||||
if (!QCC_WriteFile(edit->filename, file, len))
|
if (!QCC_WriteFile(edit->filename, file, len))
|
||||||
{
|
{
|
||||||
MessageBox(NULL, "Save failed\nCheck path and ReadOnly flags", "Failure", 0);
|
MessageBox(NULL, "Save failed\nCheck path and ReadOnly flags", "Failure", 0);
|
||||||
|
|
Loading…
Reference in a new issue