Peter Cooper / Mbed 2 deprecated Dome

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers scripting.c Source File

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 }