#include <curses.h>
#include <string.h>
#include <signal.h>
#include <stdlib.h>

#define NB_VALUES 70

static void finish(int sig)
{
	endwin();
	exit(0);
}

void refresh_screen(double *values)
{
	const int left = 5;
	const int top = 2;
	const int width = NB_VALUES;
	const int height = 30;

	int i;
	double max_value = 0;

	for (i = 0; i < height; ++i)
	{
		mvaddch(top+i, left, '|');
	}
	mvaddch(top+height, left, '+');
	for (i = 0; i < width; ++i)
	{
		mvaddch(top+height, left+1+i, '-');
	}

	mvaddch(top-1, left, '^');
	mvaddch(top+height, left+width+1, '>');
	mvaddch(top+height, left-2, '0');
	mvaddch(top+height+1, left, '0');

	for (i = 0; i < NB_VALUES; ++i)
		if (values[i] > max_value)
			max_value = values[i];

	mvprintw(top-1, 0, "%.0f", max_value);

	for (i = 0; i < NB_VALUES; ++i)
	{
		int x = left+1+i;
		int h = (int) ((values[i]/max_value) * height);
		int j;
		for (j = 0; j < height; ++j)
		{
			if (j < h)
				mvaddch(top+height-j-1, x, '#');
			else
				mvaddch(top+height-j-1, x, ' ');
		}
		//mvprintw(top+height+2+i, 0, "%f %d, %d, %d\n", values[i], x, h, j);
	}

	refresh();
}

void insert_value(double *values, double value)
{
	unsigned i;
	for (i = 0; i < NB_VALUES-1; ++i)
		values[i] = values[i+1];
	values[NB_VALUES-1] = value;
}

int main(int agrc, char **argv)
{
	char buf[50];
	double values[NB_VALUES];

	bzero(values, sizeof(values) / sizeof(double));
	signal(SIGINT, finish);

	initscr();
	nonl();

	while (fgets(buf, sizeof buf, stdin))
	{
		char *ptr;
		char* part = strtok_r(buf, "\n", &ptr);
		do
		{
			char *endptr;
			double value = strtod(part, &endptr);
			if (*endptr == '\0')
				insert_value(values, value);
		} while ((part = strtok_r(NULL, "\n", &ptr)) != NULL);

		refresh_screen(values);
	}

	finish(0);

	return 0;
}

