/* Arquivo getline.c */
#include "getline.h"

/*
 * GetLine(): le uma linha do stdin (terminada por '\n' ou fim de
 * arquivo) e devolve um ponteiro para um string contendo a linha
 * lida; a linha lida nao contem '\n'.  Memoria 'e alocada
 * dinamicamente para armazenar a linha lida.
 * 
 * Obs.  Esta rotina foi copiada (com pequenas modificacoes) do livro 
 * The Art and Science of C, por Eric Roberts.  
 */

char *GetLine()
{
    char *line, *nline;
    int n, ch, size;

    n = 0;
    size = INITIAL_BUFF_SIZE;
    line = (char *) malloc(size + 1);
    if (!line)
	out_of_mem(-2);
    while ((ch = getchar()) != '\n' && ch != EOF) {
	if (n == size) {
	    size *= 2;
	    nline = (char *) malloc(size + 1);
	    if (!nline)
		out_of_mem(-3);
	    strncpy(nline, line, n);
	    free(line);
	    line = nline;
	}
	line[n++] = ch;
    }
    if (n == 0 && ch == EOF) {
	free(line);
	return NULL;
    }
    line[n] = '\0';
    nline = (char *) malloc(n + 1);
    if (!nline)
	out_of_mem(-4);
    strcpy(nline, line);
    free(line);
    return nline;
}
