/* IMPLEMENTACION DE UN EDITOR DE LINEA
BASADA EN LISTAS DOBLENTE LIGADAS
J. Rafael R. Ochoa
---------------------------------------------------------------------------*/
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
struct Ed_Line{
char text_line[80];
int num;
struct Ed_Line *sig;
struct Ed_Line *ant;
};
struct Ed_Line *pent_list;
struct Ed_Line *uent_list;
struct Ed_Line *Busca_Line(int num_line);
struct Ed_Line *almacena_deo(struct Ed_Line *i);
int Menu(), Introducir(int num_line);
void Ajustar(int num, int incr), Borrar_Line(void);
void Listar_Edline(void), Guardar_Arch(char *Nom_Arch), Cargar_Arch(char *Nom_Arch);
void Imprime_Arch(void);
main(int argc, char *argv[])
{
char num_tmp[15], name_arch[15];
int opc, num_line = 1;
struct Ed_line *tmp;
/* inicializacion de la lista */
pent_list=NULL;
uent_list=NULL;
clrscr();
/* Leer los archivos desde el prompt del sistema */
if(argc==2){
Cargar_Arch(argv[1]);
}
for(;;){
clrscr();
opc = Menu();
switch(opc){
case 1:
printf("Numero de la linea a introducir -> ");
gets(num_tmp);
num_line = atoi(num_tmp);
Introducir(num_line);
break;
case 2:
Listar_Edline();
getch();
break;
case 3:
Borrar_Line();
break;
case 4:
printf("Dame el numero de Linea a Buscar -> ");
gets(num_tmp);
num_line = atoi(num_tmp);
// tmp=Busca_Line(num_line);
// printf("%d : %s\n", tmp->num, tmp->text_line);
getch();
break;
case 5:
printf("Dame el nombre del archivo: ");
gets(name_arch);
Cargar_Arch(name_arch);
break;
case 6:
printf("Dame el nombre del archivo a Guardar: ");
gets(name_arch);
Guardar_Arch(name_arch);
break;
case 7:
Imprime_Arch();
getch();
case 8:
exit(1);
}
}
}
int Menu()
{
char num_tmp[15];
int num_sel;
gotoxy(6,3);
puts("1.- Introducir una Linea");
gotoxy(6,5);
puts("2.- Mostrar la Lista");
gotoxy(6,7);
puts("3.- Eliminar una Linea");
gotoxy(6,9);
puts("4.- Buscar una Linea");
gotoxy(46,3);
puts("5.- Abrir Archivo");
gotoxy(46,5);
puts("6.- Salvar Archivo");
gotoxy(46,7);
puts("7.- Imprimir la Lista");
gotoxy(46,9);
puts("8.- Salir a Sistema");
do{
printf("\nOpcion -> ");
gets(num_tmp);
num_sel = atoi(num_tmp);
}while(num_sel<0 || num_sel>8);
return num_sel;
}
int Introducir(int num_line)
{
struct Ed_Line *info;
for(;;){
info = malloc(sizeof(struct Ed_Line));
if(!info){
printf("Fallo de peticion de Memoria\n");
exit(1);
}
printf("%d: ", num_line);
gets(info->text_line);
info->num = num_line;
if(*info->text_line){
if(Busca_Line(num_line)) Ajustar(num_line, 1);
if(*info->text_line) pent_list = almacena_deo(info);
}
else break;
num_line++;
}
return num_line;
}
struct Ed_Line *Busca_Line(int num_line)
{
struct Ed_Line *info;
info = pent_list;
while(info){
if(num_line == info->num){
return info;
}
info = info -> sig;
}
return NULL;
}
void Ajustar(int num, int incr)
{
struct Ed_Line *i;
i = Busca_Line(num);
while(i){
i->num = i->num+incr;
i = i->sig;
}
}
struct Ed_Line *almacena_deo(struct Ed_Line *i)
{
struct Ed_Line *pold, *p;
if(!uent_list){
i->sig = NULL;
i->ant = NULL;
uent_list = i;
return i;
}
p = pent_list;
pold = NULL;
while(p){
if(p->num < i->num){
pold = p;
p = p->sig;
}
else{
if(p->ant){
p->ant->sig = i;
i->sig = p;
p->ant = i;
return pent_list;
}
i->sig = p;
i->ant = NULL;
p->ant = i;
return i;
}
}
pold->sig=i;
i->sig=NULL;
i->ant = pold;
uent_list = i;
return(pent_list);
}
void Listar_Edline(void)
{
struct Ed_Line *info;
info = pent_list;
while(info){
printf("%d : %s\n", info->num, info->text_line);
info = info->sig;
}
printf("\n");
}
void Borrar_Line(void)
{
struct Ed_Line *info;
char s[10];
int num_line;
printf("Numero de Linea: ");
gets(s);
num_line = atoi(s);
info = Busca_Line(num_line);
if(info){
if(pent_list==info){
pent_list = info->sig;
if(pent_list) pent_list->ant = NULL;
else uent_list = NULL;
}
else{
info->ant->sig=info->sig;
if(info!=uent_list)
info->sig->ant=info->ant;
else
uent_list = info->ant;
}
free(info);
Ajustar(num_line+1, -1);
}
}
void Cargar_Arch(char *Nom_Arch)
{
int tsize, cta_line;
struct Ed_Line *info, *tmp;
char *pt_text;
FILE *_archivo;
if((_archivo = fopen(Nom_Arch, "r"))==NULL){
if((_archivo = fopen("Nom_Arch", "w"))== NULL){
puts("No es posible crear el archivo");
exit(0);
}
}
while(pent_list){
pt_text=pent_list->text_line;
pent_list=pent_list->sig;
free(pt_text);
}
puts("Cargando el Archivo");
tsize = sizeof(struct Ed_Line);
pent_list = (struct Ed_Line *)malloc(tsize);
if(!pent_list){
printf("Error de asignacion de Memoria\n");
exit(0);
}
tmp=NULL;
info = pent_list;
pt_text = info->text_line;
cta_line = 1;
while((*pt_text=(char)getc(_archivo))!=EOF){
*pt_text++;
fgets(pt_text, 80, _archivo);
info->num=cta_line++;
info->sig=(struct Ed_Line *)malloc(tsize);
if(info->sig==NULL){
printf("Error de asignacion de Memoria\n");
exit(0);
}
tmp=info;
info=info->sig;
info->ant=tmp;
pt_text=info->text_line;
}
pent_list->ant=tmp->sig=NULL;
uent_list=tmp;
free(info);
fclose(_archivo);
}
void Guardar_Arch(char *Nom_Arch)
{
struct Ed_Line *info;
char *pt_text;
FILE *_archivo;
if((_archivo=fopen(Nom_Arch, "w"))==NULL){
printf("No se puede abrir el archivo\n");
exit(1);
}
printf("\nSalvado el archivo\n");
info=pent_list;
while(info){
pt_text = info->text_line;
fputs(pt_text, _archivo);
putc('\r', _archivo);
putc('\n', _archivo);
info = info->sig;
}
putc(EOF, _archivo);
fclose(_archivo);
}
void Imprime_Arch()
{
printf("Prepare la Impresora y pulse una tecla para continuar\n");
printf("\nModulo no disponible\n");
}