/* bocabajo.c - Invierte el orden de las lineas de la entrada estandar.
 * Carlos Hernando <chernando_AT_acm_DOT_org>, Curso de C 2005
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXLINEA 2048
#define LINEASINICIALES 2

int main( int argc, char ** argv )
{
	char linea[MAXLINEA];     // Linea de texto que leemos
	char ** lineas;           // Array de lineas
	unsigned int tamanyo = 0; // Tamanyo del array de lineas
	unsigned int nleidos = 0; // Lineas leidas
	int i;                    // Temporal para el bucle

	/* FASE 0: Ponemos la mesa */
	lineas  = (char **) malloc( sizeof(char *) * LINEASINICIALES );
	tamanyo = LINEASINICIALES;

#ifdef DEBUG
	printf("DEBUG: Variable tamanyo: %d\n", tamanyo);
	printf("DEBUG: Tamanyo de char*: %d\n", sizeof(char *));
	printf("DEBUG: Tamanyo de lineas: %d\n", sizeof(char *) * LINEASINICIALES);
#endif

	/* FASE 1: Tragamos */
	while ( fgets(linea, MAXLINEA, stdin) ) {
		if ( nleidos >= tamanyo ) {
			/* XXX: Cuidado guindilla picante! */
			lineas = (char **) realloc( lineas, sizeof(char *) * tamanyo * 2);
			tamanyo *= 2;
#ifdef DEBUG
			printf("DEBUG: Variable tamanyo: %d\n", tamanyo);
			printf("DEBUG: Tamanyo de lineas: %d\n", sizeof(char *) * tamanyo*2);
#endif
			if ( !lineas ) {
				printf("PICA!!!!");
				exit(1);
			}
		}
		lineas[nleidos] = strdup(linea);
		nleidos++;
	}

	/* FASE 2: Escupimos */
	for ( i = 0; i < nleidos; i++ ) 
		printf("%s", lineas[nleidos-i-1]); // XXX: -1 ajuste de posicion 0

	/* FASE 3: Recogemos la mesa */
	for ( i = 0; i < nleidos; i++ ) 
		free(lineas[i]);
	free(lineas);
	tamanyo = 0;

	return 0;
}
