#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXLINE 1024
typedef struct
{
char ** linea;
int cantlineas;
int numlinea0;
} Ventana;
char * GetLine(FILE * pf);
Ventana * creaVentana (int nLineasExtra);
void destruyeVentana (Ventana * v);
void pushVentana(Ventana * v, char * s );
void imprimeVentana(Ventana * v);
char * avanzaVentana(Ventana * v, FILE *pf);
int buscaVentana(FILE *pf, char *busco, Ventana *v);
void destruyeVentana (Ventana * v)
{
int i;
for (i=0; i<v->cantlineas; i++)
if(v->linea[i] != NULL)
free(v->linea[i]);
free(v->linea);
free(v);
}
void pushVentana(Ventana * v, char * s )
{
int i;
if ( v->linea[0] != NULL )
free(v->linea[0]);
for (i=1; i < v->cantlineas; i++)
v->linea[i-1] = v->linea[i];
v->linea[v->cantlineas -1] = s;
v->numlinea0++;
return;
}
void imprimeVentana(Ventana * v)
{
int i, n;
printf(" _\n");
printf(" |\n");
for (i=0; i < v->cantlineas; i++)
if (v->linea[i] == NULL)
printf(" |\n");
else
printf(" | %3d: %s\n",v->numlinea0 + i, v->linea[i]);
printf(" |_\n\n");
return;
}
char * avanzaVentana(Ventana * v, FILE *pf)
{
char * s;
s = GetLine(pf);
pushVentana(v,s);
return s;
}
int buscaVentana(FILE *pf, char *busco, Ventana *v)
{
int i,j,eof, numline;
avanzaVentana(v,pf);
i = (v->cantlineas-1)/2;
numline = v->numlinea0 + i;
while(v->linea[i]==NULL || strstr(v->linea[i],busco)==NULL)
{
if (avanzaVentana(v,pf)==NULL)
{
eof = 1;
for (j=i; j < v->cantlineas; j++)
{
if (v->linea[j] != NULL)
{
eof = 0;
break;
}
}
if (eof)
{
numline = -1;
break;
}
}
else
numline++;
}
return numline;
}
char * GetLine(FILE * pf)
{
char * line;
int largo;
char buf[MAXLINE];
if (fgets(buf,MAXLINE,pf)==NULL)
return NULL;
largo = strlen(buf);
if (buf[largo-1] == '\n')
buf[--largo] = '\0';
if((line = (char *) malloc((largo+1)*sizeof(char))) == NULL)
return NULL;
if(strcpy(line,buf) == NULL)
{
free(line);
return NULL;
}
return line;
}
syntax highlighted by Code2HTML, v. 0.9.1