diff --git a/source/games/duke/src/gamedef.cpp b/source/games/duke/src/gamedef.cpp index 584858dc0..89c32256d 100644 --- a/source/games/duke/src/gamedef.cpp +++ b/source/games/duke/src/gamedef.cpp @@ -47,6 +47,9 @@ int line_number; int labelcnt; int errorcount, warningcount; // was named 'error' and 'warning' which is too generic for public variables and may clash with other code. int g_currentSourceFile; +intptr_t parsing_actor; +int parsing_state; + //G_EXTERN char tempbuf[MAXSECTORS << 1], buf[1024]; todo - move to compile state. tempbuf gets used nearly everywhere as scratchpad memory. extern char tempbuf[]; extern intptr_t* scriptptr; @@ -196,6 +199,17 @@ int getkeyword(const char* text) // //--------------------------------------------------------------------------- +int findlabel(const char* text) +{ + for (int j = 0; j < labelcnt; j++) + { + if (strcmp(label + (j << 6), text) == 0) + { + return labelcode[j]; + } + } + return -1; +} //--------------------------------------------------------------------------- // @@ -421,7 +435,18 @@ void transnum(void) return; } - *scriptptr = atol(textptr); + // Now it's getting nasty... With all of C's integer conversion functions we have to look for undefined behavior and truncation problems. This one's the least problematic approach + // that ignores octal conversion. + int64_t value; + char *outp; + bool ishex = (textptr[0] == 0 && tolower(textptr[1]) == 'x') || (textptr[0] == '-' && textptr[1] == 0 && tolower(textptr[2]) == 'x'); + if (*textptr == '-') value = strtoll(textptr, &outp, ishex? 16 : 10); + else value = strtoull(textptr, &outp, ishex ? 16 : 10); + if (*outp != 0) + { + // conversion was not successful. + } + *scriptptr = int(value); // truncate the parsed value to 32 bit. scriptptr++; textptr += l; } @@ -447,6 +472,7 @@ int parsecommand(int tw) // for now just run an externally parsed command. uint8_t done, temp_ifelse_check;// , tw; int temp_line_number; int temp_current_file; + int lnum; #if FOR_LATER // for now this should just parse a single instruction if ((errorcount + warningcount) > 12 || (*textptr == '\0') || (*(textptr + 1) == '\0')) return 1; @@ -499,20 +525,14 @@ int parsecommand(int tw) // for now just run an externally parsed command. return 0; } - for (j = 0; j < labelcnt; j++) - { - if (strcmp(label + (j << 6), label + (labelcnt << 6)) == 0) - { - *scriptptr = labelcode[j]; - break; - } - } + int lnum = findlabel(label + (labelcnt << 6)); - if (j == labelcnt) + if (lnum < 0) { Printf(TEXTCOLOR_RED " * ERROR!(%s, line %d) State '%s' not found.\n", fn, line_number, label + (labelcnt << 6)); errorcount++; } + *scriptptr = lnum; scriptptr++; return 0; diff --git a/source/games/duke/src/gamedef.h b/source/games/duke/src/gamedef.h index ea9b7eb34..5e80c3b00 100644 --- a/source/games/duke/src/gamedef.h +++ b/source/games/duke/src/gamedef.h @@ -31,6 +31,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. BEGIN_DUKE_NS +#if 0 enum { LABEL_ANY = -1, @@ -42,6 +43,7 @@ enum LABEL_MOVE = 32, LABEL_EVENT = 0x40, }; +#endif #define LABEL_HASPARM2 1 #define LABEL_ISSTRING 2 diff --git a/source/games/duke/src/global.h b/source/games/duke/src/global.h index b224d2017..717078a9d 100644 --- a/source/games/duke/src/global.h +++ b/source/games/duke/src/global.h @@ -160,7 +160,9 @@ G_EXTERN int16_t g_cyclers[MAXCYCLERS][6]; G_EXTERN int16_t g_mirrorSector[64]; G_EXTERN int16_t g_mirrorWall[64]; G_EXTERN int32_t *labelcode; +#if 0 G_EXTERN int32_t *labeltype; +#endif G_EXTERN ClockTicks lockclock; G_EXTERN ClockTicks ototalclock; diff --git a/source/games/duke/src/zz_game.cpp b/source/games/duke/src/zz_game.cpp index ea2f6f2b8..d7740fa28 100644 --- a/source/games/duke/src/zz_game.cpp +++ b/source/games/duke/src/zz_game.cpp @@ -6520,7 +6520,9 @@ static void G_Cleanup(void) if (label != (char *)&sprite[0]) Xfree(label); if (labelcode != (int32_t *)§or[0]) Xfree(labelcode); +#if 0 if (labeltype != (int32_t*)&wall[0]) Xfree(labeltype); +#endif Xfree(apScript); Xfree(bitptr); @@ -6544,7 +6546,9 @@ static void G_CompileScripts(void) { label = (char *)&sprite[0]; // V8: 16384*44/64 = 11264 V7: 4096*44/64 = 2816 labelcode = (int32_t *)§or[0]; // V8: 4096*40/4 = 40960 V7: 1024*40/4 = 10240 +#if 0 labeltype = (int32_t *)&wall[0]; // V8: 16384*32/4 = 131072 V7: 8192*32/4 = 65536 +#endif C_Compile(G_ConFile()); @@ -6562,11 +6566,15 @@ static void G_CompileScripts(void) Bmemcpy(newlabel, label, labelcnt*64); Bmemcpy(newlabelcode, labelcode, labelcnt*sizeof(int32_t)); +#if 0 Bmemcpy(newlabeltype, labeltype, labelcnt*sizeof(int32_t)); +#endif label = newlabel; labelcode = newlabelcode; +#if 0 labeltype = newlabeltype; +#endif } Bmemset(sprite, 0, MAXSPRITES*sizeof(spritetype)); diff --git a/source/games/duke/src/zz_gamedef.cpp b/source/games/duke/src/zz_gamedef.cpp index 77e372efb..c51adb38e 100644 --- a/source/games/duke/src/zz_gamedef.cpp +++ b/source/games/duke/src/zz_gamedef.cpp @@ -63,7 +63,8 @@ uint32_t g_scriptcrc; char g_szBuf[1024]; static char g_szCurrentBlockName[256] = "(none)", g_szLastBlockName[256] = "NULL"; -static int32_t g_checkingIfElse, g_processingState, g_lastKeyword = -1; +static int32_t g_checkingIfElse, g_lastKeyword = -1; +extern int parsing_state; // The pointer to the start of the case table in a switch statement. // First entry is 'default' code. @@ -75,7 +76,7 @@ static int32_t C_ParseCommand(int32_t loop); static int32_t C_SetScriptSize(int32_t size); static intptr_t apScriptGameEventEnd[MAXEVENTS]; -static intptr_t g_parsingActorPtr; +extern intptr_t parsing_actor; static intptr_t g_scriptEventOffset; extern char *textptr; @@ -286,7 +287,7 @@ static int32_t C_SkipComments(void) Printf("%s:%d: debug: EOF in comment!\n",g_scriptFileName,line_number); C_ReportError(-1); Printf("%s:%d: error: found `/*' with no `*/'.\n",g_scriptFileName,line_number); - g_parsingActorPtr = g_processingState = g_numBraces = 0; + parsing_actor = parsing_state = g_numBraces = 0; g_errorCnt++; continue; } @@ -562,7 +563,7 @@ static void C_GetNextVarType(int32_t type) Bstrcpy(tempbuf,LAST_LABEL); id = hash_find(&h_labels,tempbuf); - if (EDUKE32_PREDICT_TRUE(id>=0 && labeltype[id] & LABEL_DEFINE)) + if (EDUKE32_PREDICT_TRUE(id>=0 /*&& labeltype[id] & LABEL_DEFINE*/)) { if (!(g_errorCnt || g_warningCnt) && g_scriptDebug) Printf("%s:%d: debug: label `%s' in place of gamevar.\n",g_scriptFileName,line_number,label+(id<<6)); @@ -613,7 +614,8 @@ static FORCE_INLINE void C_GetManyVarsType(int32_t type, int num) // LABEL_* (>0) if that type and matched // // *scriptptr will contain the value OR 0 if wrong type or error -static int32_t C_GetNextValue(int32_t type) +#define C_GetNextValue(a) C_GetNextValue_() +static int32_t C_GetNextValue_() { C_SkipComments(); @@ -640,33 +642,37 @@ static int32_t C_GetNextValue(int32_t type) if (i>=0) { - if (EDUKE32_PREDICT_TRUE(labeltype[i] & type)) + //if (EDUKE32_PREDICT_TRUE(labeltype[i] & type)) { +#if 0 if (!(g_errorCnt || g_warningCnt) && g_scriptDebug > 1) { char *gl = C_GetLabelType(labeltype[i]); Printf("%s:%d: debug: %s label `%s'.\n",g_scriptFileName,line_number,gl,label+(i<<6)); Xfree(gl); } +#endif BITPTR_CLEAR(scriptptr-apScript); *(scriptptr++) = labelcode[i]; textptr += l; - return labeltype[i]; + return 0;// labeltype[i]; } +#if 0 BITPTR_CLEAR(scriptptr-apScript); *(scriptptr++) = 0; textptr += l; char *el = C_GetLabelType(type); - char *gl = C_GetLabelType(labeltype[i]); + char *gl = C_GetLabelType(/*labeltype[i]*/0); C_ReportError(-1); Printf("%s:%d: warning: expected %s, found %s.\n",g_scriptFileName,line_number,el,gl); g_warningCnt++; Xfree(el); Xfree(gl); return -1; // valid label name, but wrong type +#endif } if (EDUKE32_PREDICT_FALSE(isdigit(*textptr) == 0 && *textptr != '-')) @@ -931,6 +937,8 @@ static inline void C_FinishBitOr(int32_t value) *scriptptr++ = value; } +int parsecommand(int tw); // for now just run an externally parsed command. + static int32_t C_ParseCommand(int32_t loop) { int32_t i, j=0, k=0, tw; @@ -951,14 +959,14 @@ static int32_t C_ParseCommand(int32_t loop) case -2: return 1; //End case concmd_state: - if (!g_parsingActorPtr && g_processingState == 0) + if (!parsing_actor && parsing_state == 0) { C_GetNextLabelName(); scriptptr--; labelcode[labelcnt] = scriptptr-apScript; - labeltype[labelcnt] = LABEL_STATE; + //labeltype[labelcnt] = LABEL_STATE; - g_processingState = 1; + parsing_state = 1; Bsprintf(g_szCurrentBlockName,"%s",label+(labelcnt<<6)); if (getkeyword(label + (labelcnt << 6)) >= 0) @@ -984,6 +992,7 @@ static int32_t C_ParseCommand(int32_t loop) continue; } + /* if (EDUKE32_PREDICT_FALSE((labeltype[j] & LABEL_STATE) != LABEL_STATE)) { char *gl = (char *) C_GetLabelType(labeltype[j]); @@ -995,6 +1004,7 @@ static int32_t C_ParseCommand(int32_t loop) BITPTR_CLEAR(scriptptr-apScript-1); continue; // valid label name, but wrong type } + */ if (!(g_errorCnt || g_warningCnt) && g_scriptDebug > 1) Printf("%s:%d: debug: state label `%s'.\n", g_scriptFileName, line_number, label+(j<<6)); @@ -1007,7 +1017,7 @@ static int32_t C_ParseCommand(int32_t loop) continue; case concmd_ends: - if (EDUKE32_PREDICT_FALSE(g_processingState == 0)) + if (EDUKE32_PREDICT_FALSE(parsing_state == 0)) { C_ReportError(-1); Printf("%s:%d: error: found `ends' without open `state'.\n",g_scriptFileName,line_number); @@ -1026,7 +1036,7 @@ static int32_t C_ParseCommand(int32_t loop) g_errorCnt++; } - g_processingState = 0; + parsing_state = 0; Bsprintf(g_szCurrentBlockName,"(none)"); } continue; @@ -1113,7 +1123,7 @@ static int32_t C_ParseCommand(int32_t loop) else { hash_add(&h_labels,label+(labelcnt<<6),labelcnt,0); - labeltype[labelcnt] = LABEL_DEFINE; + //labeltype[labelcnt] = LABEL_DEFINE; labelcode[labelcnt++] = *(scriptptr-1); //if (*(scriptptr-1) >= 0 && *(scriptptr-1) < MAXTILES && g_dynamicTileMapping) // G_ProcessDynamicTileMapping(label+((labelcnt-1)<<6),*(scriptptr-1)); @@ -1139,8 +1149,10 @@ static int32_t C_ParseCommand(int32_t loop) continue; case concmd_move: - if (g_parsingActorPtr || g_processingState) + if (parsing_actor || parsing_state) { + C_GetNextValue(LABEL_MOVE | LABEL_DEFINE); +#if 0 if (EDUKE32_PREDICT_FALSE((C_GetNextValue(LABEL_MOVE|LABEL_DEFINE) == 0) && (*(scriptptr-1) != 0) && (*(scriptptr-1) != 1))) { C_ReportError(-1); @@ -1149,6 +1161,7 @@ static int32_t C_ParseCommand(int32_t loop) Printf("%s:%d: warning: expected a move, found a constant.\n",g_scriptFileName,line_number); g_warningCnt++; } +#endif j = 0; while (C_GetKeyword() == -1) @@ -1177,7 +1190,7 @@ static int32_t C_ParseCommand(int32_t loop) else { hash_add(&h_labels,label+(labelcnt<<6),labelcnt,0); - labeltype[labelcnt] = LABEL_MOVE; + //labeltype[labelcnt] = LABEL_MOVE; labelcode[labelcnt++] = scriptptr-apScript; } @@ -1268,7 +1281,7 @@ static int32_t C_ParseCommand(int32_t loop) continue; case concmd_ai: - if (g_parsingActorPtr || g_processingState) + if (parsing_actor || parsing_state) { C_GetNextValue(LABEL_AI); } @@ -1292,7 +1305,7 @@ static int32_t C_ParseCommand(int32_t loop) } else { - labeltype[labelcnt] = LABEL_AI; + //labeltype[labelcnt] = LABEL_AI; hash_add(&h_labels,label+(labelcnt<<6),labelcnt,0); labelcode[labelcnt++] = scriptptr-apScript; } @@ -1304,6 +1317,8 @@ static int32_t C_ParseCommand(int32_t loop) C_GetNextValue(LABEL_ACTION); else if (j == 2) { + C_GetNextValue(LABEL_MOVE | LABEL_DEFINE); +#if 0 if (EDUKE32_PREDICT_FALSE((C_GetNextValue(LABEL_MOVE|LABEL_DEFINE) == 0) && (*(scriptptr-1) != 0) && (*(scriptptr-1) != 1))) { @@ -1313,6 +1328,7 @@ static int32_t C_ParseCommand(int32_t loop) Printf("%s:%d: warning: expected a move, found a constant.\n",g_scriptFileName,line_number); g_warningCnt++; } +#endif k = 0; while (C_GetKeyword() == -1) @@ -1337,7 +1353,7 @@ static int32_t C_ParseCommand(int32_t loop) continue; case concmd_action: - if (g_parsingActorPtr || g_processingState) + if (parsing_actor || parsing_state) { C_GetNextValue(LABEL_ACTION); } @@ -1362,7 +1378,7 @@ static int32_t C_ParseCommand(int32_t loop) } else { - labeltype[labelcnt] = LABEL_ACTION; + //labeltype[labelcnt] = LABEL_ACTION; labelcode[labelcnt] = scriptptr-apScript; hash_add(&h_labels,label+(labelcnt<<6),labelcnt,0); labelcnt++; @@ -1383,7 +1399,7 @@ static int32_t C_ParseCommand(int32_t loop) case concmd_actor: case concmd_useractor: - if (EDUKE32_PREDICT_FALSE(g_processingState || g_parsingActorPtr)) + if (EDUKE32_PREDICT_FALSE(parsing_state || parsing_actor)) { C_ReportError(ERROR_FOUNDWITHIN); g_errorCnt++; @@ -1391,7 +1407,7 @@ static int32_t C_ParseCommand(int32_t loop) g_numBraces = 0; scriptptr--; - g_parsingActorPtr = scriptptr - apScript; + parsing_actor = scriptptr - apScript; if (tw == concmd_useractor) { @@ -1411,8 +1427,8 @@ static int32_t C_ParseCommand(int32_t loop) j = hash_find(&h_labels, g_szCurrentBlockName); - if (j != -1) - labeltype[j] |= LABEL_ACTOR; + //if (j != -1) + // labeltype[j] |= LABEL_ACTOR; if (tw == concmd_useractor) { @@ -1439,7 +1455,7 @@ static int32_t C_ParseCommand(int32_t loop) continue; } - g_tile[*scriptptr].execPtr = apScript + g_parsingActorPtr; + g_tile[*scriptptr].execPtr = apScript + parsing_actor; if (tw == concmd_useractor) { @@ -1452,8 +1468,8 @@ static int32_t C_ParseCommand(int32_t loop) for (j=0; j<4; j++) { - BITPTR_CLEAR(g_parsingActorPtr+j); - *((apScript+j)+g_parsingActorPtr) = 0; + BITPTR_CLEAR(parsing_actor+j); + *((apScript+j)+parsing_actor) = 0; if (j == 3) { j = 0; @@ -1485,6 +1501,8 @@ static int32_t C_ParseCommand(int32_t loop) case 2: // XXX: LABEL_MOVE|LABEL_DEFINE, what is this shit? compatibility? // yep, it sure is :( + C_GetNextValue(LABEL_MOVE | LABEL_DEFINE); +#if 0 if (EDUKE32_PREDICT_FALSE((C_GetNextValue(LABEL_MOVE|LABEL_DEFINE) == 0) && (*(scriptptr-1) != 0) && (*(scriptptr-1) != 1))) { C_ReportError(-1); @@ -1493,19 +1511,20 @@ static int32_t C_ParseCommand(int32_t loop) Printf("%s:%d: warning: expected a move, found a constant.\n",g_scriptFileName,line_number); g_warningCnt++; } +#endif break; } if (*(scriptptr-1) >= (intptr_t)&apScript[0] && *(scriptptr-1) < (intptr_t)&apScript[g_scriptSize]) - BITPTR_SET(g_parsingActorPtr+j); - else BITPTR_CLEAR(g_parsingActorPtr+j); - *((apScript+j)+g_parsingActorPtr) = *(scriptptr-1); + BITPTR_SET(parsing_actor+j); + else BITPTR_CLEAR(parsing_actor+j); + *((apScript+j)+parsing_actor) = *(scriptptr-1); } } g_checkingIfElse = 0; continue; case concmd_onevent: - if (EDUKE32_PREDICT_FALSE(g_processingState || g_parsingActorPtr)) + if (EDUKE32_PREDICT_FALSE(parsing_state || parsing_actor)) { C_ReportError(ERROR_FOUNDWITHIN); g_errorCnt++; @@ -1513,7 +1532,7 @@ static int32_t C_ParseCommand(int32_t loop) g_numBraces = 0; scriptptr--; - g_scriptEventOffset = g_parsingActorPtr = scriptptr - apScript; + g_scriptEventOffset = parsing_actor = scriptptr - apScript; C_SkipComments(); j = 0; @@ -1832,6 +1851,8 @@ ifvar: C_GetNextValue(LABEL_ACTION); break; case concmd_ifmove: + C_GetNextValue(LABEL_MOVE | LABEL_DEFINE); +#if 0 if (EDUKE32_PREDICT_FALSE((C_GetNextValue(LABEL_MOVE|LABEL_DEFINE) == 0) && (*(scriptptr-1) != 0) && (*(scriptptr-1) != 1))) { C_ReportError(-1); @@ -1839,6 +1860,7 @@ ifvar: Printf("%s:%d: warning: expected a move, found a constant.\n",g_scriptFileName,line_number); g_warningCnt++; } +#endif break; case concmd_ifpinventory: C_GetNextValue(LABEL_DEFINE); @@ -1946,7 +1968,7 @@ ifvar: } case concmd_leftbrace: - if (EDUKE32_PREDICT_FALSE(!(g_processingState || g_parsingActorPtr || g_scriptEventOffset))) + if (EDUKE32_PREDICT_FALSE(!(parsing_state || parsing_actor || g_scriptEventOffset))) { g_errorCnt++; C_ReportError(ERROR_SYNTAXERROR); @@ -2249,13 +2271,13 @@ ifvar: g_errorCnt++; } - g_scriptEventOffset = g_parsingActorPtr = 0; + g_scriptEventOffset = parsing_actor = 0; g_currentEvent = -1; Bsprintf(g_szCurrentBlockName,"(none)"); continue; case concmd_enda: - if (EDUKE32_PREDICT_FALSE(!g_parsingActorPtr || g_scriptEventOffset)) + if (EDUKE32_PREDICT_FALSE(!parsing_actor || g_scriptEventOffset)) { C_ReportError(-1); Printf("%s:%d: error: found `enda' without open `actor'.\n",g_scriptFileName,line_number); @@ -2267,7 +2289,7 @@ ifvar: C_ReportError(g_numBraces > 0 ? ERROR_OPENBRACKET : ERROR_CLOSEBRACKET); g_errorCnt++; } - g_parsingActorPtr = 0; + parsing_actor = 0; Bsprintf(g_szCurrentBlockName,"(none)"); continue; @@ -2534,8 +2556,8 @@ void C_ReportError(int32_t iError) { if (Bstrcmp(g_szCurrentBlockName,g_szLastBlockName)) { - if (g_scriptEventOffset || g_processingState || g_parsingActorPtr) - Printf("%s: In %s `%s':\n",g_scriptFileName,g_scriptEventOffset?"event":g_parsingActorPtr?"actor":"state",g_szCurrentBlockName); + if (g_scriptEventOffset || parsing_state || parsing_actor) + Printf("%s: In %s `%s':\n",g_scriptFileName,g_scriptEventOffset?"event":parsing_actor?"actor":"state",g_szCurrentBlockName); else Printf("%s: At top level:\n",g_scriptFileName); Bstrcpy(g_szLastBlockName,g_szCurrentBlockName); } @@ -2551,7 +2573,7 @@ void C_ReportError(int32_t iError) Printf("%s:%d: error: expected a keyword but found `%s'.\n",g_scriptFileName,line_number,tempbuf); break; case ERROR_FOUNDWITHIN: - Printf("%s:%d: error: found `%s' within %s.\n",g_scriptFileName,line_number,tempbuf,g_parsingActorPtr?"an actor":"a state"); + Printf("%s:%d: error: found `%s' within %s.\n",g_scriptFileName,line_number,tempbuf,parsing_actor?"an actor":"a state"); break; case ERROR_ISAKEYWORD: Printf("%s:%d: error: symbol `%s' is a keyword.\n",g_scriptFileName,line_number,label+(labelcnt<<6)); diff --git a/source/games/duke/src/zz_osdcmds.cpp b/source/games/duke/src/zz_osdcmds.cpp index 19b1806c7..d81e03633 100644 --- a/source/games/duke/src/zz_osdcmds.cpp +++ b/source/games/duke/src/zz_osdcmds.cpp @@ -425,6 +425,7 @@ static int osdcmd_printtimes(CCmdFuncPtr UNUSED(parm)) buf[0] = 0; + /* for (int ii=0; ii