]> code.bitgloo.com Git - clyne/interpreter.git/commitdiff
stable for calculator
authorClyne Sullivan <tullivan99@gmail.com>
Wed, 28 Feb 2018 04:49:27 +0000 (23:49 -0500)
committerClyne Sullivan <tullivan99@gmail.com>
Wed, 28 Feb 2018 04:49:27 +0000 (23:49 -0500)
Makefile
builtins.c
parser.c
shell.c
stdlib.c [deleted file]
stdlib.h
variable.c

index 319184f8737c3384943278b9fe093aa890a8b2c7..c588c8fdee7befa781ff64713020a1e1b17c0af8 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,9 +1,11 @@
 #CC = gcc -m32
 #AR = ar
-CC = arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -fsigned-char
+CC = arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16
 AR = arm-none-eabi-ar
 
-CFLAGS = -Wall -Wextra -I. -fno-builtin -ggdb
+CFLAGS = -Wall -Wextra -Werror -pedantic \
+       -Wno-discarded-qualifiers \
+       -I. -fsigned-char -fno-builtin -ggdb
 
 all:
        $(CC) $(CFLAGS) -c shelpers.c
@@ -12,7 +14,6 @@ all:
        $(CC) $(CFLAGS) -c stack.c
        $(CC) $(CFLAGS) -c ops.c
        $(CC) $(CFLAGS) -c variable.c
-       $(CC) $(CFLAGS) -c stdlib.c
        $(AR) r libinterp.a *.o
        @rm -f *.o
-       #$(CC) $(CFLAGS) shell.c -o shell -L. -l interp
+       #$(CC) $(CFLAGS) shell.c *.o -o shell #-L. -l interp
index 9c82b8d9993d7a95bfd52e0b56470f07b48b8a59..309e1d85ebd74afb39a00a11023c4ab9f481f8dd 100644 (file)
@@ -94,13 +94,15 @@ int ifunc_do(interpreter *it)
 
 int ifunc_while(interpreter *it)
 {
-       int c = igetarg_integer(it, 0);
+       //int c = igetarg_integer(it, 0);
        ipop(it);
        int nidx = (int)ipop(it);
-       if (c != 0) {
+       //if (c != 0) {
                //ipush(it, (void *)nidx);
                it->lnidx = nidx - 1;
-       }
+       //} else {
+       //      c++;
+       //}
        ipush(it, 0);
        return 0;
 }
index b2d27e68d530e9be13b2d5632a4b118bba2f1163..0c88cb0041ca4d996c05db69cc675c20ffd4340e 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -10,8 +10,8 @@
 #include <memory.h>
 #include <string.h>
 
-#define MAX_VARS  48
-#define MAX_STACK 16
+#define MAX_VARS  64
+#define MAX_STACK 32
 #define MAX_LINES 1000
 
 extern int atoi(const char *);
@@ -32,13 +32,6 @@ void iinit(interpreter *interp)
        interp->sindent = 0;
        interp->ret = 0;
 
-       //for (unsigned int i = 0; i < MAX_VARS; i++) {
-       //      interp->vars[i].used = 0;
-       //      interp->vnames[i] = 0;
-       //}
-       //for (unsigned int i = 0; i < MAX_LINES; i++)
-       //      interp->lines[i] = 0;
-
        iload_core(interp);
 }
 
@@ -188,11 +181,15 @@ variable *make_var(interpreter *interp, const char *line, uint32_t *next)
                                }
                        }
                }
+               char *copy = (char *)malloc(end + 1);
+               strncpy(copy, line, end);
+               copy[end] = '\0';
                variable *v;
                if (dec)
-                       v = vmakef(strtof(line, 0));
+                       v = vmakef(strtof(copy, 0));
                else
-                       v = vmake(0, INTEGER, (void *)atoi(line));
+                       v = vmake(0, INTEGER, (void *)atoi(copy));
+               free(copy);
                *next = end;
                return v;
        }
@@ -207,7 +204,7 @@ int idoline(interpreter *interp, const char *line)
        if (line[0] == '\0')
                return 0;
        skipblank(line, eol, &offset);
-       if (line[offset] == '#')
+       if (line[offset] == '#' || eol(line[offset]))
                return 0;
 
        variable **linebuf = (variable **)calloc(8, sizeof(variable *));
@@ -292,10 +289,17 @@ cont:
        // eval expressions
        ooffset = 1;
        for (; ops[ooffset] != 0 && ops[ooffset] != (void *)-1; ooffset++) {
-               if (ops[ooffset]->valtype == EXPR)
-                       ops[ooffset] = idoexpr(interp, ops[ooffset]->svalue);
+               if (ops[ooffset]->valtype == EXPR) {
+                       char *expr = strclone(ops[ooffset]->svalue);
+                       variable *r = idoexpr(interp, expr);
+                       ops[ooffset] = r;
+                       free(expr);
+               }
        }
 
+       if (ops[ooffset] == (void *)-1)
+               interp->ret = ops[ooffset + 1];
+
        if (ops[0]->fromc) {
                for (uint32_t i = ooffset; --i > 0;)
                        ipush(interp, ops[i]);
@@ -328,9 +332,6 @@ cont:
                interp->indent++;
        }
 
-       if (ops[ooffset] == (void *)-1)
-               interp->ret = ops[ooffset + 1];
-
        if ((int32_t)interp->stidx < 0) {
                interp->stidx = 0;
                return -5;
@@ -358,12 +359,10 @@ fail:
 
 variable *idoexpr(interpreter *interp, const char *line)
 {
-       variable *result = (variable *)calloc(1, sizeof(variable));
-       char *mline = line;
        void *ops[16];
        uint32_t ooffset = 0;
        uint32_t offset = 0;
-       uint32_t next;
+       uint32_t next = 0;
 
        // step 1 - break apart line
 
@@ -389,16 +388,15 @@ variable *idoexpr(interpreter *interp, const char *line)
                        ops[ooffset] = idoexpr(interp, line + offset + 1);
                        offset = i + 1;
                } else {
-                       uint32_t end = offset;
-                       char cend;
-                       if (line[offset] != '\"') {
-                               for (; isalnum(line[end]) || line[end] == '.'; end++);
-                               cend = line[end];
-                               mline[end] = ' ';
-                       }
-                       ops[ooffset] = make_var(interp, line + offset, &next);
-                       if (end != 0)
-                               mline[end] = cend;
+                       uint32_t len = offset;
+                       for (; isalnum(line[len]) || line[len] == '.'; len++);
+                       len -= offset;
+                       char *copy = (char *)malloc(len + 1);
+                       strncpy(copy, line + offset, len);
+                       copy[len] = '\0';
+                       variable *v = make_var(interp, copy, &next);
+                       free(copy);
+                       ops[ooffset] = v;
                        offset += next;
                }
                if (ops[ooffset] == 0)
@@ -431,10 +429,16 @@ variable *idoexpr(interpreter *interp, const char *line)
                return 0;
 
        // step 2 - do operations
+       variable *result = (variable *)calloc(1, sizeof(variable));
        result->valtype = ((variable *)ops[0])->valtype;
        result->value = ((variable *)ops[0])->value;
        for (uint32_t i = 1; i < ooffset; i += 2)
                iopfuncs[(uint32_t)ops[i] - 1](result, result, ops[i + 1]);
+       
+       if (result->valtype == INTEGER)
+               isetstr(result);
+       else
+               fsetstr(result);
 
        for (uint32_t i = 0; i < ooffset; i += 2) {
                if (!((variable *)ops[i])->used) {
@@ -444,13 +448,6 @@ variable *idoexpr(interpreter *interp, const char *line)
                        free(ops[i]);
                }
        }
-       
-       result->used = 0;
-       result->svalue = 0;
-       if (result->valtype == INTEGER)
-               isetstr(result);
-       else
-               fsetstr(result);
 
        return result;
 }
diff --git a/shell.c b/shell.c
index 682213cd8a1cdd3091ce63292bedd3be019336fc..c5460e77125677dec82ce404576e908a7a4e8de8 100644 (file)
--- a/shell.c
+++ b/shell.c
@@ -3,10 +3,13 @@
 
 #include "stack.h"
 
+#include <memory.h>
 #include <stdio.h>
-#include <stdlib.h>
+//#include <stdlib.h>
 #include <string.h>
 
+extern int rand(void);
+
 int s_put(interpreter *it)
 {
        char *s = igetarg_string(it, 0);
@@ -60,25 +63,21 @@ int concat(interpreter *it)
        return 0;
 }
 
-int quit(interpreter *it)
+int script_rand(interpreter *it)
 {
-       (void)it;
-       exit(0);
+       static variable v;
+       v.valtype = INTEGER;
+       unsigned int mod = igetarg_integer(it, 0);
+       unsigned int val = rand();
+       INT(&v) = val % mod;
+       isetstr(&v);
+       iret(it, &v);
        return 0;
 }
 
-int expr(interpreter *it)
+int line(interpreter *it)
 {
-       variable *v = igetarg(it, 0);
-       variable *r = igetarg(it, 1);
-       int len = strlen(v->svalue);
-       char *s = malloc(len + 1);
-       strcpy(s, v->svalue);
-       s[len] = 0;
-       variable *q = idoexpr(it, s);
-       r->valtype = q->valtype;
-       r->value = q->value;
-       r->svalue = q->svalue;
+       (void)it;
        return 0;
 }
 
@@ -100,10 +99,10 @@ int main(int argc, char **argv)
        iinit(&interp);
        inew_cfunc(&interp, "print", s_put);
        inew_cfunc(&interp, "tp", s_type);
-       inew_cfunc(&interp, "q", quit);
        inew_cfunc(&interp, "gets", input);
        inew_cfunc(&interp, "concat", concat);
-       inew_cfunc(&interp, "expr", expr);
+       inew_cfunc(&interp, "rand", script_rand);
+       inew_cfunc(&interp, "line", line);
 
 
        char *line = 0;
diff --git a/stdlib.c b/stdlib.c
deleted file mode 100644 (file)
index 3299d0b..0000000
--- a/stdlib.c
+++ /dev/null
@@ -1,21 +0,0 @@
-#include <stdarg.h>
-
-char *snprintf(char *buf, unsigned int max, const char *format, ...)
-{
-       (void)max;
-       va_list args;
-       va_start(args, format);
-
-       buf[0] = '0';
-       buf[1] = '\0';
-
-       va_end(args);
-       return buf;
-}
-
-float strtof(const char *s, char **endptr)
-{
-       (void)s;
-       (void)endptr;
-       return 0.0f;
-}
index 0001edc5c4680466211773a809f7b8f414f65eff..b87a823a991fbe227bc424bf87861113e4be1047 100644 (file)
--- a/stdlib.h
+++ b/stdlib.h
@@ -4,6 +4,6 @@
 char *snprintf(char *buf, unsigned int max, const char *format, ...);
 float strtof(const char *s, char **endptr);
 
-extern int atoi(const char *);
+int atoi(const char *);
 
 #endif // STDLIB_H_
index bcf96cbc352250e4cd12487cb39523978e1f2eec..8b7dc1292e7d48e5587cf7f5c01fcc8b30a86f3b 100644 (file)
@@ -37,7 +37,6 @@ variable *vmake(uint8_t fromc, uint8_t valtype, void *value)
        v->svalue = 0;
        switch (valtype) {
        case STRING:
-               v->value = 0;
                v->svalue = fixstring(value);
                free(value);
                break;
@@ -50,7 +49,6 @@ variable *vmake(uint8_t fromc, uint8_t valtype, void *value)
                v->svalue = str_func;
                break;
        case EXPR:
-               v->value = 0;
                v->svalue = value;
                break;
        }
@@ -71,15 +69,15 @@ variable *vmakef(float value)
 void fsetstr(variable *f)
 {
        if (f->svalue == 0 || f->svalue == str_undef)
-               f->svalue = (char *)malloc(16);
-       snprintf(f->svalue, 16, "%f", FLOAT(f));
+               f->svalue = (char *)malloc(32);
+       snprintf(f->svalue, 32, "%f", FLOAT(f));
 }
 
 void isetstr(variable *i)
 {
        if (i->svalue == 0 || i->svalue == str_undef)
-               i->svalue = (char *)malloc(12);
-       snprintf(i->svalue, 12, "%d", (int)INT(i));
+               i->svalue = (char *)malloc(32);
+       snprintf(i->svalue, 32, "%d", (int)INT(i));
 }
 
 variable *itostring(variable *v)