Variables are working!
This commit is contained in:
parent
06ca429d82
commit
4c644e0eaa
2 changed files with 68 additions and 43 deletions
|
@ -25,7 +25,7 @@
|
|||
#include "vecparse.h"
|
||||
|
||||
|
||||
#define IS_NUMBER(n) (n & 0x8000 ? TRUE : FALSE)
|
||||
#define IS_NUMBER(n) (n & 0x8000 ? FALSE : TRUE)
|
||||
|
||||
|
||||
typedef struct KeywordsS {
|
||||
|
@ -101,14 +101,15 @@ static gboolean parserGetNextValue(char *token, char **valueEnd, char **variable
|
|||
// It's a variable. Do we know it?
|
||||
*x = -1;
|
||||
for (index=0; index<arrlen(variables); index++) {
|
||||
printf("Checking GN %d of %ld, %s = %s\n", index, arrlen(variables), variables[index], value);
|
||||
if (strcasecmp(variables[index], value) == 0) {
|
||||
// Set MSb to indicate it's a variable.
|
||||
index |= 0x8000;
|
||||
*x = index; // Found.
|
||||
break;
|
||||
}
|
||||
if (*x < 0) return FALSE;
|
||||
// Set MSb to indicate it's a variable.
|
||||
*x |= 0x8000;
|
||||
}
|
||||
if (*x < 0) return FALSE;
|
||||
|
||||
} else {
|
||||
|
||||
|
@ -158,14 +159,15 @@ static gboolean parserGetX(char **tokenEnd, char **variables, int *x) {
|
|||
// It's a variable. Do we know it?
|
||||
*x = -1;
|
||||
for (index=0; index<arrlen(variables); index++) {
|
||||
printf("Checking GX %d of %ld, %s = %s\n", index, arrlen(variables), variables[index], value);
|
||||
if (strcasecmp(variables[index], value) == 0) {
|
||||
// Set MSb to indicate it's a variable.
|
||||
index |= 0x8000;
|
||||
*x = index; // Found.
|
||||
break;
|
||||
}
|
||||
if (*x < 0) return FALSE;
|
||||
// Set MSb to indicate it's a variable.
|
||||
*x |= 0x8000;
|
||||
}
|
||||
if (*x < 0) return FALSE;
|
||||
|
||||
} else {
|
||||
|
||||
|
@ -299,6 +301,8 @@ int vecparser(char *programIn, VecByteCodeT *bytecode) {
|
|||
arrput(variables, token);
|
||||
y1 = arrlen(variables) - 1;
|
||||
}
|
||||
// Mark as variable.
|
||||
y1 |= 0x80;
|
||||
|
||||
// Find the operator.
|
||||
token = strtok_r(NULL, " ", &tokenEnd);
|
||||
|
@ -313,6 +317,12 @@ int vecparser(char *programIn, VecByteCodeT *bytecode) {
|
|||
outputByte(bytecode, math[keyword].id);
|
||||
outputWord(bytecode, x1);
|
||||
lineOkay = TRUE;
|
||||
//***DEBUG***
|
||||
if (math[keyword].id == MATH_ASSIGN) {
|
||||
for (y1=0; y1<arrlen(variables); y1++) {
|
||||
printf("Variable %d = %s\n", y1, variables[y1]);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
keyword++;
|
||||
|
@ -345,12 +355,12 @@ int vecparser(char *programIn, VecByteCodeT *bytecode) {
|
|||
if (!parserGetXY(&tokenEnd, variables, &x1, &y1)) break;
|
||||
if (!parserGetWord("TO", &tokenEnd)) break;
|
||||
if (!parserGetXY(&tokenEnd, variables, &x2, &y2)) break;
|
||||
if (IS_NUMBER(x1) && IS_NUMBER(x2) && x2 < x1) break;
|
||||
if (IS_NUMBER(x1) && (x1 < 0 || x1 > 319)) break;
|
||||
if (IS_NUMBER(x2) && (x2 < 0 || x2 > 319)) break;
|
||||
if (IS_NUMBER(y1) && IS_NUMBER(y2) && y2 < y1) break;
|
||||
if (IS_NUMBER(y1) && (y1 < 0 || y1 > 199)) break;
|
||||
if (IS_NUMBER(y2) && (y2 < 0 || y2 > 199)) break;
|
||||
if (IS_NUMBER(x1) && IS_NUMBER(x2)) if (x2 < x1) break;
|
||||
if (IS_NUMBER(x1)) if (x1 < 0 || x1 > 319) break;
|
||||
if (IS_NUMBER(x2)) if (x2 < 0 || x2 > 319) break;
|
||||
if (IS_NUMBER(y1) && IS_NUMBER(y2)) if (y2 < y1) break;
|
||||
if (IS_NUMBER(y1)) if (y1 < 0 || y1 > 199) break;
|
||||
if (IS_NUMBER(y2)) if (y2 < 0 || y2 > 199) break;
|
||||
outputByte(bytecode, PARSE_BOX);
|
||||
outputWord(bytecode, x1);
|
||||
outputWord(bytecode, y1);
|
||||
|
@ -364,8 +374,8 @@ int vecparser(char *programIn, VecByteCodeT *bytecode) {
|
|||
if (!parserGetX(&tokenEnd, variables, &y2)) break;
|
||||
if (!parserGetWord("AT", &tokenEnd)) break;
|
||||
if (!parserGetXY(&tokenEnd, variables, &x1, &y1)) break;
|
||||
if (IS_NUMBER(x1) && (x1 < 0 || x1 > 319)) break;
|
||||
if (IS_NUMBER(y1) && (y1 < 0 || y1 > 199)) break;
|
||||
if (IS_NUMBER(x1)) if (x1 < 0 || x1 > 319) break;
|
||||
if (IS_NUMBER(y1)) if (y1 < 0 || y1 > 199) break;
|
||||
outputByte(bytecode, PARSE_CIRCLE);
|
||||
outputWord(bytecode, y2);
|
||||
outputWord(bytecode, x1);
|
||||
|
@ -381,7 +391,7 @@ int vecparser(char *programIn, VecByteCodeT *bytecode) {
|
|||
case PARSE_COLOR:
|
||||
// Color (short)
|
||||
if (!parserGetX(&tokenEnd, variables, &x1)) break;
|
||||
if (IS_NUMBER(x1) && (x1 < 0 || x1 > 15)) break;
|
||||
if (IS_NUMBER(x1)) if (x1 < 0 || x1 > 15) break;
|
||||
outputByte(bytecode, PARSE_COLOR);
|
||||
outputByte(bytecode, x1);
|
||||
lineOkay = TRUE;
|
||||
|
@ -400,12 +410,12 @@ int vecparser(char *programIn, VecByteCodeT *bytecode) {
|
|||
if (!parserGetXY(&tokenEnd, variables, &x1, &y1)) break;
|
||||
if (!parserGetWord("TO", &tokenEnd)) break;
|
||||
if (!parserGetXY(&tokenEnd, variables, &x2, &y2)) break;
|
||||
if (IS_NUMBER(x1) && IS_NUMBER(x2) && x2 < x1) break;
|
||||
if (IS_NUMBER(x1) && (x1 < 0 || x1 > 319)) break;
|
||||
if (IS_NUMBER(x2) && (x2 < 0 || x2 > 319)) break;
|
||||
if (IS_NUMBER(y1) && IS_NUMBER(y2) && y2 < y1) break;
|
||||
if (IS_NUMBER(y1) && (y1 < 0 || y1 > 199)) break;
|
||||
if (IS_NUMBER(y2) && (y2 < 0 || y2 > 199)) break;
|
||||
if (IS_NUMBER(x1) && IS_NUMBER(x2)) if (x2 < x1) break;
|
||||
if (IS_NUMBER(x1)) if (x1 < 0 || x1 > 319) break;
|
||||
if (IS_NUMBER(x2)) if (x2 < 0 || x2 > 319) break;
|
||||
if (IS_NUMBER(y1) && IS_NUMBER(y2)) if (y2 < y1) break;
|
||||
if (IS_NUMBER(y1)) if (y1 < 0 || y1 > 199) break;
|
||||
if (IS_NUMBER(y2)) if (y2 < 0 || y2 > 199) break;
|
||||
outputByte(bytecode, PARSE_ELLIPSE);
|
||||
outputWord(bytecode, x1);
|
||||
outputWord(bytecode, y1);
|
||||
|
@ -417,13 +427,13 @@ int vecparser(char *programIn, VecByteCodeT *bytecode) {
|
|||
case PARSE_FILL:
|
||||
// Fill (value),(value) {to (value}
|
||||
if (!parserGetXY(&tokenEnd, variables, &x1, &y1)) break;
|
||||
if (IS_NUMBER(x1) && (x1 < 0 || x1 > 319)) break;
|
||||
if (IS_NUMBER(y1) && (y1 < 0 || y1 > 199)) break;
|
||||
if (IS_NUMBER(x1)) if (x1 < 0 || x1 > 319) break;
|
||||
if (IS_NUMBER(y1)) if (y1 < 0 || y1 > 199) break;
|
||||
// Do they want to fill to a certain color? Or over the current color?
|
||||
x2 = 16; // 16 == Fill, otherwise FillTo
|
||||
if (parserGetWord("TO", &tokenEnd)) {
|
||||
if (!parserGetX(&tokenEnd, variables, &x2)) break;
|
||||
if (IS_NUMBER(x2) && (x2 < 0 || x2 > 15)) break;
|
||||
if (IS_NUMBER(x2)) if (x2 < 0 || x2 > 15) break;
|
||||
}
|
||||
outputByte(bytecode, PARSE_FILL);
|
||||
outputWord(bytecode, x1);
|
||||
|
@ -442,10 +452,10 @@ int vecparser(char *programIn, VecByteCodeT *bytecode) {
|
|||
if (!parserGetXY(&tokenEnd, variables, &p1.x, &p1.y)) break;
|
||||
if (!parserGetWord("TO", &tokenEnd)) break;
|
||||
if (!parserGetXY(&tokenEnd, variables, &p2.x, &p2.y)) break;
|
||||
if (IS_NUMBER(p1.x) && (p1.x < 0 || p1.x > 319)) break;
|
||||
if (IS_NUMBER(p1.y) && (p1.y < 0 || p1.y > 199)) break;
|
||||
if (IS_NUMBER(p2.x) && (p2.x < 0 || p2.x > 319)) break;
|
||||
if (IS_NUMBER(p2.y) && (p2.y < 0 || p2.y > 199)) break;
|
||||
if (IS_NUMBER(p1.x)) if (p1.x < 0 || p1.x > 319) break;
|
||||
if (IS_NUMBER(p1.y)) if (p1.y < 0 || p1.y > 199) break;
|
||||
if (IS_NUMBER(p2.x)) if (p2.x < 0 || p2.x > 319) break;
|
||||
if (IS_NUMBER(p2.y)) if (p2.y < 0 || p2.y > 199) break;
|
||||
arrput(points, p1);
|
||||
arrput(points, p2);
|
||||
isOkay = TRUE;
|
||||
|
@ -459,7 +469,7 @@ int vecparser(char *programIn, VecByteCodeT *bytecode) {
|
|||
isOkay = FALSE;
|
||||
break;
|
||||
}
|
||||
arrput(points, p1);
|
||||
arrput(points, p1);
|
||||
}
|
||||
if (isOkay) {
|
||||
outputByte(bytecode, PARSE_LINE);
|
||||
|
@ -486,10 +496,10 @@ int vecparser(char *programIn, VecByteCodeT *bytecode) {
|
|||
if (!parserGetX(&tokenEnd, variables, &x1)) break;
|
||||
if (!parserGetWord("AS", &tokenEnd)) break;
|
||||
if (!parserGetXYZ(&tokenEnd, variables, &x2, &y1, &y2)) break;
|
||||
if (IS_NUMBER(x1) && (x1 < 0 || x1 > 15)) break;
|
||||
if (IS_NUMBER(x2) && (x2 < 0 || x2 > 15)) break;
|
||||
if (IS_NUMBER(y1) && (y1 < 0 || y1 > 15)) break;
|
||||
if (IS_NUMBER(y2) && (y2 < 0 || y2 > 15)) break;
|
||||
if (IS_NUMBER(x1)) if (x1 < 0 || x1 > 15) break;
|
||||
if (IS_NUMBER(x2)) if (x2 < 0 || x2 > 15) break;
|
||||
if (IS_NUMBER(y1)) if (y1 < 0 || y1 > 15) break;
|
||||
if (IS_NUMBER(y2)) if (y2 < 0 || y2 > 15) break;
|
||||
outputByte(bytecode, PARSE_PALETTE);
|
||||
outputByte(bytecode, x1);
|
||||
outputByte(bytecode, x2);
|
||||
|
@ -501,8 +511,8 @@ int vecparser(char *programIn, VecByteCodeT *bytecode) {
|
|||
case PARSE_PLOT:
|
||||
// Plot (value),(value)
|
||||
if (!parserGetXY(&tokenEnd, variables, &x1, &y1)) break;
|
||||
if (IS_NUMBER(x1) && (x1 < 0 || x1 > 319)) break;
|
||||
if (IS_NUMBER(y1) && (y1 < 0 || y1 > 199)) break;
|
||||
if (IS_NUMBER(x1)) if (x1 < 0 || x1 > 319) break;
|
||||
if (IS_NUMBER(y1)) if (y1 < 0 || y1 > 199) break;
|
||||
outputByte(bytecode, PARSE_PLOT);
|
||||
outputWord(bytecode, x1);
|
||||
outputWord(bytecode, y1);
|
||||
|
@ -514,12 +524,12 @@ int vecparser(char *programIn, VecByteCodeT *bytecode) {
|
|||
if (!parserGetXY(&tokenEnd, variables, &x1, &y1)) break;
|
||||
if (!parserGetWord("TO", &tokenEnd)) break;
|
||||
if (!parserGetXY(&tokenEnd, variables, &x2, &y2)) break;
|
||||
if (IS_NUMBER(x1) && IS_NUMBER(x2) && x2 < x1) break;
|
||||
if (IS_NUMBER(x1) && (x1 < 0 || x1 > 319)) break;
|
||||
if (IS_NUMBER(x2) && (x2 < 0 || x2 > 319)) break;
|
||||
if (IS_NUMBER(y1) && IS_NUMBER(y2) && y2 < y1) break;
|
||||
if (IS_NUMBER(y1) && (y1 < 0 || y1 > 199)) break;
|
||||
if (IS_NUMBER(y2) && (y2 < 0 || y2 > 199)) break;
|
||||
if (IS_NUMBER(x1) && IS_NUMBER(x2)) if (x2 < x1) break;
|
||||
if (IS_NUMBER(x1)) if (x1 < 0 || x1 > 319) break;
|
||||
if (IS_NUMBER(x2)) if (x2 < 0 || x2 > 319) break;
|
||||
if (IS_NUMBER(y1) && IS_NUMBER(y2)) if (y2 < y1) break;
|
||||
if (IS_NUMBER(y1)) if (y1 < 0 || y1 > 199) break;
|
||||
if (IS_NUMBER(y2)) if (y2 < 0 || y2 > 199) break;
|
||||
outputByte(bytecode, PARSE_RECTANGLE);
|
||||
outputWord(bytecode, x1);
|
||||
outputWord(bytecode, y1);
|
||||
|
|
17
src/vector.c
17
src/vector.c
|
@ -410,7 +410,9 @@ static void renderBytecode(VecByteCodeT *bytecode, VectorDataT *self) {
|
|||
} else {
|
||||
f2 = x2;
|
||||
}
|
||||
x1 &= 0x7f; // Clear variable flag.
|
||||
f1 = variable(self, x1);
|
||||
printf("Math: %d: ", x1);
|
||||
switch (y1) {
|
||||
case MATH_NONE:
|
||||
// Well, none!
|
||||
|
@ -418,52 +420,65 @@ static void renderBytecode(VecByteCodeT *bytecode, VectorDataT *self) {
|
|||
|
||||
case MATH_ASSIGN:
|
||||
f1 = f2;
|
||||
printf("= %f", f2);
|
||||
break;
|
||||
|
||||
case MATH_ADD:
|
||||
f1 += f2;
|
||||
printf("%f + %f", f1, f2);
|
||||
break;
|
||||
|
||||
case MATH_SUBTRACT:
|
||||
f1 -= f2;
|
||||
printf("%f - %f", f1, f2);
|
||||
break;
|
||||
|
||||
case MATH_MULTIPLY:
|
||||
f1 *= f2;
|
||||
printf("%f * %f", f1, f2);
|
||||
break;
|
||||
|
||||
case MATH_DIVIDE:
|
||||
f1 /= f2;
|
||||
printf("%f / %f", f1, f2);
|
||||
break;
|
||||
|
||||
case MATH_MOD:
|
||||
f1 = modff(f1, &f2);
|
||||
printf("%f mod %f", f1, f2);
|
||||
break;
|
||||
|
||||
case MATH_POW:
|
||||
f1 = powf(f1, f2);
|
||||
printf("%f pow %f", f1, f2);
|
||||
break;
|
||||
|
||||
case MATH_SQRT:
|
||||
f1 = sqrtf(f2);
|
||||
printf("%f sqrt %f", f1, f2);
|
||||
break;
|
||||
|
||||
case MATH_ABS:
|
||||
f1 = fabsf(f2);
|
||||
printf("%f abs %f", f1, f2);
|
||||
break;
|
||||
|
||||
case MATH_COS:
|
||||
f1 = cosf(f2);
|
||||
printf("%f cos %f", f1, f2);
|
||||
break;
|
||||
|
||||
case MATH_SIN:
|
||||
f1 = sinf(f2);
|
||||
printf("%f sin %f", f1, f2);
|
||||
break;
|
||||
|
||||
case MATH_TAN:
|
||||
f1 = tanf(f2);
|
||||
printf("%f tan %f", f1, f2);
|
||||
break;
|
||||
}
|
||||
printf("\n");
|
||||
// Make sure we have enough slots for this variable.
|
||||
while (arrlen(self->variables) <= x1) {
|
||||
arrput(self->variables, 0.0f);
|
||||
|
@ -534,7 +549,7 @@ static float variable(VectorDataT *self, unsigned char byte) {
|
|||
int value;
|
||||
|
||||
// Clear possibly set variable flag.
|
||||
byte &= 0xbf;
|
||||
byte &= 0x7f;
|
||||
|
||||
// Look up variable and return value.
|
||||
if (byte < arrlen(self->variables)) {
|
||||
|
|
Loading…
Add table
Reference in a new issue