Peter Cooper
/
diags
test code for our MBED board
scripting.c@1:6877bb99aa17, 2011-05-04 (annotated)
- Committer:
- lolpcc
- Date:
- Wed May 04 08:30:52 2011 +0000
- Revision:
- 1:6877bb99aa17
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
lolpcc | 1:6877bb99aa17 | 1 | #include "mbed.h" |
lolpcc | 1:6877bb99aa17 | 2 | #include "local_defines.h" |
lolpcc | 1:6877bb99aa17 | 3 | #include "useful.h" |
lolpcc | 1:6877bb99aa17 | 4 | #include "scripting.h" |
lolpcc | 1:6877bb99aa17 | 5 | |
lolpcc | 1:6877bb99aa17 | 6 | extern int var[MAX_VAR]; |
lolpcc | 1:6877bb99aa17 | 7 | extern int sys_state; |
lolpcc | 1:6877bb99aa17 | 8 | extern FILE *exec_fp; |
lolpcc | 1:6877bb99aa17 | 9 | |
lolpcc | 1:6877bb99aa17 | 10 | long jmp[MAX_JMP]; /* Jump points */ |
lolpcc | 1:6877bb99aa17 | 11 | |
lolpcc | 1:6877bb99aa17 | 12 | void clear_var(void) |
lolpcc | 1:6877bb99aa17 | 13 | { |
lolpcc | 1:6877bb99aa17 | 14 | int a = 0; |
lolpcc | 1:6877bb99aa17 | 15 | |
lolpcc | 1:6877bb99aa17 | 16 | while(a != MAX_VAR){ |
lolpcc | 1:6877bb99aa17 | 17 | var[a] = 0; |
lolpcc | 1:6877bb99aa17 | 18 | a++; |
lolpcc | 1:6877bb99aa17 | 19 | } |
lolpcc | 1:6877bb99aa17 | 20 | } |
lolpcc | 1:6877bb99aa17 | 21 | |
lolpcc | 1:6877bb99aa17 | 22 | void set_var(int c, char **a) |
lolpcc | 1:6877bb99aa17 | 23 | { |
lolpcc | 1:6877bb99aa17 | 24 | int v,val; |
lolpcc | 1:6877bb99aa17 | 25 | |
lolpcc | 1:6877bb99aa17 | 26 | if(sys_state & EXEC_CALLED){ |
lolpcc | 1:6877bb99aa17 | 27 | if(c != 3) |
lolpcc | 1:6877bb99aa17 | 28 | var_exec_error(VAR_SET_CNT_ERROR); |
lolpcc | 1:6877bb99aa17 | 29 | else { |
lolpcc | 1:6877bb99aa17 | 30 | v = return_var(a[1]); |
lolpcc | 1:6877bb99aa17 | 31 | val = htoi(a[2]); |
lolpcc | 1:6877bb99aa17 | 32 | var[v]=val; |
lolpcc | 1:6877bb99aa17 | 33 | } |
lolpcc | 1:6877bb99aa17 | 34 | |
lolpcc | 1:6877bb99aa17 | 35 | } else |
lolpcc | 1:6877bb99aa17 | 36 | var_exec_error(VAR_EXEC_ERROR); |
lolpcc | 1:6877bb99aa17 | 37 | |
lolpcc | 1:6877bb99aa17 | 38 | } |
lolpcc | 1:6877bb99aa17 | 39 | |
lolpcc | 1:6877bb99aa17 | 40 | void sum_var(int c, char **a) |
lolpcc | 1:6877bb99aa17 | 41 | { |
lolpcc | 1:6877bb99aa17 | 42 | int v,val1,val2; |
lolpcc | 1:6877bb99aa17 | 43 | |
lolpcc | 1:6877bb99aa17 | 44 | if(sys_state & EXEC_CALLED){ |
lolpcc | 1:6877bb99aa17 | 45 | if(c != 4) |
lolpcc | 1:6877bb99aa17 | 46 | var_exec_error(VAR_SUM_CNT_ERROR); |
lolpcc | 1:6877bb99aa17 | 47 | else { |
lolpcc | 1:6877bb99aa17 | 48 | val1 = htoi(a[1]); |
lolpcc | 1:6877bb99aa17 | 49 | val2 = htoi(a[3]); |
lolpcc | 1:6877bb99aa17 | 50 | v = return_var(a[1]); |
lolpcc | 1:6877bb99aa17 | 51 | switch(a[2][0]){ |
lolpcc | 1:6877bb99aa17 | 52 | case '+' : |
lolpcc | 1:6877bb99aa17 | 53 | var[v] = val1 + val2; |
lolpcc | 1:6877bb99aa17 | 54 | break; |
lolpcc | 1:6877bb99aa17 | 55 | case '-' : |
lolpcc | 1:6877bb99aa17 | 56 | var[v] = val1 - val2; |
lolpcc | 1:6877bb99aa17 | 57 | break; |
lolpcc | 1:6877bb99aa17 | 58 | case '/' : |
lolpcc | 1:6877bb99aa17 | 59 | var[v] = val1 / val2; |
lolpcc | 1:6877bb99aa17 | 60 | break; |
lolpcc | 1:6877bb99aa17 | 61 | case '*' : |
lolpcc | 1:6877bb99aa17 | 62 | var[v] = val1 * val2; |
lolpcc | 1:6877bb99aa17 | 63 | break; |
lolpcc | 1:6877bb99aa17 | 64 | case '%' : |
lolpcc | 1:6877bb99aa17 | 65 | var[v] = val1 * val2; |
lolpcc | 1:6877bb99aa17 | 66 | break; |
lolpcc | 1:6877bb99aa17 | 67 | default : |
lolpcc | 1:6877bb99aa17 | 68 | var_exec_error(VAR_SUM_TYPE_ERROR); |
lolpcc | 1:6877bb99aa17 | 69 | } |
lolpcc | 1:6877bb99aa17 | 70 | } |
lolpcc | 1:6877bb99aa17 | 71 | } else |
lolpcc | 1:6877bb99aa17 | 72 | var_exec_error(VAR_EXEC_ERROR); |
lolpcc | 1:6877bb99aa17 | 73 | } |
lolpcc | 1:6877bb99aa17 | 74 | void point_var(int c, char **a) |
lolpcc | 1:6877bb99aa17 | 75 | { |
lolpcc | 1:6877bb99aa17 | 76 | int v; |
lolpcc | 1:6877bb99aa17 | 77 | if(sys_state & EXEC_CALLED){ |
lolpcc | 1:6877bb99aa17 | 78 | v = return_jmp(a[1]); |
lolpcc | 1:6877bb99aa17 | 79 | jmp[v] = ftell(exec_fp); /* Read the current file pointers position */ |
lolpcc | 1:6877bb99aa17 | 80 | sys_state = sys_state | INDENT_SET; /* Mark the state as set */ |
lolpcc | 1:6877bb99aa17 | 81 | } else |
lolpcc | 1:6877bb99aa17 | 82 | var_exec_error(VAR_EXEC_ERROR); |
lolpcc | 1:6877bb99aa17 | 83 | } |
lolpcc | 1:6877bb99aa17 | 84 | void tst_var(int c, char **a) |
lolpcc | 1:6877bb99aa17 | 85 | { |
lolpcc | 1:6877bb99aa17 | 86 | int v,val,j; |
lolpcc | 1:6877bb99aa17 | 87 | int doit=0; |
lolpcc | 1:6877bb99aa17 | 88 | |
lolpcc | 1:6877bb99aa17 | 89 | if(sys_state & EXEC_CALLED){ |
lolpcc | 1:6877bb99aa17 | 90 | if(sys_state & INDENT_SET){ |
lolpcc | 1:6877bb99aa17 | 91 | if(c != 5) |
lolpcc | 1:6877bb99aa17 | 92 | var_exec_error(VAR_TST_CNT_ERROR); |
lolpcc | 1:6877bb99aa17 | 93 | else { |
lolpcc | 1:6877bb99aa17 | 94 | v = return_var(a[1]); |
lolpcc | 1:6877bb99aa17 | 95 | j = return_jmp(a[4]); |
lolpcc | 1:6877bb99aa17 | 96 | val = htoi(a[3]); |
lolpcc | 1:6877bb99aa17 | 97 | switch(a[2][0]){ |
lolpcc | 1:6877bb99aa17 | 98 | case '<' : |
lolpcc | 1:6877bb99aa17 | 99 | if(var[v] < val) |
lolpcc | 1:6877bb99aa17 | 100 | doit = 1; |
lolpcc | 1:6877bb99aa17 | 101 | break; |
lolpcc | 1:6877bb99aa17 | 102 | case '>' : |
lolpcc | 1:6877bb99aa17 | 103 | if(var[v] > val) |
lolpcc | 1:6877bb99aa17 | 104 | doit = 1; |
lolpcc | 1:6877bb99aa17 | 105 | break; |
lolpcc | 1:6877bb99aa17 | 106 | case '=' : |
lolpcc | 1:6877bb99aa17 | 107 | if(var[v] == val) |
lolpcc | 1:6877bb99aa17 | 108 | doit = 1; |
lolpcc | 1:6877bb99aa17 | 109 | break; |
lolpcc | 1:6877bb99aa17 | 110 | case '!' : |
lolpcc | 1:6877bb99aa17 | 111 | if(var[v] != val) |
lolpcc | 1:6877bb99aa17 | 112 | doit = 1; |
lolpcc | 1:6877bb99aa17 | 113 | break; |
lolpcc | 1:6877bb99aa17 | 114 | default : |
lolpcc | 1:6877bb99aa17 | 115 | var_exec_error(VAR_TST_TYPE_ERROR); |
lolpcc | 1:6877bb99aa17 | 116 | } |
lolpcc | 1:6877bb99aa17 | 117 | if(doit) |
lolpcc | 1:6877bb99aa17 | 118 | fseek (exec_fp ,jmp[j] , SEEK_SET ); |
lolpcc | 1:6877bb99aa17 | 119 | } |
lolpcc | 1:6877bb99aa17 | 120 | } else |
lolpcc | 1:6877bb99aa17 | 121 | var_exec_error(VAR_INDENT_ERROR); |
lolpcc | 1:6877bb99aa17 | 122 | } else |
lolpcc | 1:6877bb99aa17 | 123 | var_exec_error(VAR_EXEC_ERROR); |
lolpcc | 1:6877bb99aa17 | 124 | } |
lolpcc | 1:6877bb99aa17 | 125 | void clr_var(int c, char **a) |
lolpcc | 1:6877bb99aa17 | 126 | { |
lolpcc | 1:6877bb99aa17 | 127 | if(sys_state & EXEC_CALLED){ |
lolpcc | 1:6877bb99aa17 | 128 | clear_var(); |
lolpcc | 1:6877bb99aa17 | 129 | } else |
lolpcc | 1:6877bb99aa17 | 130 | var_exec_error(VAR_EXEC_ERROR); |
lolpcc | 1:6877bb99aa17 | 131 | } |
lolpcc | 1:6877bb99aa17 | 132 | void var_exec_error(int state) |
lolpcc | 1:6877bb99aa17 | 133 | { |
lolpcc | 1:6877bb99aa17 | 134 | switch(state){ |
lolpcc | 1:6877bb99aa17 | 135 | case VAR_EXEC_ERROR : |
lolpcc | 1:6877bb99aa17 | 136 | lprintf("Can only be called from an exec call\n"); |
lolpcc | 1:6877bb99aa17 | 137 | break; |
lolpcc | 1:6877bb99aa17 | 138 | case VAR_SET_CNT_ERROR : |
lolpcc | 1:6877bb99aa17 | 139 | lprintf("Format: set v<num> <value>\n"); |
lolpcc | 1:6877bb99aa17 | 140 | break; |
lolpcc | 1:6877bb99aa17 | 141 | case VAR_SUM_CNT_ERROR : |
lolpcc | 1:6877bb99aa17 | 142 | lprintf("Format: sum v<num> <action> v<num>\n"); |
lolpcc | 1:6877bb99aa17 | 143 | break; |
lolpcc | 1:6877bb99aa17 | 144 | case VAR_TST_CNT_ERROR : |
lolpcc | 1:6877bb99aa17 | 145 | lprintf("Format: tst v<num> <type> <value>\n"); |
lolpcc | 1:6877bb99aa17 | 146 | break; |
lolpcc | 1:6877bb99aa17 | 147 | case VAR_INDENT_ERROR : |
lolpcc | 1:6877bb99aa17 | 148 | lprintf("In branch test, with no point to loop back to\n"); |
lolpcc | 1:6877bb99aa17 | 149 | break; |
lolpcc | 1:6877bb99aa17 | 150 | case VAR_SUM_TYPE_ERROR : |
lolpcc | 1:6877bb99aa17 | 151 | lprintf("Unknown test type should be either +-/*\n"); |
lolpcc | 1:6877bb99aa17 | 152 | break; |
lolpcc | 1:6877bb99aa17 | 153 | case VAR_TST_TYPE_ERROR : |
lolpcc | 1:6877bb99aa17 | 154 | lprintf("Unknown test type should be either <>=!\n"); |
lolpcc | 1:6877bb99aa17 | 155 | break; |
lolpcc | 1:6877bb99aa17 | 156 | default : |
lolpcc | 1:6877bb99aa17 | 157 | lprintf("Unknown exec_error %04x\n",state); |
lolpcc | 1:6877bb99aa17 | 158 | } |
lolpcc | 1:6877bb99aa17 | 159 | } |
lolpcc | 1:6877bb99aa17 | 160 | |
lolpcc | 1:6877bb99aa17 | 161 | int return_jmp(char *str) |
lolpcc | 1:6877bb99aa17 | 162 | { |
lolpcc | 1:6877bb99aa17 | 163 | char buf[0x4]; |
lolpcc | 1:6877bb99aa17 | 164 | int a; |
lolpcc | 1:6877bb99aa17 | 165 | |
lolpcc | 1:6877bb99aa17 | 166 | buf[0] = str[1]; |
lolpcc | 1:6877bb99aa17 | 167 | buf[1] = str[2]; |
lolpcc | 1:6877bb99aa17 | 168 | buf[2] = str[3]; |
lolpcc | 1:6877bb99aa17 | 169 | buf[3] = str[4]; |
lolpcc | 1:6877bb99aa17 | 170 | a = atoi(buf); |
lolpcc | 1:6877bb99aa17 | 171 | if(a > MAX_VAR){ |
lolpcc | 1:6877bb99aa17 | 172 | lprintf("In Return_jmp, jmp number %d more than MAXJMP %d, returned -1\n", |
lolpcc | 1:6877bb99aa17 | 173 | a,MAX_JMP); |
lolpcc | 1:6877bb99aa17 | 174 | return(-1); |
lolpcc | 1:6877bb99aa17 | 175 | } |
lolpcc | 1:6877bb99aa17 | 176 | return(a); |
lolpcc | 1:6877bb99aa17 | 177 | } |
lolpcc | 1:6877bb99aa17 | 178 |