/* SIMULACION DE UN GDB */
#include <stdio.h>
#include <stdlib.h>
#include <alloc.h>
#include <string.h>
#include <ctype.h>
struct datos
{
char comando[80];
char valor[80];
struct datos *sig;
};
struct stack
{
struct datos *pos;
struct stack *sig;
};
struct datos *inicio;
struct datos *puntero;
struct stack *ini_stack;
void gdb(void);
void gdb_run(void);
void gdb_step(void);
void gdb_next(void);
void gdb_print(char []);
void lee_datos(char []);
char *substr(int , char *);
void procesa(char []);
void muestra(void);
void print(void);
void scan(char []);
void call(char []);
void move(char []);
void rs_subr(void);
void condicion(char []);
void salta(char []);
void mult(char []);
void add(char []);
void push(void);
void pop(void);
struct datos *busca(char []);
/*int main(int argc, char *argv[])
{
inicio = NULL;
ini_stack = NULL;
puntero = NULL;
if (argc != 2)
{ printf ("\nuso: com archivo.ok\n:-)\n"); return 1; }
lee_datos(argv[1]);
*/
int main(void)
{
inicio = NULL;
ini_stack = NULL;
puntero = NULL;
lee_datos("pseudo.ok");
printf("\n\n\n");
printf("__________________________________________\n");
printf(" mini gdb\n");
printf(" Comandos reconocidos:\n");
printf(" <r> run\n");
printf(" <s> step\n");
printf(" <n> next\n");
printf(" <p> print\n");
printf(" <q> quit\n");
printf("__________________________________________\n");
gdb();
printf("\n:-)\n");
return 1;
}
void lee_datos(char archivo[])
{
struct datos *act = NULL;
struct datos *ant = NULL;
char linea[80];
FILE *in;
if ((in = fopen(archivo,"rt")) == NULL) // archivo de entrada
{ printf("No se puede abrir el archivo"); return; }
while (1)
{
fgets(linea, 80, in);
if(strncmp(linea,"ok",2) == 0) break;
if(strncmp(linea,"va",2) == 0)
{
fgets(linea, 80, in);
strcpy(ant->valor, linea);
continue;
}
act = (struct datos *)malloc(sizeof(struct datos));
strcpy(act->comando, linea);
strcpy(act->valor, "");
act->sig = NULL;
if(!inicio) { ant = act; inicio = act; }
else { ant->sig = act; ant = act; }
}
fclose(in);
}
/*
------------------------------------------------------------------------
void lee_datos(char archivo[])
{
struct datos *act = NULL;
struct datos *ant = NULL;
char linea[80];
FILE *in;
if ((in = fopen(archivo,"rt")) == NULL) // archivo de entrada
{ printf("No se puede abrir el archivo"); return; }
while (1)
{
fgets(linea, 80, in);
if( strncmp(linea,"ok",2) == 0) break;
act = (struct datos *)malloc(sizeof(struct datos));
strcpy(act->comando, linea);
strcpy(act->valor, "");
act->sig = NULL;
if(!inicio) { ant = act; inicio = act; }
else { ant->sig = act; ant = act; }
}
fclose(in);
}
----------------------------------------------------------------------
*/
void gdb(void)
{
char run,quit;
char print[80], car[80];
run = print[0] = quit = car[0] = '\0';
while(quit != 'q')
{
printf("\n8-) ");
if (!puntero) run = '\0';
gets(car);
switch (car[0])
{
case 'r': run = 'r'; gdb_run(); break;
else { gdb_step(); }
break;
else { gdb_next(); }
break;
else { strcpy(print,car); gdb_print(print); }
break;
case 'q': quit = 'q'; break;
}
}
}
void gdb_run(void)
{
struct datos *copia = inicio;
char *control= NULL;
control = (char *)malloc(80);
while(copia)
{
if(strncmp(copia->comando, "fu",2)==0)
{
control = substr(2, copia->comando);
if(strncmp(control,"main",4)==0)
{ puntero = copia; return; }
}
copia = copia->sig;
}
printf("==>No existe la funcion main<==");
}
void gdb_step(void)
{
procesa(puntero->comando);
if(strncmp(puntero->comando,"pr",2) != 0)
printf("\n===> %s",puntero->comando);
}
void gdb_next(void)
{
puntero = puntero->sig; procesa(puntero->comando);
printf("===> %s\n",puntero->comando);
}
void gdb_print(char variable[])
{
struct datos *copia = inicio;
char *var= NULL, *control= NULL;
var = (char *)malloc(80);
control = (char *)malloc(80);
var = substr(2,variable);
while(copia)
{
if(strncmp(copia->comando, "vl",2)==0 ||
strncmp(copia->comando, "vg",2)==0
)
{
control = substr(2, copia->comando);
if(strncmp(control,var,strlen(control))==0)
{ printf(" %s",copia->valor); return; }
}
copia = copia->sig;
}
printf("==>No existe la variable<==");
}
char *substr(int n, char *string) // devuelve palabra n de string
{
char ch = string[0], car[1], ret[80], *cadena;
cadena = (char *)malloc(80);
cadena=strdup(string);
while(n>1)
{ while (ch != ' ') { cadena++; ch = cadena[0]; } // busca posicion
cadena = cadena++; ch = cadena[0]; n--;
}
ch = cadena[0]; ret[0] = '\0';
while (ch != ' ' && ch != '\0' && ch != '\n' && ch != ';') // busca finalizador
{ car[0] = ch; car[1] = '\0'; strcat(ret, car);
cadena++; ch = cadena[0];
}
return strdup(ret);
}
void procesa(char cad[])
{
if(strncmp(cad,"etiq",4)==0) { puntero = puntero->sig; return; }
if(strncmp(cad,"vl",2)==0) { puntero = puntero->sig; return; }
if(strncmp(cad,"vg",2)==0) { puntero = puntero->sig; return; }
if(strncmp(cad,"fu",2)==0) { puntero = puntero->sig; return; }
if(strncmp(cad,"rt",2)==0) { puntero = puntero->sig; return; }
if(strncmp(cad,"pa",2)==0) { puntero = puntero->sig; return; }
if(strncmp(cad,"va",2)==0) { puntero = puntero->sig; return; }
if(strncmp(cad,"pr",2)==0) { print(); return; }
if(strncmp(cad,"ff",2)==0) { puntero = puntero->sig; return; }
if(strncmp(cad,"sc",2)==0) { puntero = puntero->sig; scan(cad); return; }
if(strncmp(cad,"ca",2)==0) { call(cad); return; }
if(strncmp(cad,"mv",2)==0) { puntero = puntero->sig; move(cad); return; }
if(strncmp(cad,"rs",2)==0) { rs_subr(); return; }
if(strncmp(cad,"i le",4)==0) { condicion(cad); return; }
if(strncmp(cad,"sa",2)==0) { salta(cad); return; }
if(strncmp(cad,"mu",2)==0) { puntero = puntero->sig; mult(cad); return; }
if(strncmp(cad,"ad",2)==0) { puntero = puntero->sig; add(cad); return; }
puntero = puntero->sig; return;
}
void add(char *cad)
{
char *dato1, *dato2;
char num1[5],num2[5];
struct datos *nuevo = NULL;
struct datos *factor = NULL;
int respuesta;
dato1 = substr(2,cad);
dato2 = substr(3,cad);
nuevo = busca(dato1);
sprintf(num1,"%s",nuevo->valor);
if (isdigit(dato2[0]))
sprintf(num2,"%s",dato2);
else
{
factor = busca(dato2);
sprintf(num2,"%s",factor->valor);
}
respuesta = atoi(num1) + atoi(num2);
sprintf(nuevo->valor,"%d",respuesta);
}
void mult(char *cad)
{
char *dato1, *dato2;
char num1[5],num2[5];
struct datos *nuevo = NULL;
struct datos *factor = NULL;
int respuesta;
dato1 = substr(2,cad);
dato2 = substr(3,cad);
nuevo = busca(dato1);
sprintf(num1,"%s",nuevo->valor);
if (isdigit(dato2[0]))
sprintf(num2,"%s",dato2);
else
{
factor = busca(dato2);
sprintf(num2,"%s",factor->valor);
}
respuesta = atoi(num1) * atoi(num2);
sprintf(nuevo->valor,"%d",respuesta);
}
void salta(char *cad)
{
struct datos *copia = inicio;
char *salto;
salto = (char *)malloc(strlen(cad)+1);
strcpy(salto, cad);
salto++; salto++; salto++; /* quitar sa y espacio */
while(copia)
{
if(strncmp(copia->comando,salto,strlen(salto))==0)
{ puntero = copia; return; }
copia = copia->sig;
}
}
void condicion(char *cad)
{
char *dato1, *oper, *dato2;
char num1[5],num2[5];
struct datos *dato = NULL;
int respuesta;
dato1 = (char *)malloc(10);
oper = (char *)malloc(10);
dato2 = (char *)malloc(10);
dato1 = substr(1,cad);
oper = substr(2,cad);
dato2 = substr(3,cad);
if (isdigit(dato1[0]))
sprintf(num1,"%s",dato1);
else
{
dato = busca(dato1);
sprintf(num1,"%s",dato->valor);
}
if (isdigit(dato2[0]))
sprintf(num2,"%s",dato2);
else
{
dato = busca(dato2);
sprintf(num2,"%s",dato->valor);
}
if (strncmp(oper,"ne",2)==0) respuesta = atoi(num1) != atoi(num2);
if (strncmp(oper,"me",2)==0) respuesta = atoi(num1) < atoi(num2);
if (strncmp(oper,"ma",2)==0) respuesta = atoi(num1) > atoi(num2);
if (strncmp(oper,"id",2)==0) respuesta = atoi(num1) == atoi(num2);
if (strncmp(oper,"gi",2)==0) respuesta = atoi(num1) >= atoi(num2);
if (strncmp(oper,"le",2)==0) respuesta = atoi(num1) <= atoi(num2);
puntero = puntero->sig;
if(respuesta) puntero = puntero->sig;
}
void rs_subr(void)
{ pop(); }
void move(char *cad)
{
struct datos *dato1 = NULL;
struct datos *dato2 = NULL;
char num1[5],num2[5];
cad++; cad++; cad++; /* quitar mv y espacio */
if (isdigit(cad[0]))
{
sprintf(num1,"%s",substr(1,cad));
dato2 = busca(substr(2,cad));
strcpy(dato2->valor,num1);
return;
}
else
{
dato1 = busca(substr(1,cad));
dato2 = busca(substr(2,cad));
strcpy(dato2->valor,dato1->valor);
return;
}
}
struct datos *busca(char cad[])
{
struct datos *copia = inicio;
char *control= NULL;
control = (char *)malloc(80);
while(copia)
{
if(strncmp(copia->comando, "vl",2)==0 ||
strncmp(copia->comando, "vg",2)==0
)
{
control = substr(2, copia->comando);
if(strncmp(control,cad,strlen(control))==0)
{ return copia; }
}
copia = copia->sig;
}
printf("==>No existe la variable<==");
return NULL;
}
void call(char *cad)
{
struct datos *copia = inicio;
char *control= NULL;
push();
control = (char *)malloc(80);
cad++; cad++; cad++; /* quitar ca y espacio */
while(copia)
{
if(strncmp(copia->comando, "fu",2)==0)
{
control = substr(2, copia->comando);
if(strncmp(control,cad,strlen(control))==0)
{ puntero = copia; return; }
}
copia = copia->sig;
}
printf("==>No existe la funcion<==");
}
void scan(char *cad)
{
char valor[80];
struct datos *dato = NULL;
gets(valor);
cad++; cad++; cad++; /* quitar sc y espacio */
dato = busca(cad);
if(dato) strcpy(dato->valor, valor);
else printf("==>No existe la variable<==");
}
void print(void) /* rutina del printf */
{
char cadena[80], *copia=NULL;
char car[2];
cadena[0] = '\0';
copia = (char *)malloc(80);
while(strncmp(puntero->comando,"pr",2)==0)
{
cadena[0] = '\0';
sprintf(copia,"%s",substr(2,puntero->comando));
if(copia[0] == '\"')
{
copia++;
while(copia[0] != '\"')
{
car[0] = copia[0]; car[1] = '\0';
strcat(cadena,car);
copia++;
}
printf("%s ",cadena);
}
else
if (strncmp(copia,"f_",2)==0) printf("\n");
else gdb_print(puntero->comando);
puntero = puntero->sig;
}
}
void push(void)
{
struct stack *act;
act = (struct stack *)malloc(sizeof(struct stack));
puntero = puntero->sig;
act->pos = puntero;
act->sig = NULL;
if(!ini_stack) ini_stack = act;
else { act->sig = ini_stack; ini_stack = act; }
}
void pop(void)
{
if(ini_stack)
{
puntero = ini_stack->pos;
ini_stack = ini_stack->sig;
}
if(strncmp(puntero->comando,"fu",2)==0)
/* se termina la ejecucion del programa */
puntero = NULL;
if(strncmp(puntero->comando,"rs",2)==0)
/* se termina la ejecucion del programa */
puntero = NULL;
}