Fix up fteqcc's typedefs.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@6303 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2022-08-08 22:45:19 +00:00
parent a0f2ffda90
commit f8af9b18eb
13 changed files with 198 additions and 160 deletions

View file

@ -1534,7 +1534,9 @@ SET(FTE_MENU_SYS true CACHE BOOL "Compile System Menu.")
IF(FTE_MENU_SYS) IF(FTE_MENU_SYS)
ADD_CUSTOM_TARGET(menusys ALL ADD_CUSTOM_TARGET(menusys ALL
VERBATIM VERBATIM
COMMAND fteqcc -srcfile "${CMAKE_CURRENT_SOURCE_DIR}/quakec/menusys/menu.src" -o "${CMAKE_CURRENT_BINARY_DIR}/menu.dat" DEPENDS fteqcc
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/quakec/menusys/"
COMMAND fteqcc -srcfile "menu.src" -o "${CMAKE_CURRENT_BINARY_DIR}/menu.dat"
BYPRODUCTS "${CMAKE_CURRENT_BINARY_DIR}/menu.dat" "${CMAKE_CURRENT_BINARY_DIR}/menu.lno" BYPRODUCTS "${CMAKE_CURRENT_BINARY_DIR}/menu.dat" "${CMAKE_CURRENT_BINARY_DIR}/menu.lno"
SOURCES SOURCES
quakec/menusys/menu.src quakec/menusys/menu.src
@ -1572,3 +1574,34 @@ IF(FTE_MENU_SYS)
quakec/menusys/menu/quit.qc quakec/menusys/menu/quit.qc
) )
ENDIF() ENDIF()
SET(FTE_CSADDON true CACHE BOOL "CS Addon.")
IF(FTE_CSADDON)
ADD_CUSTOM_TARGET(csaddon ALL
VERBATIM
DEPENDS fteqcc
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/quakec/csaddon/src/"
COMMAND fteqcc -srcfile "csaddon.src" -o "${CMAKE_CURRENT_BINARY_DIR}/csaddon.dat"
BYPRODUCTS "${CMAKE_CURRENT_BINARY_DIR}/csaddon.dat" "${CMAKE_CURRENT_BINARY_DIR}/csaddon.lno"
SOURCES
quakec/csaddon/src/csaddon.src
quakec/csaddon/src/csplat.qc
quakec/csaddon/src/csfixups.qc
quakec/csaddon/src/editor_lights.qc
quakec/csaddon/src/editor_terrain.qc
quakec/csaddon/src/brush_selection.qc
quakec/csaddon/src/brush_history.qc
quakec/csaddon/src/brush_manip.qc
quakec/csaddon/src/brush_draw.qc
quakec/csaddon/src/brush_vertedit.qc
quakec/csaddon/src/editor_brushes.qc
quakec/csaddon/src/editor_ents.qc
quakec/csaddon/src/textfield.qc
quakec/csaddon/src/editor_particles.qc
quakec/csaddon/src/menu.qc
quakec/csaddon/src/cam.qc
quakec/csaddon/src/csaddon.qc
)
ENDIF()

View file

@ -94,7 +94,8 @@ ev_struct, //big complex type
ev_union, //not really sure why this is separate from struct ev_union, //not really sure why this is separate from struct
ev_accessor,//some weird type to provide class-like functions over a basic type. ev_accessor,//some weird type to provide class-like functions over a basic type.
ev_enum, //just a numeric type ev_enum, //just a numeric type
ev_boolean //exists to optimise if(-0) workarounds. ev_typedef, //so typedefs can refer to their original type (primarily for structs).
ev_boolean, //exists to optimise if(-0) workarounds. engine just sees int/float.
} etype_t; } etype_t;
enum { enum {
DEBUG_TRACE_OFF, //debugging should be off. DEBUG_TRACE_OFF, //debugging should be off.

View file

@ -595,6 +595,13 @@ extern int pr_token_line_last;
extern QCC_type_t *pr_immediate_type; extern QCC_type_t *pr_immediate_type;
extern QCC_eval_t pr_immediate; extern QCC_eval_t pr_immediate;
extern int verbose;
#define VERBOSE_WARNINGSONLY -1
#define VERBOSE_PROGRESS 0
#define VERBOSE_STANDARD 1
#define VERBOSE_DEBUG 2
#define VERBOSE_DEBUGSTATEMENTS 3 //figuring out the files can be expensive.
extern pbool keyword_asm; extern pbool keyword_asm;
extern pbool keyword_break; extern pbool keyword_break;
extern pbool keyword_case; extern pbool keyword_case;
@ -1089,7 +1096,6 @@ void QCC_PR_EmitArraySetFunction(QCC_def_t *defscope, QCC_def_t *thearray, char
void QCC_PR_EmitClassFromFunction(QCC_def_t *defscope, QCC_type_t *basetype); void QCC_PR_EmitClassFromFunction(QCC_def_t *defscope, QCC_type_t *basetype);
void QCC_PR_ParseDefs (char *classname, pbool fatal); void QCC_PR_ParseDefs (char *classname, pbool fatal);
void QCC_PR_ParseTypedef(void);
QCC_def_t *QCC_PR_DummyDef(QCC_type_t *type, const char *name, QCC_function_t *scope, int arraysize, QCC_def_t *rootsymbol, unsigned int ofs, int referable, unsigned int flags); QCC_def_t *QCC_PR_DummyDef(QCC_type_t *type, const char *name, QCC_function_t *scope, int arraysize, QCC_def_t *rootsymbol, unsigned int ofs, int referable, unsigned int flags);
void QCC_PR_ParseInitializerDef(QCC_def_t *def, unsigned int flags); void QCC_PR_ParseInitializerDef(QCC_def_t *def, unsigned int flags);
void QCC_PR_FinaliseFunctions(void); void QCC_PR_FinaliseFunctions(void);

View file

@ -37,6 +37,7 @@ const unsigned int type_size[] = {1, //void
0, //ev_union. variable sized. 0, //ev_union. variable sized.
0, //ev_accessor... 0, //ev_accessor...
0, //ev_enum... 0, //ev_enum...
0, //ev_typedef
1, //ev_bool... 1, //ev_bool...
}; };

View file

@ -9021,7 +9021,7 @@ QCC_ref_t *QCC_PR_ParseRefArrayPointer (QCC_ref_t *retbuf, QCC_ref_t *r, pbool a
QCC_type_t *t; QCC_type_t *t;
QCC_sref_t idx; QCC_sref_t idx;
QCC_sref_t tmp; QCC_sref_t tmp;
pbool allowarray; pbool allowarray, arraytype;
unsigned int arraysize; unsigned int arraysize;
unsigned int rewindpoint = numstatements; unsigned int rewindpoint = numstatements;
pbool dereference = false; pbool dereference = false;
@ -9036,11 +9036,14 @@ QCC_ref_t *QCC_PR_ParseRefArrayPointer (QCC_ref_t *retbuf, QCC_ref_t *r, pbool a
while(1) while(1)
{ {
allowarray = false; allowarray = false;
arraytype = (t->type == ev_union && t->num_parms == 1 && !t->params[0].paramname); //FIXME
if (arraytype)
arraytype = true;
if (idx.cast) if (idx.cast)
allowarray = arraysize>0 || allowarray = arraysize>0 ||
(t->type == ev_vector) || (t->type == ev_vector) ||
(t->type == ev_field && t->aux_type->type == ev_vector) || (t->type == ev_field && t->aux_type->type == ev_vector) ||
(t->type == ev_union && t->num_parms == 1 && !t->params[0].paramname && !arraysize); (arraytype && !arraysize);
else if (!idx.cast) else if (!idx.cast)
{ {
allowarray = arraysize>0 || allowarray = arraysize>0 ||
@ -9048,6 +9051,7 @@ QCC_ref_t *QCC_PR_ParseRefArrayPointer (QCC_ref_t *retbuf, QCC_ref_t *r, pbool a
(t->type == ev_string) || //strings are effectively pointers (t->type == ev_string) || //strings are effectively pointers
(t->type == ev_vector) || //vectors are mini arrays (t->type == ev_vector) || //vectors are mini arrays
(t->type == ev_field && t->aux_type->type == ev_vector) || //as are field vectors (t->type == ev_field && t->aux_type->type == ev_vector) || //as are field vectors
(arraytype && !arraysize) ||
(!arraysize&&t->accessors); //custom accessors (!arraysize&&t->accessors); //custom accessors
} }
@ -9072,7 +9076,7 @@ QCC_ref_t *QCC_PR_ParseRefArrayPointer (QCC_ref_t *retbuf, QCC_ref_t *r, pbool a
/*if its a pointer that got dereferenced, follow the type*/ /*if its a pointer that got dereferenced, follow the type*/
if (!idx.cast && t->type == ev_pointer && !arraysize) if (!idx.cast && t->type == ev_pointer && !arraysize)
t = t->aux_type; t = t->aux_type;
else if (idx.cast && (t->type == ev_union && t->num_parms == 1 && !t->params[0].paramname && !arraysize)) else if (idx.cast && (arraytype && !arraysize))
{ {
arraysize = t->params[0].arraysize; arraysize = t->params[0].arraysize;
t = t->params[0].type; t = t->params[0].type;
@ -9221,6 +9225,17 @@ fieldarrayindex:
QCC_FreeTemp(idx); QCC_FreeTemp(idx);
return QCC_PR_BuildRef(retbuf, REF_GLOBAL, QCC_MakeIntConst(arraysize), nullsref, type_integer, true); return QCC_PR_BuildRef(retbuf, REF_GLOBAL, QCC_MakeIntConst(arraysize), nullsref, type_integer, true);
} }
else if (arraytype && (QCC_PR_CheckToken(".") || QCC_PR_CheckToken("->")))
{
//the only field of an array type is the 'length' property.
//if we calculated offsets etc, discard those statements.
numstatements = rewindpoint;
QCC_PR_Expect("length");
QCC_FreeTemp(r->base);
QCC_FreeTemp(r->index);
QCC_FreeTemp(idx);
return QCC_PR_BuildRef(retbuf, REF_GLOBAL, QCC_MakeIntConst(t->params[0].arraysize), nullsref, type_integer, true);
}
else if (t->type == ev_vector && !arraysize && !t->accessors && QCC_PR_CheckToken(".")) else if (t->type == ev_vector && !arraysize && !t->accessors && QCC_PR_CheckToken("."))
{ {
char *swizzle = QCC_PR_ParseName(); char *swizzle = QCC_PR_ParseName();
@ -13619,16 +13634,11 @@ void QCC_PR_ParseStatement (void)
QCC_PR_ParseDefs (NULL, true); QCC_PR_ParseDefs (NULL, true);
return; return;
} }
if (QCC_PR_CheckKeyword(keyword_typedef, "typedef"))
{
QCC_PR_ParseTypedef();
return;
}
if (pr_token_type == tt_name) if (pr_token_type == tt_name)
{ {
QCC_type_t *type = QCC_TypeForName(pr_token); QCC_type_t *type = QCC_TypeForName(pr_token);
if (type && type->typedefed) if (type)
{ {
if (strncmp(pr_file_p, "::", 2)) if (strncmp(pr_file_p, "::", 2))
{ {
@ -13654,6 +13664,7 @@ void QCC_PR_ParseStatement (void)
( !STRCMP ("_Bool", pr_token)) || ( !STRCMP ("_Bool", pr_token)) ||
(keyword_static && !STRCMP ("static", pr_token)) || (keyword_static && !STRCMP ("static", pr_token)) ||
(keyword_class && !STRCMP ("class", pr_token)) || (keyword_class && !STRCMP ("class", pr_token)) ||
(keyword_typedef && !STRCMP ("typedef", pr_token)) ||
(keyword_const && !STRCMP ("const", pr_token))) (keyword_const && !STRCMP ("const", pr_token)))
{ {
QCC_PR_ParseDefs (NULL, true); QCC_PR_ParseDefs (NULL, true);
@ -16603,6 +16614,9 @@ QCC_def_t *QCC_PR_DummyDef(QCC_type_t *type, const char *name, QCC_function_t *s
break; break;
case ev_void: case ev_void:
break; break;
case ev_typedef: //invalid
QCC_PR_ParseWarning(ERR_INTERNAL, "unexpected typedef");
break;
} }
} }
} }
@ -17061,6 +17075,9 @@ static QCC_def_t *QCC_PR_DummyFieldDef(QCC_type_t *type, QCC_function_t *scope,
break; break;
case ev_void: case ev_void:
break; break;
case ev_typedef: //invalid
QCC_PR_ParseWarning(ERR_INTERNAL, "unexpected typedef");
break;
} }
if (*fieldofs > maxfield) if (*fieldofs > maxfield)
maxfield = *fieldofs; maxfield = *fieldofs;
@ -17313,7 +17330,6 @@ QCC_sref_t QCC_PR_ParseInitializerType_Internal(int arraysize, QCC_def_t *basede
} }
else else
{ {
pbool isblock;
QCC_type_t *type = def.cast; QCC_type_t *type = def.cast;
if (type->type == ev_function && pr_token_type == tt_punct) if (type->type == ev_function && pr_token_type == tt_punct)
{ {
@ -17512,8 +17528,14 @@ QCC_sref_t QCC_PR_ParseInitializerType_Internal(int arraysize, QCC_def_t *basede
QCC_PR_Lex(); QCC_PR_Lex();
QCC_PR_Expect(")"); QCC_PR_Expect(")");
} }
else if ((isblock=(type->type == ev_struct || type->type == ev_union) && QCC_PR_CheckToken("{")) else if (type->type == ev_union && type->num_parms == 1 && !type->params->paramname)
|| (type->type == ev_union && type->num_parms == 1 && !type->params->paramname)) { //weird typedefed array hack
def.cast = (type)->params[0].type;
ret &= QCC_PR_ParseInitializerType((type)->params[0].arraysize, basedef, def, flags);
def.cast = type;
return ret?def:nullsref;
}
else if ((type->type == ev_struct || type->type == ev_union) && QCC_PR_CheckToken("{"))
{ {
//structs go recursive //structs go recursive
QCC_type_t *parenttype; QCC_type_t *parenttype;
@ -17585,8 +17607,6 @@ QCC_sref_t QCC_PR_ParseInitializerType_Internal(int arraysize, QCC_def_t *basede
ret &= QCC_PR_ParseInitializerType((type)->params[partnum].arraysize, basedef, def, flags); ret &= QCC_PR_ParseInitializerType((type)->params[partnum].arraysize, basedef, def, flags);
if (isunion || !QCC_PR_CheckToken(",")) if (isunion || !QCC_PR_CheckToken(","))
{ {
if (!isblock)
break;
QCC_PR_Expect("}"); QCC_PR_Expect("}");
break; break;
} }
@ -17962,81 +17982,6 @@ QCC_type_t *QCC_PR_ParseEnum(pbool flags)
return enumtype?enumtype:basetype; return enumtype?enumtype:basetype;
} }
void QCC_PR_ParseTypedef(void)
{
QCC_type_t *old;
QCC_type_t *type = QCC_PR_ParseType(false, false);
if (!type)
{
QCC_PR_ParseError(ERR_NOTATYPE, "typedef found unexpected tokens");
}
do
{
char *name;
if (QCC_PR_CheckToken(";"))
return;
while (QCC_PR_CheckToken("*"))
type = QCC_PointerTypeTo(type);
if (QCC_PR_CheckToken("("))
{ //c-style function pointers are annoying.
int levels = 0;
while (QCC_PR_CheckToken("*"))
levels++;
name = QCC_PR_ParseName();
QCC_PR_Expect(")");
//now parse its args
QCC_PR_Expect("(");
type = QCC_PR_ParseFunctionType(false, type);
//and bring it to the intended indirection level...
while (levels --> 1)
type = QCC_PointerTypeTo(type);
}
else
name = QCC_PR_ParseName();
if (QCC_PR_CheckToken("["))
{
struct QCC_typeparam_s *param = qccHunkAlloc(sizeof(*param));
param->type = type;
param->arraysize = QCC_PR_IntConstExpr();
type = QCC_PR_NewType(name, ev_union, true);
type->params = param;
type->num_parms = 1;
type->size = param->type->size * param->arraysize;
QCC_PR_Expect("]");
}
else
{
old = QCC_TypeForName(name);
if (old && old->scope == pr_scope)
{
if (typecmp(old, type))
{
char obuf[1024];
char nbuf[1024];
old->typedefed = false;
QCC_PR_ParseWarning(ERR_NOTATYPE, "Cannot redeclare typedef %s%s%s from %s%s%s to %s%s%s", col_type,name,col_none, col_type,TypeName(old, obuf, sizeof(obuf)),col_none, col_type,TypeName(type, nbuf, sizeof(nbuf)),col_none);
old->typedefed = true;
}
}
else
{
type = QCC_PR_DuplicateType(type, false);
type->name = name;
type->typedefed = true;
type->scope = pr_scope;
pHash_Add(&typedeftable, name, type, qccHunkAlloc(sizeof(bucket_t)));
}
}
} while(QCC_PR_CheckToken(","));
QCC_PR_Expect(";");
return;
}
/* /*
================ ================
PR_ParseDefs PR_ParseDefs
@ -18054,6 +17999,7 @@ void QCC_PR_ParseDefs (char *classname, pbool fatal_unused)
pbool shared=false; pbool shared=false;
pbool isstatic=defaultstatic; pbool isstatic=defaultstatic;
pbool externfnc=false; pbool externfnc=false;
pbool istypedef=false;
pbool isconstant = false; pbool isconstant = false;
pbool isvar = false; pbool isvar = false;
pbool isinitialised = false; pbool isinitialised = false;
@ -18078,12 +18024,6 @@ void QCC_PR_ParseDefs (char *classname, pbool fatal_unused)
while (QCC_PR_CheckToken(";")) while (QCC_PR_CheckToken(";"))
; ;
if (QCC_PR_CheckKeyword (keyword_typedef, "typedef"))
{
QCC_PR_ParseTypedef();
return;
}
if (flag_acc) if (flag_acc)
{ {
char *oldp; char *oldp;
@ -18242,7 +18182,9 @@ void QCC_PR_ParseDefs (char *classname, pbool fatal_unused)
while(1) while(1)
{ {
if (QCC_PR_CheckKeyword(keyword_extern, "extern")) if (QCC_PR_CheckKeyword (keyword_typedef, "typedef"))
istypedef=true;
else if (QCC_PR_CheckKeyword(keyword_extern, "extern"))
externfnc=true; externfnc=true;
else if (QCC_PR_CheckKeyword(keyword_shared, "shared")) else if (QCC_PR_CheckKeyword(keyword_shared, "shared"))
{ {
@ -18380,6 +18322,9 @@ void QCC_PR_ParseDefs (char *classname, pbool fatal_unused)
type = QCC_PR_ParseFunctionTypeReacc(false, basetype); type = QCC_PR_ParseFunctionTypeReacc(false, basetype);
QCC_PR_Expect(";"); QCC_PR_Expect(";");
if (istypedef)
return;
else
def = QCC_PR_GetDef (basetype, name, NULL, true, 0, false); def = QCC_PR_GetDef (basetype, name, NULL, true, 0, false);
if (autoprototype || dostrip) if (autoprototype || dostrip)
@ -18448,6 +18393,11 @@ void QCC_PR_ParseDefs (char *classname, pbool fatal_unused)
if (QCC_PR_CheckToken (";")) if (QCC_PR_CheckToken (";"))
{ {
if (istypedef)
{
QCC_PR_ParseWarning(WARN_UNEXPECTEDPUNCT, "typedef defines no types");
return;
}
if (type->type == ev_field && (type->aux_type->type == ev_union || type->aux_type->type == ev_struct)) if (type->type == ev_field && (type->aux_type->type == ev_union || type->aux_type->type == ev_struct))
{ {
QCC_PR_ExpandUnionToFields(type, &pr.size_fields); QCC_PR_ExpandUnionToFields(type, &pr.size_fields);
@ -18473,7 +18423,7 @@ void QCC_PR_ParseDefs (char *classname, pbool fatal_unused)
name = QCC_PR_ParseName (); name = QCC_PR_ParseName ();
} }
if (QCC_PR_CheckToken("::") && !classname) if (!istypedef && QCC_PR_CheckToken("::") && !classname)
{ {
classname = name; classname = name;
name = QCC_PR_ParseName(); name = QCC_PR_ParseName();
@ -18491,7 +18441,7 @@ void QCC_PR_ParseDefs (char *classname, pbool fatal_unused)
if (QCC_PR_CheckToken("]")) if (QCC_PR_CheckToken("]"))
{ {
//FIXME: preprocessor will hate this with a passion. //FIXME: preprocessor will hate this with a passion.
if (QCC_PR_CheckToken("=")) if (!istypedef && QCC_PR_CheckToken("="))
{ {
QCC_PR_Expect("{"); QCC_PR_Expect("{");
arraysize++; arraysize++;
@ -18592,8 +18542,54 @@ void QCC_PR_ParseDefs (char *classname, pbool fatal_unused)
else else
defclass = NULL; defclass = NULL;
isinitialised = QCC_PR_CheckToken ("=") || ((type->type == ev_function) && (pr_token[0] == '{' || pr_token[0] == '[' || pr_token[0] == ':')); if (istypedef)
{
QCC_type_t *old;
if (externfnc||shared||isconstant||isvar||forceused||dostrip||allowinline||dowrap||doweak||accumulate||aliasof||deprecated
||(isstatic && !defaultstatic)
||(noref && !defaultnoref)
||(nosave && !defaultnosave) )
QCC_PR_ParseWarning(ERR_BADEXTENSION, "bad combination of modifiers with typedef (defining %s%s%s)", col_type,name,col_none);
if (arraysize)
{
struct QCC_typeparam_s *param = qccHunkAlloc(sizeof(*param));
// QCC_PR_ParseWarning(ERR_BADEXTENSION, "unsupported typedefed array (defining %s%s%s[%i])", col_type,name,col_none, arraysize);
param->type = type;
param->arraysize = arraysize;
param->paramname = NULL;
type = QCC_PR_NewType(name, ev_union, true);
type->params = param;
type->num_parms = 1;
type->size = param->type->size * param->arraysize;
}
else if (dynlength.cast)
{
QCC_PR_ParseWarning(ERR_BADEXTENSION, "unsupported typedefed array (defining %s%s%s[])", col_type,name,col_none);
type = QCC_PointerTypeTo(type);
}
old = QCC_TypeForName(name);
if (old && old->scope == pr_scope)
{
if (typecmp(old, type))
{
char obuf[1024];
char nbuf[1024];
QCC_PR_ParseWarning(ERR_NOTATYPE, "Cannot redeclare typedef %s%s%s from %s%s%s to %s%s%s", col_type,name,col_none, col_type,TypeName(old, obuf, sizeof(obuf)),col_none, col_type,TypeName(type, nbuf, sizeof(nbuf)),col_none);
}
}
else
{
old = type;
type = QCC_PR_NewType(name, ev_typedef, true);
type->aux_type = old;
type->scope = pr_scope;
}
continue;
}
isinitialised = QCC_PR_CheckToken ("=") || ((type->type == ev_function) && (pr_token[0] == '{' || pr_token[0] == '[' || pr_token[0] == ':'));
gd_flags = 0; gd_flags = 0;
if (isstatic) if (isstatic)

View file

@ -251,7 +251,7 @@ void QCC_JoinPaths(char *fullname, size_t fullnamesize, const char *newfile, con
extern char qccmsourcedir[]; extern char qccmsourcedir[];
//also meant to include it. //also meant to include it.
void QCC_FindBestInclude(char *newfile, char *currentfile, pbool verbose) void QCC_FindBestInclude(char *newfile, char *currentfile, pbool includetype)
{ {
struct qccincludeonced_s *onced; struct qccincludeonced_s *onced;
int includepath = 0; int includepath = 0;
@ -289,9 +289,9 @@ void QCC_FindBestInclude(char *newfile, char *currentfile, pbool verbose)
return; return;
} }
if (verbose) if (includetype && verbose >= VERBOSE_PROGRESS)
{ {
if (verbose == 2) if (includetype == 2)
{ {
if (autoprototype) if (autoprototype)
externs->Printf("prototyping %s\n", fullname); externs->Printf("prototyping %s\n", fullname);
@ -4009,7 +4009,6 @@ void QCC_PR_ParsePrintSRef (int type, QCC_sref_t def)
void *errorscope; void *errorscope;
static void QCC_PR_PrintMacro (qcc_includechunk_t *chunk) static void QCC_PR_PrintMacro (qcc_includechunk_t *chunk)
{ {
extern pbool verbose;
if (chunk) if (chunk)
{ {
QCC_PR_PrintMacro(chunk->prev); QCC_PR_PrintMacro(chunk->prev);
@ -4020,7 +4019,7 @@ static void QCC_PR_PrintMacro (qcc_includechunk_t *chunk)
#else #else
externs->Printf ("%s:%i: expanding %s\n", chunk->currentfilename, chunk->currentlinenumber, chunk->cnst->name); externs->Printf ("%s:%i: expanding %s\n", chunk->currentfilename, chunk->currentlinenumber, chunk->cnst->name);
#endif #endif
if (verbose) if (verbose >= VERBOSE_STANDARD)
externs->Printf ("%s\n", chunk->datastart); externs->Printf ("%s\n", chunk->datastart);
} }
else else
@ -4913,19 +4912,9 @@ QCC_type_t *QCC_TypeForName(const char *name)
break; //its okay after all. break; //its okay after all.
t = pHash_GetNext(&typedeftable, name, t); t = pHash_GetNext(&typedeftable, name, t);
} }
if (t && t->type == ev_typedef)
return t->aux_type; //just use its real type.
return t; return t;
/*
int i;
for (i = 0; i < numtypeinfos; i++)
{
if (qcc_typeinfo[i].typedefed && !STRCMP(qcc_typeinfo[i].name, name))
{
return &qcc_typeinfo[i];
}
}
return NULL;*/
} }
/* /*

View file

@ -27,7 +27,9 @@ extern int optres_test1;
extern int optres_test2; extern int optres_test2;
pbool writeasm; pbool writeasm;
pbool verbose; int verbose;
#define VERBOSE_WARNINGSONLY -1
#define VERBOSE_PROGRESS 0
#define VERBOSE_STANDARD 1 #define VERBOSE_STANDARD 1
#define VERBOSE_DEBUG 2 #define VERBOSE_DEBUG 2
#define VERBOSE_DEBUGSTATEMENTS 3 //figuring out the files can be expensive. #define VERBOSE_DEBUGSTATEMENTS 3 //figuring out the files can be expensive.
@ -1625,7 +1627,7 @@ static void QCC_UnmarshalLocals(void)
} }
} }
numpr_globals = biggest; numpr_globals = biggest;
if (verbose) if (verbose >= VERBOSE_STANDARD)
externs->Printf("%i shared locals, %i private, %i total\n", biggest - onum, onum - eog, numpr_globals-eog); externs->Printf("%i shared locals, %i private, %i total\n", biggest - onum, onum - eog, numpr_globals-eog);
} }
static void QCC_GenerateFieldDefs(QCC_def_t *def, char *fieldname, int ofs, QCC_type_t *type) static void QCC_GenerateFieldDefs(QCC_def_t *def, char *fieldname, int ofs, QCC_type_t *type)
@ -1817,7 +1819,7 @@ static pbool QCC_WriteData (int crc)
{ {
if (numpr_globals >= 32768) //not much of a different format. Rewrite output to get it working on original executors? if (numpr_globals >= 32768) //not much of a different format. Rewrite output to get it working on original executors?
externs->Printf("Globals exceeds 32k - an enhanced QCVM will be required\n"); externs->Printf("Globals exceeds 32k - an enhanced QCVM will be required\n");
else if (verbose) else if (verbose >= VERBOSE_STANDARD)
externs->Printf("Progs should run on any QuakeC VM\n"); externs->Printf("Progs should run on any QuakeC VM\n");
break; break;
} }
@ -1866,7 +1868,7 @@ static pbool QCC_WriteData (int crc)
types = false; types = false;
} }
if (verbose) if (verbose >= VERBOSE_STANDARD)
{ {
if (qcc_targetformat == QCF_QSS) if (qcc_targetformat == QCF_QSS)
externs->Printf("QSS or FTE will be required\n"); externs->Printf("QSS or FTE will be required\n");
@ -1881,7 +1883,7 @@ static pbool QCC_WriteData (int crc)
case QCF_UHEXEN2: case QCF_UHEXEN2:
debugtarget = false; debugtarget = false;
outputsttype = PST_UHEXEN2; outputsttype = PST_UHEXEN2;
if (verbose) if (verbose >= VERBOSE_STANDARD)
externs->Printf("uHexen2 will be required\n"); externs->Printf("uHexen2 will be required\n");
if (numpr_globals < 65535) if (numpr_globals < 65535)
externs->Printf("Warning: outputting 32 uHexen2 format when 16bit would suffice\n"); externs->Printf("Warning: outputting 32 uHexen2 format when 16bit would suffice\n");
@ -2117,15 +2119,15 @@ static pbool QCC_WriteData (int crc)
else if (strcmp(def->name, "IMMEDIATE") && qccwarningaction[wt] && !(def->type->type == ev_function && def->symbolheader->timescalled) && !def->symbolheader->used) else if (strcmp(def->name, "IMMEDIATE") && qccwarningaction[wt] && !(def->type->type == ev_function && def->symbolheader->timescalled) && !def->symbolheader->used)
{ {
char typestr[256]; char typestr[256];
if (QC_strcasestr(def->filen, "extensions") && !verbose) if (QC_strcasestr(def->filen, "extensions") && verbose < VERBOSE_STANDARD)
{ //try to avoid annoying warnings from dpextensions.qc { //try to avoid annoying warnings from dpextensions.qc
extwarncount++; extwarncount++;
QCC_PR_Warning(wt, def->filen, def->s_line, NULL); QCC_PR_Warning(wt, def->filen, def->s_line, NULL);
} }
else if (def->arraysize) else if (def->arraysize)
QCC_PR_Warning(wt, def->filen, def->s_line, (dupewarncount++ >= 10 && !verbose)?NULL:"%s %s%s%s[%i] no references.", TypeName(def->type, typestr, sizeof(typestr)), col_symbol, def->name, col_none, def->arraysize); QCC_PR_Warning(wt, def->filen, def->s_line, (dupewarncount++ >= 10 && verbose < VERBOSE_STANDARD)?NULL:"%s %s%s%s[%i] no references.", TypeName(def->type, typestr, sizeof(typestr)), col_symbol, def->name, col_none, def->arraysize);
else else
QCC_PR_Warning(wt, def->filen, def->s_line, (dupewarncount++ >= 10 && !verbose)?NULL:"%s %s%s%s no references.", TypeName(def->type, typestr, sizeof(typestr)), col_symbol, def->name, col_none); QCC_PR_Warning(wt, def->filen, def->s_line, (dupewarncount++ >= 10 && verbose < VERBOSE_STANDARD)?NULL:"%s %s%s%s no references.", TypeName(def->type, typestr, sizeof(typestr)), col_symbol, def->name, col_none);
} }
pr_scope = NULL; pr_scope = NULL;
@ -2260,7 +2262,7 @@ static pbool QCC_WriteData (int crc)
} }
QCC_SortFields(); QCC_SortFields();
if (dupewarncount > 10 && !verbose) if (dupewarncount > 10 && verbose < VERBOSE_STANDARD)
QCC_PR_Note(WARN_NOTREFERENCED, NULL, 0, "suppressed %i more warnings about unreferenced variables, as you clearly don't care about the first 10.", dupewarncount-10); QCC_PR_Note(WARN_NOTREFERENCED, NULL, 0, "suppressed %i more warnings about unreferenced variables, as you clearly don't care about the first 10.", dupewarncount-10);
if (extwarncount) if (extwarncount)
QCC_PR_Note(WARN_NOTREFERENCED, NULL, 0, "suppressed %i warnings about unused extensions.", extwarncount); QCC_PR_Note(WARN_NOTREFERENCED, NULL, 0, "suppressed %i warnings about unused extensions.", extwarncount);
@ -2320,20 +2322,20 @@ static pbool QCC_WriteData (int crc)
for (i = 0; i < nummodels; i++) for (i = 0; i < nummodels; i++)
{ {
if (!precache_model[i].used) if (!precache_model[i].used)
dupewarncount+=QCC_PR_Warning(WARN_EXTRAPRECACHE, precache_model[i].filename, precache_model[i].fileline, (dupewarncount>10&&!verbose)?NULL:"Model \"%s\" was precached but not directly used%s", precache_model[i].name, dupewarncount?"":" (annotate the usage with the used_model intrinsic to silence this warning)"); dupewarncount+=QCC_PR_Warning(WARN_EXTRAPRECACHE, precache_model[i].filename, precache_model[i].fileline, (dupewarncount>10&&verbose < VERBOSE_STANDARD)?NULL:"Model \"%s\" was precached but not directly used%s", precache_model[i].name, dupewarncount?"":" (annotate the usage with the used_model intrinsic to silence this warning)");
else if (!precache_model[i].block) else if (!precache_model[i].block)
dupewarncount+=QCC_PR_Warning(WARN_NOTPRECACHED, precache_model[i].filename, precache_model[i].fileline, (dupewarncount>10&&!verbose)?NULL:"Model \"%s\" was used but not directly precached", precache_model[i].name); dupewarncount+=QCC_PR_Warning(WARN_NOTPRECACHED, precache_model[i].filename, precache_model[i].fileline, (dupewarncount>10&&verbose < VERBOSE_STANDARD)?NULL:"Model \"%s\" was used but not directly precached", precache_model[i].name);
} }
for (i = 0; i < numsounds; i++) for (i = 0; i < numsounds; i++)
{ {
if (!precache_sound[i].used) if (!precache_sound[i].used)
dupewarncount+=QCC_PR_Warning(WARN_EXTRAPRECACHE, precache_sound[i].filename, precache_sound[i].fileline, (dupewarncount>10&&!verbose)?NULL:"Sound \"%s\" was precached but not directly used", precache_sound[i].name, dupewarncount?"":" (annotate the usage with the used_sound intrinsic to silence this warning)"); dupewarncount+=QCC_PR_Warning(WARN_EXTRAPRECACHE, precache_sound[i].filename, precache_sound[i].fileline, (dupewarncount>10&&verbose < VERBOSE_STANDARD)?NULL:"Sound \"%s\" was precached but not directly used", precache_sound[i].name, dupewarncount?"":" (annotate the usage with the used_sound intrinsic to silence this warning)");
else if (!precache_sound[i].block) else if (!precache_sound[i].block)
dupewarncount+=QCC_PR_Warning(WARN_NOTPRECACHED, precache_sound[i].filename, precache_sound[i].fileline, (dupewarncount>10&&!verbose)?NULL:"Sound \"%s\" was used but not directly precached", precache_sound[i].name); dupewarncount+=QCC_PR_Warning(WARN_NOTPRECACHED, precache_sound[i].filename, precache_sound[i].fileline, (dupewarncount>10&&verbose < VERBOSE_STANDARD)?NULL:"Sound \"%s\" was used but not directly precached", precache_sound[i].name);
} }
if (dupewarncount > 10 && !verbose) if (dupewarncount > 10 && verbose < VERBOSE_STANDARD)
QCC_PR_Note(WARN_NOTREFERENCED, NULL, 0, "suppressed %i more %swarnings%s about precaches.", dupewarncount-10, col_warning, col_none); QCC_PR_Note(WARN_NOTREFERENCED, NULL, 0, "suppressed %i more %swarnings%s about precaches.", dupewarncount-10, col_warning, col_none);
//PrintStrings (); //PrintStrings ();
@ -2342,7 +2344,7 @@ static pbool QCC_WriteData (int crc)
//PrintGlobals (); //PrintGlobals ();
strofs = (strofs+3)&~3; strofs = (strofs+3)&~3;
if (verbose) if (verbose >= VERBOSE_STANDARD)
{ {
externs->Printf ("%6i strofs (of %i)\n", strofs, MAX_STRINGS); externs->Printf ("%6i strofs (of %i)\n", strofs, MAX_STRINGS);
externs->Printf ("%6i numstatements (of %i)\n", numstatements, MAX_STATEMENTS); externs->Printf ("%6i numstatements (of %i)\n", numstatements, MAX_STATEMENTS);
@ -2356,7 +2358,7 @@ strofs = (strofs+3)&~3;
if (!*destfile) if (!*destfile)
strcpy(destfile, "progs.dat"); strcpy(destfile, "progs.dat");
if (verbose) if (verbose >= VERBOSE_PROGRESS)
externs->Printf("Writing %s\n", destfile); externs->Printf("Writing %s\n", destfile);
h = SafeOpenWrite (destfile, 2*1024*1024); h = SafeOpenWrite (destfile, 2*1024*1024);
SafeWrite (h, &progs, sizeof(progs)); SafeWrite (h, &progs, sizeof(progs));
@ -2867,7 +2869,7 @@ strofs = (strofs+3)&~3;
externs->Printf ("WARNING: progs format cannot handle extern functions\n"); externs->Printf ("WARNING: progs format cannot handle extern functions\n");
if (verbose) if (verbose >= VERBOSE_STANDARD)
externs->Printf ("%6i TOTAL SIZE\n", (int)SafeSeek (h, 0, SEEK_CUR)); externs->Printf ("%6i TOTAL SIZE\n", (int)SafeSeek (h, 0, SEEK_CUR));
progs.entityfields = pr.size_fields; progs.entityfields = pr.size_fields;
@ -2896,7 +2898,7 @@ strofs = (strofs+3)&~3;
i = PRLittleLong(qcc_pr_globals[def->ofs]._int); i = PRLittleLong(qcc_pr_globals[def->ofs]._int);
else else
{ //entsize(=96)+hunk header size(=32) { //entsize(=96)+hunk header size(=32)
if (verbose) if (verbose >= VERBOSE_STANDARD)
externs->Printf("qccx hack - 'entity progs' uninitialised. Assuming 112.\n"); externs->Printf("qccx hack - 'entity progs' uninitialised. Assuming 112.\n");
i = 112; //match qccx. i = 112; //match qccx.
} }
@ -2924,7 +2926,7 @@ strofs = (strofs+3)&~3;
if (verbose >= VERBOSE_PROGRESS)
switch(qcc_targetformat) switch(qcc_targetformat)
{ {
case QCF_QTEST: case QCF_QTEST:
@ -2988,7 +2990,7 @@ strofs = (strofs+3)&~3;
strcat(destfile, ".lno"); strcat(destfile, ".lno");
if (gz) if (gz)
strcat(destfile, ".gz"); strcat(destfile, ".gz");
if (verbose) if (verbose >= VERBOSE_STANDARD)
externs->Printf("Writing %s for debugging\n", destfile); externs->Printf("Writing %s for debugging\n", destfile);
h = SafeOpenWrite (destfile, 2*1024*1024); h = SafeOpenWrite (destfile, 2*1024*1024);
SafeWrite (h, &lnotype, sizeof(int)); SafeWrite (h, &lnotype, sizeof(int));
@ -3881,53 +3883,53 @@ static void QCC_PR_CRCMessages(unsigned short crc)
case 12923: //#pragma sourcefile usage case 12923: //#pragma sourcefile usage
break; break;
case 54730: case 54730:
if (verbose) if (verbose >= VERBOSE_STANDARD)
externs->Printf("Recognised progs as QuakeWorld\n"); externs->Printf("Recognised progs as QuakeWorld\n");
break; break;
case 5927: case 5927:
if (verbose) if (verbose >= VERBOSE_STANDARD)
externs->Printf("Recognised progs as NetQuake server gamecode\n"); externs->Printf("Recognised progs as NetQuake server gamecode\n");
break; break;
case 26940: case 26940:
if (verbose) if (verbose >= VERBOSE_STANDARD)
externs->Printf("Recognised progs as Quake pre-release...\n"); externs->Printf("Recognised progs as Quake pre-release...\n");
break; break;
case 38488: case 38488:
if (verbose) if (verbose >= VERBOSE_STANDARD)
externs->Printf("Recognised progs as original Hexen2\n"); externs->Printf("Recognised progs as original Hexen2\n");
break; break;
case 26905: case 26905:
if (verbose) if (verbose >= VERBOSE_STANDARD)
externs->Printf("Recognised progs as Hexen2 Mission Pack\n"); externs->Printf("Recognised progs as Hexen2 Mission Pack\n");
break; break;
case 14046: case 14046:
if (verbose) if (verbose >= VERBOSE_STANDARD)
externs->Printf("Recognised progs as Hexen2 (demo)\n"); externs->Printf("Recognised progs as Hexen2 (demo)\n");
break; break;
case 22390: //EXT_CSQC_1 case 22390: //EXT_CSQC_1
if (verbose) if (verbose >= VERBOSE_STANDARD)
externs->Printf("Recognised progs as an EXT_CSQC_1 module\n"); externs->Printf("Recognised progs as an EXT_CSQC_1 module\n");
break; break;
case 17105: case 17105:
case 32199: //outdated ext_csqc case 32199: //outdated ext_csqc
QCC_PR_Warning(WARN_SYSTEMCRC2, NULL, 0, "Recognised progs as outdated CSQC module\n"); QCC_PR_Warning(WARN_SYSTEMCRC2, NULL, 0, "Recognised progs as outdated CSQC module");
break; break;
case 52195: //this is what DP requires. don't print it as the warning that it is as that would royally piss off xonotic and their use of -Werror. case 52195: //this is what DP requires. don't print it as the warning that it is as that would royally piss off xonotic and their use of -Werror.
externs->Printf("Recognised progs as DP-specific CSQC module\n"); externs->Printf("Recognised progs as DP-specific CSQC module\n");
break; break;
case 10020: case 10020:
if (verbose) if (verbose >= VERBOSE_STANDARD)
externs->Printf("Recognised progs as a MenuQC module\n"); externs->Printf("Recognised progs as a MenuQC module\n");
break; break;
case 32401: case 32401:
QCC_PR_Warning(WARN_SYSTEMCRC, NULL, 0, "please update your tenebrae system defs.\n"); QCC_PR_Warning(WARN_SYSTEMCRC, NULL, 0, "please update your tenebrae system defs.");
break; break;
default: default:
QCC_PR_Warning(WARN_SYSTEMCRC, NULL, 0, "system defs not recognised from quake nor clones, probably buggy (sys)defs.qc\n"); QCC_PR_Warning(WARN_SYSTEMCRC, NULL, 0, "system defs not recognised from quake nor clones, probably buggy (sys)defs.qc");
break; break;
} }
} }
@ -4497,11 +4499,15 @@ static void QCC_PR_CommandLinePrecompilerOptions (void)
{ //explicit output file { //explicit output file
i++; i++;
strcpy(destfile, myargv[i]); strcpy(destfile, myargv[i]);
if (!destfile_explicit)
verbose--;
destfile_explicit = true; destfile_explicit = true;
} }
else if ( !strncmp(myargv[i], "-o", 2) ) else if ( !strncmp(myargv[i], "-o", 2) )
{ //explicit output file { //explicit output file
strcpy(destfile, myargv[i]+2); strcpy(destfile, myargv[i]+2);
if (!destfile_explicit)
verbose--;
destfile_explicit = true; destfile_explicit = true;
} }
else if ( !strcmp(myargv[i], "-qc") ) else if ( !strcmp(myargv[i], "-qc") )
@ -4996,7 +5002,7 @@ static void QCC_SetDefaultProperties (void)
qcc_framerate = 0; //depends on target (engine's OP_STATE) qcc_framerate = 0; //depends on target (engine's OP_STATE)
ForcedCRC = 0; ForcedCRC = 0;
defaultstatic = 0; defaultstatic = 0;
verbose = 0; verbose = VERBOSE_PROGRESS;
*qccmsourcedir = 0; *qccmsourcedir = 0;
QCC_PR_CloseProcessor(); QCC_PR_CloseProcessor();
@ -5871,7 +5877,7 @@ void QCC_FinishCompile(void)
if (donesomething) if (donesomething)
{ {
if (verbose) if (verbose >= VERBOSE_STANDARD)
{ {
externs->Printf ("Compile Complete\n\n"); externs->Printf ("Compile Complete\n\n");
@ -5926,7 +5932,7 @@ void QCC_FinishCompile(void)
externs->Printf("numtemps %u\n", (unsigned)tempsused); externs->Printf("numtemps %u\n", (unsigned)tempsused);
} }
if (!flag_msvcstyle) if (!flag_msvcstyle && verbose >= VERBOSE_PROGRESS)
externs->Printf("Done. %i warnings\n", pr_warning_count); externs->Printf("Done. %i warnings\n", pr_warning_count);
} }

View file

@ -107,7 +107,7 @@ static int logprintf(const char *format, ...)
#endif #endif
va_end (argptr); va_end (argptr);
printf("%s", string); fprintf(stderr, "%s", string);
// fputs(string, stderr); // fputs(string, stderr);
if (logfile) if (logfile)
fputs(string, logfile); fputs(string, logfile);

View file

@ -482,13 +482,13 @@ void(float width, float height, float do2d) CSQC_UpdateView =
void() CSQC_Input_Frame = void() CSQC_Input_Frame =
{ {
vector t, o;
if (autocvar_ca_show) //when we're using the UI, don't send any attack or jump stuff. these are generally annoying modifiers or so if (autocvar_ca_show) //when we're using the UI, don't send any attack or jump stuff. these are generally annoying modifiers or so
input_buttons = 0; input_buttons = 0;
#ifdef WALLBROWSERS #ifdef WALLBROWSERS
if ((input_buttons & 1) && pointedshadername == "") if ((input_buttons & 1) && pointedshadername == "")
{ {
vector t, o;
t = mousefar; t = mousefar;
o = mousenear; o = mousenear;
if (vlen(o - t) > 8192) if (vlen(o - t) > 8192)

View file

@ -1,4 +1,4 @@
../csaddon.dat #output "../csaddon.dat"
//pr_dumpplatform -FFTE -Fdefines -TCS -O csplat //pr_dumpplatform -FFTE -Fdefines -TCS -O csplat
//#pragma flag enable assumeint //#pragma flag enable assumeint
@ -9,6 +9,8 @@
#pragma target FTE #pragma target FTE
//#pragma optimise 2 //#pragma optimise 2
//#pragma optimise no-filename //#pragma optimise no-filename
#includelist
csplat.qc csplat.qc
csfixups.qc csfixups.qc
@ -26,4 +28,4 @@ editor_particles.qc
menu.qc menu.qc
cam.qc cam.qc
csaddon.qc csaddon.qc
#endlist

View file

@ -271,8 +271,8 @@ void(entedit_t *nent) editor_ents_updated =
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
{ {
nent->bboxverts[i].st = (vec2){{0,0}}; nent->bboxverts[i].st = (vec2){0,0};
nent->bboxverts[i].rgba = (vec4){{nent->colourmod[0], nent->colourmod[1], nent->colourmod[2], nent->alpha?nent->alpha:1}}; nent->bboxverts[i].rgba = (vec4){nent->colourmod[0], nent->colourmod[1], nent->colourmod[2], nent->alpha?nent->alpha:1};
nent->bboxverts[i].xyz[0] = nent->org[0] + ((i&1i)?nent->maxs[0]:nent->mins[0]); nent->bboxverts[i].xyz[0] = nent->org[0] + ((i&1i)?nent->maxs[0]:nent->mins[0]);
nent->bboxverts[i].xyz[1] = nent->org[1] + (((i&2i)?nent->maxs[1]:nent->mins[1])); nent->bboxverts[i].xyz[1] = nent->org[1] + (((i&2i)?nent->maxs[1]:nent->mins[1]));
nent->bboxverts[i].xyz[2] = nent->org[2] + ((i&4)?nent->maxs[2]:nent->mins[2]); nent->bboxverts[i].xyz[2] = nent->org[2] + ((i&4)?nent->maxs[2]:nent->mins[2]);

View file

@ -36,8 +36,10 @@ static vector(vector v) vtodpp =
//so fucking disgustingly ugly. //so fucking disgustingly ugly.
if (dp_workarounds) if (dp_workarounds)
{ {
#pragma warning disable F333
v_x *= cvar("vid_width") / cvar("vid_conwidth"); v_x *= cvar("vid_width") / cvar("vid_conwidth");
v_y *= cvar("vid_height") / cvar("vid_conheight"); v_y *= cvar("vid_height") / cvar("vid_conheight");
#pragma warning enable F333
} }
#endif #endif
return v; return v;

View file

@ -149,6 +149,7 @@ var uiinfo_t ui =
void() queryscreensize = void() queryscreensize =
{ {
#pragma warning disable F333
#ifdef MENU #ifdef MENU
//there is no proper way to do this. //there is no proper way to do this.
//fte thus has special checks for these cvars, and they should not be autocvars if you want them to work properly. //fte thus has special checks for these cvars, and they should not be autocvars if you want them to work properly.
@ -169,6 +170,7 @@ void() queryscreensize =
} }
#endif #endif
#endif #endif
#pragma warning enable F333
}; };
//helper function //helper function