rendered paste body// -------------------------------------------------------------------------------------------------------------------------------------
// Funcion: AllenVM_CPU_COND_SWITCH();
// Proposito: Definir una condicion switch.
// Devuelve: 0 si sus sentencias no se ejecutan / N si sentencia ejecutada.
// -------------------------------------------------------------------------------------------------------------------------------------
static int AllenVM_CPU_COND_SWITCH(struct AllenInterp *i, int argc, char **argv, void *pd) {
if(argc < 3) return AllenVM_CPU_Error(i,argv[0]); // Comprobamos parametros.
if(argc % 2) return AllenVM_CPU_Error(i,argv[0]); // Comprobamos parametros pares.
register int c,p; float r=0; char *buf1,*buf2; // Declaramos variables.
for(p=2;p<argc;p+=2) { // Buscamos resultados.
if((c = AllenVM_InterpEval(i,argv[1])) != Allen_VM_OK) return c; // Comprobamos la operacion primaria.
buf1=strdup(i->result); // Almacenamos resultado en el buffer 1.
if((c = AllenVM_InterpEval(i,argv[p])) != Allen_VM_OK) return c; // Comprobamos la operacion secundaria.
buf2=strdup(i->result); // Almacenamos resultado en el buffer 2.
if(!strcmp(buf1,buf2)) { // Si el resultado es el que buscamos:
if((c = AllenVM_InterpEval(i,argv[p+1])) != Allen_VM_OK) return c; r=p/2; } // Evaluamos las sentencias y definimos.
free(buf1); free(buf2); // Liberamos la memoria de ambos buffers.
}
char buf[TCOND_BSIZE]; // Creamos buffer.
snprintf(buf,TCOND_BSIZE,"%f", r); // Copiamos al buffer.
AllenVM_InterpSetResult(i,buf); // Devolvemos 0/N segun sentencias ejecutadas.
return Allen_VM_OK; // Devolvemos resultado.
}