/* 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; }