#include #include #include #include #include #include #include #include #include #define NARGS 1024 #define ARG_SIZE 50 int args; int values[NARGS + 1]; struct winsize ws; int add_value(const char *str) { if (args >= sizeof(values) / sizeof(int) || args > ws.ws_col) return 1; values[args] = atoi(str); args++; return 0; } void stdin_read(void) { char arg[ARG_SIZE + 1]; char *p = arg; while (1) { int c = getchar(); if (c == EOF) return; else if (c == ' ' && p != arg) { *p = '\0'; p = arg; if (add_value(arg)) break; } else { *p = c; if (p + 1 == arg + sizeof(arg)) break; p++; } } } void sig_handler(int sig) { (void)sig; endwin(); exit(0); } void print(int y, int x, char *str, int val) { if (val < 0) mvprintw(y, x, "%s", str); else mvprintw(y, x, "%s", str); } int main(void) { signal(SIGINT, sig_handler); signal(SIGTERM, sig_handler); if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) < 0) return 1; initscr(); noecho(); curs_set(0); timeout(0); int min = 0; int max = 0; int middle = ws.ws_row / 2; while (1) { args = 0; stdin_read(); clear(); for (int i = 0; i < args; i++) { int val = values[i]; if (val < 0) val *= -1; if (val < min) min = val; else if (val > max) max = val; int lvl = (val - min) * (ws.ws_row / 5) / ((max - min) + 1); for (int j = 0; j < lvl; j++) { print(middle - j, i, "$", values[i]); print(middle + j, i, "$", values[i]); } print(middle - lvl, i, ".", values[i]); print(middle + lvl, i, "'", values[i]); } refresh(); } }