#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 middle, int k, int x) { if (values[x] < 0) mvprintw(middle + k, x, "@"); else mvprintw(middle - k, x, "@"); } 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 = (int)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; /* Main */ int lvl = (val - min) * (middle - 5) / ((max - min) + 1); print(middle, lvl, i); } refresh(); } }