Saludos, tengo un problema con el siguiente codigo que creo que ya habia posteado antes, pero lo que pasa es que de repente la pantalla se me congelo y cuando reinicie la maquina ya no tenia codigo, se me borro todo y ahora estoy empezandolo a hacer de nuevo todo, el codigo me lee de un archivo todos los codigos de operacion y me hace una lista simplemente ligada, esto si funciona bien, pero a la hora de que le pido que busque un codigo de operacion en la lista siempre me imprime que no lo encuentra, y no entiendo por que? si alguien me pudiera ayudar se lo agradeceria mucho
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LONG_ETIQUETA 8
#define LONG_CODOP 5
#define COMENTARIO ';'
#define TABULADOR '\t'
#define ESPACIOS_ ' '
#define MAX 8
typedef enum {FALSO,VERDADERO} booleano;
typedef enum {ETIQUETA,CODOP,OPERANDO} linea;
typedef struct nodo
{
char *instruccion;
struct nodo *sig;
}COD;
void imprimirLista(COD *cabeza);
int verificarCombinacion(FILE *fd);
booleano esComentario(FILE *fd);
char *Etiqueta_Codop_Operando(FILE *fd,int linea);
void ultimaLinea(char *codop);
void buscarFinLinea(FILE *fd);
void ignorarEspacios(FILE *fd);
void listaTABOP(COD **cabeza);
COD *ultimoElemento(COD **cabeza);
COD *crearNodo(char *ins);
void insertarFinal(char *ins,COD *ultimo);
char *Tabla_Operandos(FILE *hc12);
COD *buscarCodop(COD *cabeza,char *codop);
void quitarSaltosLinea(char *cadena);
booleano esNumero(char caracter);
booleano esLetra(char caracter);
int main()
{
FILE *fd;
int car,combinacion;
COD *cabeza = NULL,*encontrado = NULL;
char *etiqueta,*codop,*operando;
listaTABOP(&cabeza);
//imprimirLista(cabeza);
if((fd = fopen("ejemplo_errores.txt","r"))!= NULL)
{
while((car = fgetc(fd))!= EOF)
{
switch(car)
{
case COMENTARIO:
if(esComentario(fd))
printf("COMENTARIO\n\n");
else
buscarFinLinea(fd);
break;
case ESPACIOS_:
case TABULADOR:
etiqueta = "null";
printf("ETIQUETA = %s\n",etiqueta);
ignorarEspacios(fd);
codop = Etiqueta_Codop_Operando(fd,CODOP);
printf("CODOP = %s\n",codop);
erroresCodop(codop);
combinacion = verificarCombinacion(fd);
if(combinacion == 2)
{
operando = "null";
printf("OPERANDO = %s\n\n",operando);
}
else
{
ignorarEspacios(fd);
operando = Etiqueta_Codop_Operando(fd,OPERANDO);
printf("OPERANDO = %s\n\n",operando);
}
break;
default:
etiqueta = Etiqueta_Codop_Operando(fd,ETIQUETA);
printf("ETIQUETA = %s\n",etiqueta);
erroresEtiqueta(etiqueta);
combinacion = verificarCombinacion(fd);
if(combinacion == 2)
{
codop = "null";
printf("CODOP = %s\n",codop);
erroresCodop(codop);
operando = "null";
printf("OPERANDO = %s\n\n",operando);
}
else
{
ignorarEspacios(fd);
codop = Etiqueta_Codop_Operando(fd,CODOP);
printf("CODOP = %s\n",codop);
erroresCodop(codop);
combinacion = verificarCombinacion(fd);
if(combinacion == 2)
{
operando = "null";
printf("OPERANDO = %s\n\n",operando);
}
else
{
ignorarEspacios(fd);
operando = Etiqueta_Codop_Operando(fd,OPERANDO);
printf("OPERANDO = %s\n\n",operando);
}
}
break;
}
if((encontrado = buscarCodop(cabeza,codop)) == NULL)
printf("NO SE ENCONTRO EL CODOP DE OPERACION\n");
}
ultimaLinea(codop);
}
else
printf("No se pudo abrir el archivo");
return 0;
}
booleano esComentario(FILE *fd)
{
int car;
while((car = fgetc(fd))!= '\n')
{
if(car == ';')
return 0;
}
return 1;
}
void buscarFinLinea(FILE *fd)
{
int car;
while((car = fgetc(fd))!= '\n')
;
}
void ignorarEspacios(FILE *fd)
{
int car;
do
{
car = fgetc(fd);
}while(car == '\t' || car == ' ');
}
int verificarCombinacion(FILE *fd)
{
int car,combinacion;
fseek(fd,-1,SEEK_CUR);
if((car = fgetc(fd))== '\n')
combinacion = 2;
else
combinacion = 1;
return combinacion;
}
booleano esLetra(char caracter)
{
if((caracter >= 'A' && caracter <= 'Z')||(caracter >= 'a' && caracter <= 'z'))
return 1;
else
return 0;
}
booleano esNumero(char caracter)
{
if(caracter >= '0' && caracter <= '9')
return 1;
else
return 0;
}
char *Etiqueta_Codop_Operando(FILE *fd,int linea)
{
int car,lon = 0,pos;
char *cadena,*ptr;
fseek(fd,-1,SEEK_CUR);
pos = ftell(fd);
if((linea == ETIQUETA)||(linea == CODOP))
{
do
{
car = fgetc(fd);
lon++;
}while(car != '\t' && car != ' ' && car != '\n');
}
else
{
do
{
car = fgetc(fd);
lon++;
}while(car != '\n');
}
cadena = (char*)calloc((lon+1),sizeof(char));
fseek(fd,pos,SEEK_SET);
fgets(cadena,lon+1,fd);
if(((ptr=strchr(cadena,'\n'))!=NULL)||((ptr=strchr(cadena,'\t'))!=NULL)||((ptr=strchr(cadena,' '))!=NULL))
*ptr = '\0';
return cadena;
}
void ultimaLinea(char *codop)
{
if((strcmp(codop,"end")) != 0)
printf("Error:No se encontro el END.\n");
}
void quitarSaltosLinea(char *cadena)
{
char *ptr;
if(((ptr=strchr(cadena,'\n'))!=NULL)||((ptr=strchr(cadena,'\t'))!=NULL)||((ptr=strchr(cadena,' '))!=NULL))
*ptr = '\0';
}
void listaTABOP(COD **cabeza)
{
int car;
FILE *hc12;
COD *ultimo = NULL;
char *ins;
if((hc12 = fopen("Tabla_OP.txt","r"))!= NULL)
{
while((car = fgetc(hc12))!= EOF)
{
if(car != '\t')
{
ins = Tabla_Operandos(hc12);
buscarFinLinea(hc12);
if(*cabeza == NULL)
*cabeza = crearNodo(ins);
else
{
ultimo = ultimoElemento(cabeza);
insertarFinal(ins,ultimo);
}
}
else
buscarFinLinea(hc12);
}
}
else
printf("No se pudo abrir el archivo");
}
COD *ultimoElemento(COD **cabeza)
{
COD *ptr;
ptr = *cabeza;
while(ptr->sig != NULL)
ptr = ptr->sig;
return ptr;
}
char *Tabla_Operandos(FILE *hc12)
{
int car,lon = 0,pos;
char *cadena;
fseek(hc12,-1,SEEK_CUR);
pos = ftell(hc12);
do
{
car = fgetc(hc12);
lon++;
}while(car != '\t');
fseek(hc12,pos,SEEK_SET);
cadena = calloc((lon+1));
fgets(cadena,lon+1,hc12);
quitarSaltosLinea(cadena);
return cadena;
}
COD *buscarCodop(COD *cabeza,char *codop)
{
COD *ptr;
for(ptr = cabeza;ptr != NULL;ptr = ptr->sig)
{
if(ptr->instruccion == codop)
return ptr;
}
return NULL;
}
void insertarFinal(char *ins,COD *ultimo)
{
ultimo->sig = crearNodo(ins);
ultimo->sig->sig = NULL;
ultimo = ultimo->sig;
}
COD *crearNodo(char *ins)
{
int tam;
COD *x;
x = (COD*)malloc(sizeof(COD));
tam = strlen(ins);
x->instruccion = malloc(tam);
strcpy(x->instruccion,ins);
x->sig = NULL;
return x;
}