DEBUG.CPP



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