#include <ctype.h>\r
#include <malloc.h>\r
#include <stdio.h>\r
+#include <assert.h>\r
\r
#include "common.h"\r
#include "parse.h"\r
scriptNumber += NET_SCRIPT_FLAG;\r
TK_NextToken();\r
}\r
+ // [BB] If NET and CLIENTSIDE are specified, this construction can only parse\r
+ // "NET CLIENTSIDE" but not "CLIENTSIDE NET".\r
+ if(tk_Token == TK_CLIENTSIDE)\r
+ {\r
+ scriptNumber += CLIENTSIDE_SCRIPT_FLAG;\r
+ TK_NextToken();\r
+ }\r
CountScript(scriptType);\r
PC_AddScript(scriptNumber + scriptType, ScriptVarCount);\r
pc_LastAppendedCommand = PCD_NOP;\r
}\r
else\r
{\r
- PC_AppendByte(argCount);\r
- PC_AppendWord(specialValue);\r
+ PC_AppendByte((U_BYTE)argCount);\r
+ PC_AppendWord((U_WORD)specialValue);\r
}\r
PC_AppendCmd(PCD_DROP);\r
TK_NextToken();\r
}\r
else\r
{\r
- PC_AppendByte(specialValue);\r
+ PC_AppendByte((U_BYTE)specialValue);\r
}\r
}\r
else\r
}\r
else\r
{\r
- PC_AppendByte(argCount);\r
- PC_AppendWord(-specialValue);\r
+ PC_AppendByte((U_BYTE)argCount);\r
+ PC_AppendWord((U_WORD)-specialValue);\r
}\r
}\r
}\r
}\r
}\r
\r
-static int *ProcessArrayLevel(int level, int *entry, int ndim,\r
+static void ProcessArrayLevel(int level, int *entry, int ndim,\r
int dims[MAX_ARRAY_DIMS], int muls[MAX_ARRAY_DIMS], char *name)\r
{\r
+ int warned_too_many = NO;\r
int i;\r
\r
- for(i = 0; i < dims[level-1]; ++i)\r
+ for(i = 0; ; ++i)\r
{\r
if(tk_Token == TK_COMMA)\r
{\r
else if(tk_Token == TK_RBRACE)\r
{\r
TK_NextToken();\r
- if(level > 1)\r
- {\r
- return entry + muls[level-2] - i;\r
- }\r
- else\r
- {\r
- return entry + (muls[0]*dims[0]) - i;\r
- }\r
+ return;\r
}\r
else\r
{\r
}\r
else\r
{\r
- *entry++ = EvalConstExpression();\r
+ int val;\r
+\r
+ if (i >= dims[level - 1] && !warned_too_many)\r
+ {\r
+ warned_too_many = YES;\r
+ ERR_Error(ERR_TOO_MANY_ARRAY_INIT, YES);\r
+ }\r
+ val = EvalConstExpression();\r
ArrayHasStrings |= pa_ConstExprIsString;\r
+ if (i < dims[level - 1])\r
+ {\r
+ entry[i] = val;\r
+ }\r
}\r
}\r
else\r
{\r
TK_TokenMustBe(TK_LBRACE, ERR_MISSING_LBRACE_ARR);\r
TK_NextToken();\r
- entry = ProcessArrayLevel(level+1, entry, ndim, dims, muls, name);\r
+ ProcessArrayLevel(level+1, entry, ndim, dims, muls, name);\r
+ assert(level > 0);\r
+ entry += muls[level-1];\r
}\r
if(i < dims[level-1]-1)\r
{\r
}\r
TK_TokenMustBe(TK_RBRACE, ERR_MISSING_RBRACE_ARR);\r
TK_NextToken();\r
- return entry;\r
}\r
\r
//==========================================================================\r