|
@@ -46,15 +46,16 @@ static int forWhileStack = 0;
|
|
|
static int continueAt = 0;
|
|
|
|
|
|
typedef struct {
|
|
|
+ const char* name;
|
|
|
Operation intOp;
|
|
|
Operation floatOp;
|
|
|
Operation pointerOp;
|
|
|
- const char* name;
|
|
|
+ char padding[sizeof(Operation)];
|
|
|
} TypedOp;
|
|
|
|
|
|
#define TYPE_OP(NAME, FLOAT, POINTER, text) \
|
|
|
- static const TypedOp TYPED_##NAME = {OP_##NAME##_INT, OP_##FLOAT, \
|
|
|
- OP_##POINTER, text};
|
|
|
+ static const TypedOp TYPED_##NAME = { \
|
|
|
+ text, OP_##NAME##_INT, OP_##FLOAT, OP_##POINTER, {0}};
|
|
|
TYPE_OP(MUL, MUL_FLOAT, NOTHING, "*")
|
|
|
TYPE_OP(DIV, DIV_FLOAT, NOTHING, "/")
|
|
|
TYPE_OP(MOD, NOTHING, NOTHING, "%")
|
|
@@ -96,7 +97,7 @@ static void cDeclared(const char* name) {
|
|
|
cError("%s has already been declared", name);
|
|
|
}
|
|
|
|
|
|
-static void cTooMuchArguments() {
|
|
|
+static void cTooMuchArguments(void) {
|
|
|
cError("too much function arguments");
|
|
|
}
|
|
|
|
|
@@ -111,8 +112,8 @@ static void cUnknownFunction(Function* f) {
|
|
|
char buffer[BUFFER_SIZE] = {'\0'};
|
|
|
for(int i = 0; i < f->arguments; i++) {
|
|
|
const char* name = dtGetName(&structs, f->argumentTypes[i]);
|
|
|
- max += snprintf(buffer + max, BUFFER_SIZE - max, i > 0 ? ", %s" : "%s",
|
|
|
- name);
|
|
|
+ max += snprintf(buffer + max, (size_t)(BUFFER_SIZE - max),
|
|
|
+ i > 0 ? ", %s" : "%s", name);
|
|
|
}
|
|
|
cError("unknown function: %s(%s)", f->name, buffer);
|
|
|
}
|
|
@@ -122,7 +123,7 @@ static void cAddOperation(Operation token) {
|
|
|
bcAddBytes(code, &c, 1);
|
|
|
}
|
|
|
|
|
|
-static int32 cReserveInt32() {
|
|
|
+static int32 cReserveInt32(void) {
|
|
|
return bcReserveBytes(code, sizeof(int32));
|
|
|
}
|
|
|
|
|
@@ -144,12 +145,12 @@ static void cAddByteOperation(Operation token, int8 i) {
|
|
|
bcAddBytes(code, &i, sizeof(int8));
|
|
|
}
|
|
|
|
|
|
-static void cAddLine(int16 line) {
|
|
|
+static void cAddLine(int16 l) {
|
|
|
cAddOperation(OP_LINE);
|
|
|
- bcAddBytes(code, &line, sizeof(int16));
|
|
|
+ bcAddBytes(code, &l, sizeof(int16));
|
|
|
}
|
|
|
|
|
|
-static Token cReadTokenAndLine() {
|
|
|
+static Token cReadTokenAndLine(void) {
|
|
|
hasReturn--;
|
|
|
Token t;
|
|
|
if(tReadTokenAndLine(&t, &line)) {
|
|
@@ -169,7 +170,7 @@ static bool cConsumeTokenIf(Token t) {
|
|
|
return tPeekToken() == t && cReadTokenAndLine() == t;
|
|
|
}
|
|
|
|
|
|
-static void cConstantInt32() {
|
|
|
+static void cConstantInt32(void) {
|
|
|
int32 value;
|
|
|
if(tReadInt32(&value)) {
|
|
|
cError("int token without an int");
|
|
@@ -177,7 +178,7 @@ static void cConstantInt32() {
|
|
|
cAddInt32Operation(OP_PUSH_INT, value);
|
|
|
}
|
|
|
|
|
|
-static void cConstantFloat() {
|
|
|
+static void cConstantFloat(void) {
|
|
|
float value;
|
|
|
if(tReadFloat(&value)) {
|
|
|
cError("float token without a float");
|
|
@@ -186,7 +187,7 @@ static void cConstantFloat() {
|
|
|
bcAddBytes(code, &value, sizeof(float));
|
|
|
}
|
|
|
|
|
|
-static const char* cReadString() {
|
|
|
+static const char* cReadString(void) {
|
|
|
const char* literal = tReadString();
|
|
|
if(literal == NULL) {
|
|
|
cError("literal without string on line %d", line);
|
|
@@ -237,7 +238,7 @@ static DataType cReadExtendedType(Token t, bool force) {
|
|
|
return dt;
|
|
|
}
|
|
|
|
|
|
-static DataType cExpression();
|
|
|
+static DataType cExpression(void);
|
|
|
|
|
|
static void cLoadRef(DataType type) {
|
|
|
if(dtIsArray(type)) {
|
|
@@ -257,7 +258,7 @@ static DataType cUnpack(DataType dt) {
|
|
|
return dt;
|
|
|
}
|
|
|
|
|
|
-static DataType cUnpackedExpression() {
|
|
|
+static DataType cUnpackedExpression(void) {
|
|
|
return cUnpack(cExpression());
|
|
|
}
|
|
|
|
|
@@ -322,7 +323,7 @@ static void cStore(DataType left, DataType right, const char* name) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static DataType cLiteral() {
|
|
|
+static DataType cLiteral(void) {
|
|
|
const char* literal = cReadString();
|
|
|
if(cConsumeTokenIf(T_OPEN_BRACKET)) {
|
|
|
return cCallFunction(literal);
|
|
@@ -347,7 +348,7 @@ static DataType cLiteral() {
|
|
|
return dtVoid();
|
|
|
}
|
|
|
|
|
|
-static DataType cText() {
|
|
|
+static DataType cText(void) {
|
|
|
cAddOperation(OP_PUSH_TEXT);
|
|
|
int32 lengthAddress = cReserveInt32();
|
|
|
int32 length = 0;
|
|
@@ -360,19 +361,19 @@ static DataType cText() {
|
|
|
return dtText();
|
|
|
}
|
|
|
|
|
|
-static DataType cBracketPrimary() {
|
|
|
+static DataType cBracketPrimary(void) {
|
|
|
DataType result = cExpression();
|
|
|
cConsumeToken(T_CLOSE_BRACKET);
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
-static void cArrayIndex() {
|
|
|
+static void cArrayIndex(void) {
|
|
|
if(!dtIsInt(cUnpackedExpression())) {
|
|
|
cError("array index must be an int");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static DataType cAllocArray() {
|
|
|
+static DataType cAllocArray(void) {
|
|
|
DataType dt = cReadType(cReadTokenAndLine(), true);
|
|
|
if(dt.array != 0) {
|
|
|
cError("array type must not be an array");
|
|
@@ -384,7 +385,7 @@ static DataType cAllocArray() {
|
|
|
return dtToArray(dt);
|
|
|
}
|
|
|
|
|
|
-static DataType cLength() {
|
|
|
+static DataType cLength(void) {
|
|
|
DataType array = cUnpackedExpression();
|
|
|
if(!dtIsArray(array)) {
|
|
|
cError("length expects an array");
|
|
@@ -393,7 +394,7 @@ static DataType cLength() {
|
|
|
return dtInt();
|
|
|
}
|
|
|
|
|
|
-static DataType cPrimary() {
|
|
|
+static DataType cPrimary(void) {
|
|
|
Token t = cReadTokenAndLine();
|
|
|
switch(t) {
|
|
|
case T_INT_VALUE: cConstantInt32(); return dtInt();
|
|
@@ -420,7 +421,7 @@ static void cExpectType(DataType actual, DataType wanted, const char* name) {
|
|
|
}
|
|
|
|
|
|
static void cChangeType(DataType* dt, Operation op, Operation pushOp,
|
|
|
- int change) {
|
|
|
+ int8 change) {
|
|
|
if(onLine) {
|
|
|
cAddByteOperation(op, change);
|
|
|
*dt = dtVoid();
|
|
@@ -429,7 +430,7 @@ static void cChangeType(DataType* dt, Operation op, Operation pushOp,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static void cPostChange(DataType* dt, int change, const char* name) {
|
|
|
+static void cPostChange(DataType* dt, int8 change, const char* name) {
|
|
|
cRemoveReference(dt, name);
|
|
|
if(dtIsInt(*dt)) {
|
|
|
cChangeType(dt, OP_CHANGE_INT, OP_PUSH_POST_CHANGE_INT, change);
|
|
@@ -455,7 +456,7 @@ static DataType cStructAccess(DataType dt) {
|
|
|
return dtToPointer(inner.type);
|
|
|
}
|
|
|
|
|
|
-static DataType cAccess() {
|
|
|
+static DataType cAccess(void) {
|
|
|
DataType dt = cPrimary();
|
|
|
while(true) {
|
|
|
if(cConsumeTokenIf(T_INCREMENT)) {
|
|
@@ -471,7 +472,7 @@ static DataType cAccess() {
|
|
|
}
|
|
|
cAddOperation(OP_LOAD_ARRAY);
|
|
|
dtRemovePointer(&dt);
|
|
|
- cArrayIndex("index");
|
|
|
+ cArrayIndex();
|
|
|
cConsumeToken(T_CLOSE_SQUARE_BRACKET);
|
|
|
cAddInt32Operation(OP_ADD_REFERENCE, cGetSize(dt));
|
|
|
dt = dtToPointer(dtRemoveArray(dt));
|
|
@@ -481,7 +482,7 @@ static DataType cAccess() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static DataType cPreChange(DataType dt, int change, const char* name) {
|
|
|
+static DataType cPreChange(DataType dt, int8 change, const char* name) {
|
|
|
cRemoveReference(&dt, name);
|
|
|
if(dtIsInt(dt)) {
|
|
|
cChangeType(&dt, OP_CHANGE_INT, OP_PUSH_PRE_CHANGE_INT, change);
|
|
@@ -526,7 +527,7 @@ static DataType cUnaryBitNot(DataType dt) {
|
|
|
return dt;
|
|
|
}
|
|
|
|
|
|
-static DataType cPreUnary() {
|
|
|
+static DataType cPreUnary(void) {
|
|
|
int marker = tGetMarker();
|
|
|
if(cConsumeTokenIf(T_OPEN_BRACKET)) {
|
|
|
if(cConsumeTokenIf(T_FLOAT) && cConsumeTokenIf(T_CLOSE_BRACKET)) {
|
|
@@ -568,7 +569,7 @@ static void cAddTypeOperation(DataType* a, Parser bf, const TypedOp* op) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static DataType cMul() {
|
|
|
+static DataType cMul(void) {
|
|
|
DataType a = cPreUnary();
|
|
|
while(true) {
|
|
|
if(cConsumeTokenIf(T_MUL)) {
|
|
@@ -583,7 +584,7 @@ static DataType cMul() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static DataType cAdd() {
|
|
|
+static DataType cAdd(void) {
|
|
|
DataType a = cMul();
|
|
|
while(true) {
|
|
|
if(cConsumeTokenIf(T_ADD)) {
|
|
@@ -596,7 +597,7 @@ static DataType cAdd() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static DataType cShift() {
|
|
|
+static DataType cShift(void) {
|
|
|
DataType a = cAdd();
|
|
|
while(true) {
|
|
|
if(cConsumeTokenIf(T_LEFT_SHIFT)) {
|
|
@@ -609,7 +610,7 @@ static DataType cShift() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static DataType cComparison() {
|
|
|
+static DataType cComparison(void) {
|
|
|
DataType a = cShift();
|
|
|
while(true) {
|
|
|
if(cConsumeTokenIf(T_LESS)) {
|
|
@@ -630,7 +631,7 @@ static DataType cComparison() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static DataType cEqual() {
|
|
|
+static DataType cEqual(void) {
|
|
|
DataType a = cComparison();
|
|
|
while(true) {
|
|
|
if(cConsumeTokenIf(T_EQUAL)) {
|
|
@@ -653,15 +654,15 @@ static DataType cRepeat(Token t, Parser f, const TypedOp* op) {
|
|
|
return a;
|
|
|
}
|
|
|
|
|
|
-static DataType cBitAnd() {
|
|
|
+static DataType cBitAnd(void) {
|
|
|
return cRepeat(T_BIT_AND, cEqual, &TYPED_BIT_AND);
|
|
|
}
|
|
|
|
|
|
-static DataType cBitXor() {
|
|
|
+static DataType cBitXor(void) {
|
|
|
return cRepeat(T_BIT_XOR, cBitAnd, &TYPED_BIT_XOR);
|
|
|
}
|
|
|
|
|
|
-static DataType cBitOr() {
|
|
|
+static DataType cBitOr(void) {
|
|
|
return cRepeat(T_BIT_OR, cBitXor, &TYPED_BIT_OR);
|
|
|
}
|
|
|
|
|
@@ -680,18 +681,18 @@ static DataType cLogical(Parser f, Token t, Operation jump, Operation op) {
|
|
|
return a;
|
|
|
}
|
|
|
|
|
|
-static DataType cAnd() {
|
|
|
+static DataType cAnd(void) {
|
|
|
return cLogical(cBitOr, T_AND, OP_PEEK_FALSE_GOTO, OP_AND);
|
|
|
}
|
|
|
|
|
|
-static DataType cExpression() {
|
|
|
+static DataType cExpression(void) {
|
|
|
return cLogical(cAnd, T_OR, OP_PEEK_TRUE_GOTO, OP_OR);
|
|
|
}
|
|
|
|
|
|
-static void cLine();
|
|
|
+static void cLine(void);
|
|
|
|
|
|
-static void cConsumeBody() {
|
|
|
- int oldLine = line;
|
|
|
+static void cConsumeBody(void) {
|
|
|
+ int16 oldLine = line;
|
|
|
while(!cConsumeTokenIf(T_CLOSE_CURVED_BRACKET)) {
|
|
|
if(tPeekToken() == T_END) {
|
|
|
line = oldLine;
|
|
@@ -701,7 +702,7 @@ static void cConsumeBody() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static void cConsumeScope() {
|
|
|
+static void cConsumeScope(void) {
|
|
|
Scope scope;
|
|
|
vsEnterScope(&vars, &scope);
|
|
|
cConsumeBody();
|
|
@@ -716,7 +717,7 @@ static void cAddReturn(Operation op) {
|
|
|
returns[returnIndex++] = cReserveInt32();
|
|
|
}
|
|
|
|
|
|
-static void cReturn() {
|
|
|
+static void cReturn(void) {
|
|
|
if(dtIsVoid(returnType)) {
|
|
|
cConsumeToken(T_SEMICOLON);
|
|
|
cAddReturn(OP_RETURN);
|
|
@@ -739,7 +740,7 @@ static void cReturn() {
|
|
|
hasReturn = 2;
|
|
|
}
|
|
|
|
|
|
-static void cIf() {
|
|
|
+static void cIf(void) {
|
|
|
cConsumeToken(T_OPEN_BRACKET);
|
|
|
cExpectType(cExpression(), dtInt(), "if");
|
|
|
cConsumeToken(T_CLOSE_BRACKET);
|
|
@@ -769,7 +770,7 @@ static void cConsumeBreaks(int start, int address) {
|
|
|
breakIndex = start;
|
|
|
}
|
|
|
|
|
|
-static void cWhile() {
|
|
|
+static void cWhile(void) {
|
|
|
int start = code->length;
|
|
|
cConsumeToken(T_OPEN_BRACKET);
|
|
|
cExpectType(cExpression(), dtInt(), "while");
|
|
@@ -796,7 +797,7 @@ static void cOperationSet(DataType left, const TypedOp* op) {
|
|
|
cStore(left, left, "=");
|
|
|
}
|
|
|
|
|
|
-static void cSetVariable() {
|
|
|
+static void cSetVariable(void) {
|
|
|
onLine = true;
|
|
|
DataType dt = cPreUnary();
|
|
|
onLine = false;
|
|
@@ -846,7 +847,7 @@ static bool cDeclaration(Token t) {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
-static void cLineExpression() {
|
|
|
+static void cLineExpression(void) {
|
|
|
int marker = tGetMarker();
|
|
|
Token t = cReadTokenAndLine();
|
|
|
if(cDeclaration(t)) {
|
|
@@ -856,7 +857,7 @@ static void cLineExpression() {
|
|
|
cSetVariable();
|
|
|
}
|
|
|
|
|
|
-static void cFor() {
|
|
|
+static void cFor(void) {
|
|
|
Scope scope;
|
|
|
vsEnterScope(&vars, &scope);
|
|
|
|
|
@@ -890,7 +891,7 @@ static void cFor() {
|
|
|
vsLeaveScope(&vars, &scope);
|
|
|
}
|
|
|
|
|
|
-static void cBreak() {
|
|
|
+static void cBreak(void) {
|
|
|
if(forWhileStack == 0) {
|
|
|
cError("break without for or while");
|
|
|
} else if(breakIndex >= BREAK_BUFFER) {
|
|
@@ -901,7 +902,7 @@ static void cBreak() {
|
|
|
cConsumeToken(T_SEMICOLON);
|
|
|
}
|
|
|
|
|
|
-static void cContinue() {
|
|
|
+static void cContinue(void) {
|
|
|
if(forWhileStack == 0) {
|
|
|
cError("continue without for or while");
|
|
|
}
|
|
@@ -909,7 +910,7 @@ static void cContinue() {
|
|
|
cConsumeToken(T_SEMICOLON);
|
|
|
}
|
|
|
|
|
|
-static void cLine() {
|
|
|
+static void cLine(void) {
|
|
|
int marker = tGetMarker();
|
|
|
Token t = cReadTokenAndLine();
|
|
|
cAddLine(line);
|
|
@@ -928,11 +929,11 @@ static void cLine() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static void cBuildFunction(Function* f, DataType rType, const char* name) {
|
|
|
+static void cBuildFunction(Function* f, DataType rType, const char* fName) {
|
|
|
if(rType.type == DT_STRUCT && rType.array == 0) {
|
|
|
cError("structs cannot be returned");
|
|
|
}
|
|
|
- fInit(f, name, line);
|
|
|
+ fInit(f, fName, line);
|
|
|
f->returnType = rType;
|
|
|
vsReset(&vars);
|
|
|
cConsumeToken(T_OPEN_BRACKET);
|
|
@@ -1009,7 +1010,7 @@ static void cFunction(DataType rType, const char* name) {
|
|
|
cSetInt32(end, code->length);
|
|
|
}
|
|
|
|
|
|
-static void cStruct() {
|
|
|
+static void cStruct(void) {
|
|
|
cConsumeToken(T_LITERAL);
|
|
|
const char* name = cReadString();
|
|
|
if(stsSearch(&structs, name) != NULL) {
|
|
@@ -1057,7 +1058,7 @@ static void cGlobalScope(Token t) {
|
|
|
cConsumeToken(T_SEMICOLON);
|
|
|
}
|
|
|
|
|
|
-static void cCallMain() {
|
|
|
+static void cCallMain(void) {
|
|
|
Function f;
|
|
|
fInit(&f, "main", line);
|
|
|
Function* found = fsSearch(&functions, &f);
|
|
@@ -1068,7 +1069,7 @@ static void cCallMain() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static void cForEachLine() {
|
|
|
+static void cForEachLine(void) {
|
|
|
cAddOperation(OP_GRESERVE);
|
|
|
int p = cReserveInt32();
|
|
|
while(true) {
|
|
@@ -1083,7 +1084,7 @@ static void cForEachLine() {
|
|
|
cAddInt32Operation(OP_GRESERVE, -globalVars.maxAddress);
|
|
|
}
|
|
|
|
|
|
-static void cLinkQueuedFunctions() {
|
|
|
+static void cLinkQueuedFunctions(void) {
|
|
|
for(int i = 0; i < functionQueue.entries; i++) {
|
|
|
Function* f = functionQueue.data + i;
|
|
|
Function* found = fsSearch(&functions, f);
|
|
@@ -1095,7 +1096,7 @@ static void cLinkQueuedFunctions() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static void cAllocAndCompile() {
|
|
|
+static void cAllocAndCompile(void) {
|
|
|
forWhileStack = 0;
|
|
|
breakIndex = 0;
|
|
|
returnType = dtVoid();
|