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
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