diff --git a/src/vecparse.c b/src/vecparse.c index b331cc8..dfa0b3c 100644 --- a/src/vecparse.c +++ b/src/vecparse.c @@ -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 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); diff --git a/src/vector.c b/src/vector.c index c0501e8..2ccdd02 100644 --- a/src/vector.c +++ b/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)) {