Peter Cooper
/
diags
test code for our MBED board
Diff: scripting.c
- Revision:
- 1:6877bb99aa17
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripting.c Wed May 04 08:30:52 2011 +0000 @@ -0,0 +1,178 @@ +#include "mbed.h" +#include "local_defines.h" +#include "useful.h" +#include "scripting.h" + +extern int var[MAX_VAR]; +extern int sys_state; +extern FILE *exec_fp; + +long jmp[MAX_JMP]; /* Jump points */ + +void clear_var(void) +{ + int a = 0; + + while(a != MAX_VAR){ + var[a] = 0; + a++; + } +} + +void set_var(int c, char **a) +{ + int v,val; + + if(sys_state & EXEC_CALLED){ + if(c != 3) + var_exec_error(VAR_SET_CNT_ERROR); + else { + v = return_var(a[1]); + val = htoi(a[2]); + var[v]=val; + } + + } else + var_exec_error(VAR_EXEC_ERROR); + +} + +void sum_var(int c, char **a) +{ + int v,val1,val2; + + if(sys_state & EXEC_CALLED){ + if(c != 4) + var_exec_error(VAR_SUM_CNT_ERROR); + else { + val1 = htoi(a[1]); + val2 = htoi(a[3]); + v = return_var(a[1]); + switch(a[2][0]){ + case '+' : + var[v] = val1 + val2; + break; + case '-' : + var[v] = val1 - val2; + break; + case '/' : + var[v] = val1 / val2; + break; + case '*' : + var[v] = val1 * val2; + break; + case '%' : + var[v] = val1 * val2; + break; + default : + var_exec_error(VAR_SUM_TYPE_ERROR); + } + } + } else + var_exec_error(VAR_EXEC_ERROR); +} +void point_var(int c, char **a) +{ + int v; + if(sys_state & EXEC_CALLED){ + v = return_jmp(a[1]); + jmp[v] = ftell(exec_fp); /* Read the current file pointers position */ + sys_state = sys_state | INDENT_SET; /* Mark the state as set */ + } else + var_exec_error(VAR_EXEC_ERROR); +} +void tst_var(int c, char **a) +{ + int v,val,j; + int doit=0; + + if(sys_state & EXEC_CALLED){ + if(sys_state & INDENT_SET){ + if(c != 5) + var_exec_error(VAR_TST_CNT_ERROR); + else { + v = return_var(a[1]); + j = return_jmp(a[4]); + val = htoi(a[3]); + switch(a[2][0]){ + case '<' : + if(var[v] < val) + doit = 1; + break; + case '>' : + if(var[v] > val) + doit = 1; + break; + case '=' : + if(var[v] == val) + doit = 1; + break; + case '!' : + if(var[v] != val) + doit = 1; + break; + default : + var_exec_error(VAR_TST_TYPE_ERROR); + } + if(doit) + fseek (exec_fp ,jmp[j] , SEEK_SET ); + } + } else + var_exec_error(VAR_INDENT_ERROR); + } else + var_exec_error(VAR_EXEC_ERROR); +} +void clr_var(int c, char **a) +{ + if(sys_state & EXEC_CALLED){ + clear_var(); + } else + var_exec_error(VAR_EXEC_ERROR); +} +void var_exec_error(int state) +{ + switch(state){ + case VAR_EXEC_ERROR : + lprintf("Can only be called from an exec call\n"); + break; + case VAR_SET_CNT_ERROR : + lprintf("Format: set v<num> <value>\n"); + break; + case VAR_SUM_CNT_ERROR : + lprintf("Format: sum v<num> <action> v<num>\n"); + break; + case VAR_TST_CNT_ERROR : + lprintf("Format: tst v<num> <type> <value>\n"); + break; + case VAR_INDENT_ERROR : + lprintf("In branch test, with no point to loop back to\n"); + break; + case VAR_SUM_TYPE_ERROR : + lprintf("Unknown test type should be either +-/*\n"); + break; + case VAR_TST_TYPE_ERROR : + lprintf("Unknown test type should be either <>=!\n"); + break; + default : + lprintf("Unknown exec_error %04x\n",state); + } +} + +int return_jmp(char *str) +{ + char buf[0x4]; + int a; + + buf[0] = str[1]; + buf[1] = str[2]; + buf[2] = str[3]; + buf[3] = str[4]; + a = atoi(buf); + if(a > MAX_VAR){ + lprintf("In Return_jmp, jmp number %d more than MAXJMP %d, returned -1\n", + a,MAX_JMP); + return(-1); + } + return(a); +} +