diff --git a/CMakeLists.txt b/CMakeLists.txt index 2b4ba611..bc156c1c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1534,7 +1534,9 @@ SET(FTE_MENU_SYS true CACHE BOOL "Compile System Menu.") IF(FTE_MENU_SYS) ADD_CUSTOM_TARGET(menusys ALL 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" SOURCES quakec/menusys/menu.src @@ -1572,3 +1574,34 @@ IF(FTE_MENU_SYS) quakec/menusys/menu/quit.qc ) 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() diff --git a/engine/qclib/progslib.h b/engine/qclib/progslib.h index 885dbc0d..5863d297 100644 --- a/engine/qclib/progslib.h +++ b/engine/qclib/progslib.h @@ -94,7 +94,8 @@ ev_struct, //big complex type 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_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; enum { DEBUG_TRACE_OFF, //debugging should be off. diff --git a/engine/qclib/qcc.h b/engine/qclib/qcc.h index 22875657..ad631ff9 100644 --- a/engine/qclib/qcc.h +++ b/engine/qclib/qcc.h @@ -595,6 +595,13 @@ extern int pr_token_line_last; extern QCC_type_t *pr_immediate_type; 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_break; 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_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); void QCC_PR_ParseInitializerDef(QCC_def_t *def, unsigned int flags); void QCC_PR_FinaliseFunctions(void); diff --git a/engine/qclib/qcc_cmdlib.c b/engine/qclib/qcc_cmdlib.c index 54b1de0e..7a2317f2 100644 --- a/engine/qclib/qcc_cmdlib.c +++ b/engine/qclib/qcc_cmdlib.c @@ -37,6 +37,7 @@ const unsigned int type_size[] = {1, //void 0, //ev_union. variable sized. 0, //ev_accessor... 0, //ev_enum... + 0, //ev_typedef 1, //ev_bool... }; diff --git a/engine/qclib/qcc_pr_comp.c b/engine/qclib/qcc_pr_comp.c index 30c1ddd8..f82805d1 100644 --- a/engine/qclib/qcc_pr_comp.c +++ b/engine/qclib/qcc_pr_comp.c @@ -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_sref_t idx; QCC_sref_t tmp; - pbool allowarray; + pbool allowarray, arraytype; unsigned int arraysize; unsigned int rewindpoint = numstatements; 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) { allowarray = false; + arraytype = (t->type == ev_union && t->num_parms == 1 && !t->params[0].paramname); //FIXME + if (arraytype) + arraytype = true; if (idx.cast) allowarray = arraysize>0 || (t->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) { 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_vector) || //vectors are mini arrays (t->type == ev_field && t->aux_type->type == ev_vector) || //as are field vectors + (arraytype && !arraysize) || (!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 (!idx.cast && t->type == ev_pointer && !arraysize) 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; t = t->params[0].type; @@ -9221,6 +9225,17 @@ fieldarrayindex: QCC_FreeTemp(idx); 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(".")) { char *swizzle = QCC_PR_ParseName(); @@ -13619,16 +13634,11 @@ void QCC_PR_ParseStatement (void) QCC_PR_ParseDefs (NULL, true); return; } - if (QCC_PR_CheckKeyword(keyword_typedef, "typedef")) - { - QCC_PR_ParseTypedef(); - return; - } if (pr_token_type == tt_name) { QCC_type_t *type = QCC_TypeForName(pr_token); - if (type && type->typedefed) + if (type) { if (strncmp(pr_file_p, "::", 2)) { @@ -13654,6 +13664,7 @@ void QCC_PR_ParseStatement (void) ( !STRCMP ("_Bool", pr_token)) || (keyword_static && !STRCMP ("static", pr_token)) || (keyword_class && !STRCMP ("class", pr_token)) || + (keyword_typedef && !STRCMP ("typedef", pr_token)) || (keyword_const && !STRCMP ("const", pr_token))) { 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; case ev_void: 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; case ev_void: break; + case ev_typedef: //invalid + QCC_PR_ParseWarning(ERR_INTERNAL, "unexpected typedef"); + break; } if (*fieldofs > maxfield) maxfield = *fieldofs; @@ -17313,7 +17330,6 @@ QCC_sref_t QCC_PR_ParseInitializerType_Internal(int arraysize, QCC_def_t *basede } else { - pbool isblock; QCC_type_t *type = def.cast; 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_Expect(")"); } - else if ((isblock=(type->type == ev_struct || type->type == ev_union) && QCC_PR_CheckToken("{")) - || (type->type == ev_union && type->num_parms == 1 && !type->params->paramname)) + else if (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 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); if (isunion || !QCC_PR_CheckToken(",")) { - if (!isblock) - break; QCC_PR_Expect("}"); break; } @@ -17962,81 +17982,6 @@ QCC_type_t *QCC_PR_ParseEnum(pbool flags) 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 @@ -18054,6 +17999,7 @@ void QCC_PR_ParseDefs (char *classname, pbool fatal_unused) pbool shared=false; pbool isstatic=defaultstatic; pbool externfnc=false; + pbool istypedef=false; pbool isconstant = false; pbool isvar = false; pbool isinitialised = false; @@ -18078,12 +18024,6 @@ void QCC_PR_ParseDefs (char *classname, pbool fatal_unused) while (QCC_PR_CheckToken(";")) ; - if (QCC_PR_CheckKeyword (keyword_typedef, "typedef")) - { - QCC_PR_ParseTypedef(); - return; - } - if (flag_acc) { char *oldp; @@ -18242,7 +18182,9 @@ void QCC_PR_ParseDefs (char *classname, pbool fatal_unused) 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; else if (QCC_PR_CheckKeyword(keyword_shared, "shared")) { @@ -18380,7 +18322,10 @@ void QCC_PR_ParseDefs (char *classname, pbool fatal_unused) type = QCC_PR_ParseFunctionTypeReacc(false, basetype); QCC_PR_Expect(";"); - def = QCC_PR_GetDef (basetype, name, NULL, true, 0, false); + if (istypedef) + return; + else + def = QCC_PR_GetDef (basetype, name, NULL, true, 0, false); if (autoprototype || dostrip) { //ignore the code and stuff @@ -18448,6 +18393,11 @@ void QCC_PR_ParseDefs (char *classname, pbool fatal_unused) 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)) { QCC_PR_ExpandUnionToFields(type, &pr.size_fields); @@ -18473,7 +18423,7 @@ void QCC_PR_ParseDefs (char *classname, pbool fatal_unused) name = QCC_PR_ParseName (); } - if (QCC_PR_CheckToken("::") && !classname) + if (!istypedef && QCC_PR_CheckToken("::") && !classname) { classname = name; name = QCC_PR_ParseName(); @@ -18491,7 +18441,7 @@ void QCC_PR_ParseDefs (char *classname, pbool fatal_unused) if (QCC_PR_CheckToken("]")) { //FIXME: preprocessor will hate this with a passion. - if (QCC_PR_CheckToken("=")) + if (!istypedef && QCC_PR_CheckToken("=")) { QCC_PR_Expect("{"); arraysize++; @@ -18592,8 +18542,54 @@ void QCC_PR_ParseDefs (char *classname, pbool fatal_unused) else 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; if (isstatic) diff --git a/engine/qclib/qcc_pr_lex.c b/engine/qclib/qcc_pr_lex.c index 19454c98..64369a90 100644 --- a/engine/qclib/qcc_pr_lex.c +++ b/engine/qclib/qcc_pr_lex.c @@ -251,7 +251,7 @@ void QCC_JoinPaths(char *fullname, size_t fullnamesize, const char *newfile, con extern char qccmsourcedir[]; //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; int includepath = 0; @@ -289,9 +289,9 @@ void QCC_FindBestInclude(char *newfile, char *currentfile, pbool verbose) return; } - if (verbose) + if (includetype && verbose >= VERBOSE_PROGRESS) { - if (verbose == 2) + if (includetype == 2) { if (autoprototype) externs->Printf("prototyping %s\n", fullname); @@ -4009,7 +4009,6 @@ void QCC_PR_ParsePrintSRef (int type, QCC_sref_t def) void *errorscope; static void QCC_PR_PrintMacro (qcc_includechunk_t *chunk) { - extern pbool verbose; if (chunk) { QCC_PR_PrintMacro(chunk->prev); @@ -4020,7 +4019,7 @@ static void QCC_PR_PrintMacro (qcc_includechunk_t *chunk) #else externs->Printf ("%s:%i: expanding %s\n", chunk->currentfilename, chunk->currentlinenumber, chunk->cnst->name); #endif - if (verbose) + if (verbose >= VERBOSE_STANDARD) externs->Printf ("%s\n", chunk->datastart); } else @@ -4913,19 +4912,9 @@ QCC_type_t *QCC_TypeForName(const char *name) break; //its okay after all. t = pHash_GetNext(&typedeftable, name, t); } + if (t && t->type == ev_typedef) + return t->aux_type; //just use its real type. 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;*/ } /* diff --git a/engine/qclib/qccmain.c b/engine/qclib/qccmain.c index 0c8406cf..24235323 100644 --- a/engine/qclib/qccmain.c +++ b/engine/qclib/qccmain.c @@ -27,7 +27,9 @@ extern int optres_test1; extern int optres_test2; pbool writeasm; -pbool verbose; +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. @@ -1625,7 +1627,7 @@ static void QCC_UnmarshalLocals(void) } } 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); } 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? 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"); break; } @@ -1866,7 +1868,7 @@ static pbool QCC_WriteData (int crc) types = false; } - if (verbose) + if (verbose >= VERBOSE_STANDARD) { if (qcc_targetformat == QCF_QSS) externs->Printf("QSS or FTE will be required\n"); @@ -1881,7 +1883,7 @@ static pbool QCC_WriteData (int crc) case QCF_UHEXEN2: debugtarget = false; outputsttype = PST_UHEXEN2; - if (verbose) + if (verbose >= VERBOSE_STANDARD) externs->Printf("uHexen2 will be required\n"); if (numpr_globals < 65535) 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) { 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 extwarncount++; QCC_PR_Warning(wt, def->filen, def->s_line, NULL); } 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 - 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; @@ -2260,7 +2262,7 @@ static pbool QCC_WriteData (int crc) } 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); if (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++) { 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) - 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++) { 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) - 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); //PrintStrings (); @@ -2342,7 +2344,7 @@ static pbool QCC_WriteData (int crc) //PrintGlobals (); strofs = (strofs+3)&~3; - if (verbose) + if (verbose >= VERBOSE_STANDARD) { externs->Printf ("%6i strofs (of %i)\n", strofs, MAX_STRINGS); externs->Printf ("%6i numstatements (of %i)\n", numstatements, MAX_STATEMENTS); @@ -2356,7 +2358,7 @@ strofs = (strofs+3)&~3; if (!*destfile) strcpy(destfile, "progs.dat"); - if (verbose) + if (verbose >= VERBOSE_PROGRESS) externs->Printf("Writing %s\n", destfile); h = SafeOpenWrite (destfile, 2*1024*1024); SafeWrite (h, &progs, sizeof(progs)); @@ -2867,7 +2869,7 @@ strofs = (strofs+3)&~3; 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)); progs.entityfields = pr.size_fields; @@ -2896,7 +2898,7 @@ strofs = (strofs+3)&~3; i = PRLittleLong(qcc_pr_globals[def->ofs]._int); else { //entsize(=96)+hunk header size(=32) - if (verbose) + if (verbose >= VERBOSE_STANDARD) externs->Printf("qccx hack - 'entity progs' uninitialised. Assuming 112.\n"); i = 112; //match qccx. } @@ -2924,7 +2926,7 @@ strofs = (strofs+3)&~3; - + if (verbose >= VERBOSE_PROGRESS) switch(qcc_targetformat) { case QCF_QTEST: @@ -2988,7 +2990,7 @@ strofs = (strofs+3)&~3; strcat(destfile, ".lno"); if (gz) strcat(destfile, ".gz"); - if (verbose) + if (verbose >= VERBOSE_STANDARD) externs->Printf("Writing %s for debugging\n", destfile); h = SafeOpenWrite (destfile, 2*1024*1024); SafeWrite (h, &lnotype, sizeof(int)); @@ -3881,53 +3883,53 @@ static void QCC_PR_CRCMessages(unsigned short crc) case 12923: //#pragma sourcefile usage break; case 54730: - if (verbose) + if (verbose >= VERBOSE_STANDARD) externs->Printf("Recognised progs as QuakeWorld\n"); break; case 5927: - if (verbose) + if (verbose >= VERBOSE_STANDARD) externs->Printf("Recognised progs as NetQuake server gamecode\n"); break; case 26940: - if (verbose) + if (verbose >= VERBOSE_STANDARD) externs->Printf("Recognised progs as Quake pre-release...\n"); break; case 38488: - if (verbose) + if (verbose >= VERBOSE_STANDARD) externs->Printf("Recognised progs as original Hexen2\n"); break; case 26905: - if (verbose) + if (verbose >= VERBOSE_STANDARD) externs->Printf("Recognised progs as Hexen2 Mission Pack\n"); break; case 14046: - if (verbose) + if (verbose >= VERBOSE_STANDARD) externs->Printf("Recognised progs as Hexen2 (demo)\n"); break; case 22390: //EXT_CSQC_1 - if (verbose) + if (verbose >= VERBOSE_STANDARD) externs->Printf("Recognised progs as an EXT_CSQC_1 module\n"); break; case 17105: 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; 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"); break; case 10020: - if (verbose) + if (verbose >= VERBOSE_STANDARD) externs->Printf("Recognised progs as a MenuQC module\n"); break; 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; 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; } } @@ -4497,11 +4499,15 @@ static void QCC_PR_CommandLinePrecompilerOptions (void) { //explicit output file i++; strcpy(destfile, myargv[i]); + if (!destfile_explicit) + verbose--; destfile_explicit = true; } else if ( !strncmp(myargv[i], "-o", 2) ) { //explicit output file strcpy(destfile, myargv[i]+2); + if (!destfile_explicit) + verbose--; destfile_explicit = true; } 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) ForcedCRC = 0; defaultstatic = 0; - verbose = 0; + verbose = VERBOSE_PROGRESS; *qccmsourcedir = 0; QCC_PR_CloseProcessor(); @@ -5871,7 +5877,7 @@ void QCC_FinishCompile(void) if (donesomething) { - if (verbose) + if (verbose >= VERBOSE_STANDARD) { externs->Printf ("Compile Complete\n\n"); @@ -5926,7 +5932,7 @@ void QCC_FinishCompile(void) 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); } diff --git a/engine/qclib/qcctui.c b/engine/qclib/qcctui.c index bcd79edd..c7879557 100644 --- a/engine/qclib/qcctui.c +++ b/engine/qclib/qcctui.c @@ -107,7 +107,7 @@ static int logprintf(const char *format, ...) #endif va_end (argptr); - printf("%s", string); + fprintf(stderr, "%s", string); // fputs(string, stderr); if (logfile) fputs(string, logfile); diff --git a/quakec/csaddon/src/csaddon.qc b/quakec/csaddon/src/csaddon.qc index bbda49c6..e4437f8a 100644 --- a/quakec/csaddon/src/csaddon.qc +++ b/quakec/csaddon/src/csaddon.qc @@ -482,13 +482,13 @@ void(float width, float height, float do2d) CSQC_UpdateView = 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 input_buttons = 0; #ifdef WALLBROWSERS if ((input_buttons & 1) && pointedshadername == "") { + vector t, o; t = mousefar; o = mousenear; if (vlen(o - t) > 8192) diff --git a/quakec/csaddon/src/csaddon.src b/quakec/csaddon/src/csaddon.src index 0ab02d88..78fd40e2 100644 --- a/quakec/csaddon/src/csaddon.src +++ b/quakec/csaddon/src/csaddon.src @@ -1,4 +1,4 @@ -../csaddon.dat +#output "../csaddon.dat" //pr_dumpplatform -FFTE -Fdefines -TCS -O csplat //#pragma flag enable assumeint @@ -9,6 +9,8 @@ #pragma target FTE //#pragma optimise 2 //#pragma optimise no-filename + +#includelist csplat.qc csfixups.qc @@ -26,4 +28,4 @@ editor_particles.qc menu.qc cam.qc csaddon.qc - +#endlist \ No newline at end of file diff --git a/quakec/csaddon/src/editor_ents.qc b/quakec/csaddon/src/editor_ents.qc index 745d1aa3..b103672c 100644 --- a/quakec/csaddon/src/editor_ents.qc +++ b/quakec/csaddon/src/editor_ents.qc @@ -271,8 +271,8 @@ void(entedit_t *nent) editor_ents_updated = for (i = 0; i < 8; i++) { - 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].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].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[2] = nent->org[2] + ((i&4)?nent->maxs[2]:nent->mins[2]); diff --git a/quakec/menusys/menusys/mitem_spinnymodel.qc b/quakec/menusys/menusys/mitem_spinnymodel.qc index f485db8d..70878463 100644 --- a/quakec/menusys/menusys/mitem_spinnymodel.qc +++ b/quakec/menusys/menusys/mitem_spinnymodel.qc @@ -36,8 +36,10 @@ static vector(vector v) vtodpp = //so fucking disgustingly ugly. if (dp_workarounds) { +#pragma warning disable F333 v_x *= cvar("vid_width") / cvar("vid_conwidth"); v_y *= cvar("vid_height") / cvar("vid_conheight"); +#pragma warning enable F333 } #endif return v; diff --git a/quakec/menusys/menusys/mitems.qc b/quakec/menusys/menusys/mitems.qc index 93f68af4..f6340f7d 100644 --- a/quakec/menusys/menusys/mitems.qc +++ b/quakec/menusys/menusys/mitems.qc @@ -149,6 +149,7 @@ var uiinfo_t ui = void() queryscreensize = { +#pragma warning disable F333 #ifdef MENU //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. @@ -169,6 +170,7 @@ void() queryscreensize = } #endif #endif +#pragma warning enable F333 }; //helper function