Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
scripting.c
00001 #include "mbed.h" 00002 #include "local_defines.h" 00003 #include "useful.h" 00004 #include "scripting.h" 00005 00006 extern int var[MAX_VAR]; 00007 extern int sys_state; 00008 extern FILE *exec_fp; 00009 00010 long jmp[MAX_JMP]; /* Jump points */ 00011 00012 void clear_var(void) 00013 { 00014 int a = 0; 00015 00016 while(a != MAX_VAR){ 00017 var[a] = 0; 00018 a++; 00019 } 00020 } 00021 00022 void set_var(int c, char **a) 00023 { 00024 int v,val; 00025 00026 if(sys_state & EXEC_CALLED){ 00027 if(c != 3) 00028 var_exec_error(VAR_SET_CNT_ERROR); 00029 else { 00030 v = return_var(a[1]); 00031 val = htoi(a[2]); 00032 var[v]=val; 00033 } 00034 00035 } else 00036 var_exec_error(VAR_EXEC_ERROR); 00037 00038 } 00039 00040 void sum_var(int c, char **a) 00041 { 00042 int v,val1,val2; 00043 00044 if(sys_state & EXEC_CALLED){ 00045 if(c != 4) 00046 var_exec_error(VAR_SUM_CNT_ERROR); 00047 else { 00048 val1 = htoi(a[1]); 00049 val2 = htoi(a[3]); 00050 v = return_var(a[1]); 00051 switch(a[2][0]){ 00052 case '+' : 00053 var[v] = val1 + val2; 00054 break; 00055 case '-' : 00056 var[v] = val1 - val2; 00057 break; 00058 case '/' : 00059 var[v] = val1 / val2; 00060 break; 00061 case '*' : 00062 var[v] = val1 * val2; 00063 break; 00064 case '%' : 00065 var[v] = val1 * val2; 00066 break; 00067 default : 00068 var_exec_error(VAR_SUM_TYPE_ERROR); 00069 } 00070 } 00071 } else 00072 var_exec_error(VAR_EXEC_ERROR); 00073 } 00074 void point_var(int c, char **a) 00075 { 00076 int v; 00077 if(sys_state & EXEC_CALLED){ 00078 v = return_jmp(a[1]); 00079 jmp[v] = ftell(exec_fp); /* Read the current file pointers position */ 00080 sys_state = sys_state | INDENT_SET; /* Mark the state as set */ 00081 } else 00082 var_exec_error(VAR_EXEC_ERROR); 00083 } 00084 void tst_var(int c, char **a) 00085 { 00086 int v,val,j; 00087 int doit=0; 00088 00089 if(sys_state & EXEC_CALLED){ 00090 if(sys_state & INDENT_SET){ 00091 if(c != 5) 00092 var_exec_error(VAR_TST_CNT_ERROR); 00093 else { 00094 v = return_var(a[1]); 00095 j = return_jmp(a[4]); 00096 val = htoi(a[3]); 00097 switch(a[2][0]){ 00098 case '<' : 00099 if(var[v] < val) 00100 doit = 1; 00101 break; 00102 case '>' : 00103 if(var[v] > val) 00104 doit = 1; 00105 break; 00106 case '=' : 00107 if(var[v] == val) 00108 doit = 1; 00109 break; 00110 case '!' : 00111 if(var[v] != val) 00112 doit = 1; 00113 break; 00114 default : 00115 var_exec_error(VAR_TST_TYPE_ERROR); 00116 } 00117 if(doit) 00118 fseek (exec_fp ,jmp[j] , SEEK_SET ); 00119 } 00120 } else 00121 var_exec_error(VAR_INDENT_ERROR); 00122 } else 00123 var_exec_error(VAR_EXEC_ERROR); 00124 } 00125 void clr_var(int c, char **a) 00126 { 00127 if(sys_state & EXEC_CALLED){ 00128 clear_var(); 00129 } else 00130 var_exec_error(VAR_EXEC_ERROR); 00131 } 00132 void var_exec_error(int state) 00133 { 00134 switch(state){ 00135 case VAR_EXEC_ERROR : 00136 lprintf("Can only be called from an exec call\n"); 00137 break; 00138 case VAR_SET_CNT_ERROR : 00139 lprintf("Format: set v<num> <value>\n"); 00140 break; 00141 case VAR_SUM_CNT_ERROR : 00142 lprintf("Format: sum v<num> <action> v<num>\n"); 00143 break; 00144 case VAR_TST_CNT_ERROR : 00145 lprintf("Format: tst v<num> <type> <value>\n"); 00146 break; 00147 case VAR_INDENT_ERROR : 00148 lprintf("In branch test, with no point to loop back to\n"); 00149 break; 00150 case VAR_SUM_TYPE_ERROR : 00151 lprintf("Unknown test type should be either +-/*\n"); 00152 break; 00153 case VAR_TST_TYPE_ERROR : 00154 lprintf("Unknown test type should be either <>=!\n"); 00155 break; 00156 default : 00157 lprintf("Unknown exec_error %04x\n",state); 00158 } 00159 } 00160 00161 int return_jmp(char *str) 00162 { 00163 char buf[0x4]; 00164 int a; 00165 00166 buf[0] = str[1]; 00167 buf[1] = str[2]; 00168 buf[2] = str[3]; 00169 buf[3] = str[4]; 00170 a = atoi(buf); 00171 if(a > MAX_VAR){ 00172 lprintf("In Return_jmp, jmp number %d more than MAXJMP %d, returned -1\n", 00173 a,MAX_JMP); 00174 return(-1); 00175 } 00176 return(a); 00177 }
Generated on Mon Jul 18 2022 01:14:06 by
1.7.2