Never been to DZone Snippets before?

Snippets is a public source code repository. Easily build up your personal collection of code snippets, categorize them with tags / keywords, and share them with the world

« Newer Snippets
Older Snippets »
Showing 1-1 of 1 total  RSS 

Ejemplo en C de un motor de scripting o maquina virtual

El codigo es una implementacion de un lenguaje de scripting sin lenguaje, por lo tanto queda limitado a la interpretacion de codigos por lo que se parece mas a una maquina virtual

   1  
   2  #include <stdio.h>
   3  
   4  
   5  typedef struct _operation{
   6          unsigned int op;
   7          int arg1;
   8          int arg2;
   9          int arg3;
  10  } operation;
  11  
  12  typedef struct _scriptEngine{
  13          int var[255];
  14          int ip;
  15          int halt;
  16          operation code[255];        
  17  } scriptEngine;
  18  
  19  void operation_run(const operation *p, scriptEngine *s){
  20       switch (p->op){
  21              case 0: //add
  22                   s->var[p->arg1] = s->var[p->arg2]+s->var[p->arg3];
  23                   s->ip++;
  24                   printf("Realizando suma\n");
  25                   break;
  26              case 1: //sup
  27                   s->var[p->arg1] = s->var[p->arg2]-s->var[p->arg3];
  28                   s->ip++;
  29                   printf("Realizando resta\n");
  30                   break;
  31              case 3: //mul
  32                   s->var[p->arg1] = s->var[p->arg2]*s->var[p->arg3];
  33                   s->ip++;
  34                   printf("Realizando multiplicacion\n");                 
  35                   break;
  36              case 4: //div
  37                   s->var[p->arg1] = s->var[p->arg2]/s->var[p->arg3];
  38                   s->ip++;
  39                   printf("Realizando division\n");                 
  40                   break;
  41              case 5: //mod
  42                   s->var[p->arg1] = s->var[p->arg2]%s->var[p->arg3];
  43                   s->ip++;
  44                   printf("Realizando modulo\n");                 
  45                   break;
  46              case 6: //set
  47                   s->var[p->arg1] = p->arg2;
  48                   s->ip++;
  49                   printf("Realizando asignacion\n");                 
  50                   break;
  51              case 7: //halt
  52                   s->halt=1;
  53                   break;
  54              case 8: //jump
  55                   s->ip=s->var[p->arg1];
  56                   break;                 
  57              default:
  58                   break;            
  59       }
  60  
  61  }
  62  
  63  scriptEngine* scriptEngine_new(){
  64                scriptEngine *new_script;
  65                new_script = (scriptEngine*) malloc(sizeof(scriptEngine));
  66                new_script->ip=0;
  67                new_script->halt=0;              
  68                return new_script;
  69  }
  70  
  71  void scriptEngine_delete(scriptEngine *script){
  72       free(script);
  73  }
  74  
  75  
  76  void scriptEngine_run(scriptEngine *script){
  77      
  78       int j;
  79       
  80       while(script->halt==0){
  81           printf("Inicio de operacion\n");
  82           operation_run(&(script->code[script->ip]),script);
  83           printf("Estado de la maquina:\n");
  84           for (j=0;j<5;j++){
  85               printf("Posicion de la memoria %i: %i\n",j,script->var[j]);
  86           }         
  87       }     
  88  };
  89  
  90  void scriptEngine_create_example(scriptEngine *script, int example){
  91       switch (example){
  92              case 0:
  93                       script->code[0].op=6; //set
  94                       script->code[0].arg1=0;
  95                       script->code[0].arg2=10;
  96                       
  97                       script->code[1].op=6; //set
  98                       script->code[1].arg1=1;
  99                       script->code[1].arg2=20;
 100                       
 101                       script->code[2].op=0; //set
 102                       script->code[2].arg1=2;
 103                       script->code[2].arg2=0;     
 104                       script->code[2].arg3=1;    
 105                       
 106                       script->code[3].op=7;
 107                       break;
 108       }
 109  }
 110  
 111  int main(int argc, char **argv){
 112      
 113      scriptEngine* script;
 114      script = scriptEngine_new();
 115      scriptEngine_create_example(script,0);
 116      scriptEngine_run(script);
 117      scriptEngine_delete(script);
 118      
 119      system("PAUSE");
 120      return 0;    
 121  }
 122  
 123  
« Newer Snippets
Older Snippets »
Showing 1-1 of 1 total  RSS