#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