#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
}\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
PC_Append("AINI", 4);\r
PC_AppendInt(ArraySizes[i]*4+4);\r
PC_AppendInt((U_INT)i);\r
+ MS_Message(MSG_DEBUG, "Writing array initializers for array %d (size %d)\n", i, ArraySizes[i]);\r
for(j = 0; j < ArraySizes[i]; ++j)\r
{\r
PC_AppendInt((U_INT)ArrayInits[i][j]);\r