Variables are working!

This commit is contained in:
Scott Duensing 2022-12-04 18:38:23 -06:00
parent 06ca429d82
commit 4c644e0eaa
2 changed files with 68 additions and 43 deletions

View file

@ -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);

View file

@ -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)) {