From 7d66144c1b2f8906ec491628b70e219bf2c27c86 Mon Sep 17 00:00:00 2001 From: Dale Weiler Date: Sat, 28 Apr 2012 07:27:03 -0400 Subject: [PATCH] vector parsing for assembly --- asm.c | 29 ++++++++++++++++++++++++++++- data/test.qs | 2 +- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/asm.c b/asm.c index 0b48ca9..a40ed94 100644 --- a/asm.c +++ b/asm.c @@ -87,9 +87,36 @@ static inline bool asm_parse_type(const char *skip, size_t line, asm_state *stat /* TODO: determine if constant, global, or local */ switch (*skip) { /* VECTOR */ case 'V': { + float val1; + float val2; + float val3; + const char *find = skip + 7; while (*find == ' ' || *find == '\t') find++; - printf("found VECTOR %s\n", find); + + /* + * Parse all three elements of the vector. This will only + * pass the first try if we hit a constant, otherwise it's + * a global. + */ + #define PARSE_ELEMENT(X,Y,Z) \ + if (isdigit(*X) || *X == '-'||*X == '+') { \ + bool negated = (*X == '-'); \ + if (negated || *X == '+') { X++; } \ + Y = (negated)?-atof(X):atof(X); \ + X = strchr(X, ','); \ + Z \ + } + + PARSE_ELEMENT(find, val1, { if(find) { find+=3; }}); + PARSE_ELEMENT(find, val2, { if(find) { find+=2; }}); + PARSE_ELEMENT(find, val3, { if(find) { find+=1; }}); + #undef PARSE_ELEMENT + + printf("X:[0] = %f\n", val1); + printf("Y:[1] = %f\n", val2); + printf("Z:[2] = %f\n", val3); + break; } /* ENTITY */ case 'E': { diff --git a/data/test.qs b/data/test.qs index 14d3e26..b087e4f 100644 --- a/data/test.qs +++ b/data/test.qs @@ -83,6 +83,6 @@ FUNCTION: findfloat, $98 FUNCTION: checkextension, $99 ; constants test -VECTOR: 1, 2, 3 +VECTOR: -1, +2, 38865.444 FLOAT: 1 STRING: "hello world" -- 2.39.2