#include #include #include #include #include #include #include #include #include #define ARG_SIZE 50 struct winsize ws; int max; int min; int args; size_t middle; int add_value(const char *str) { if (args > (int)ws.ws_col) return 1; int val1 = atoi(str); int val2 = val1; if (val2 < 0) val2 *= -1; if (val2 > max) max = val2; else if (val2 < min) min = val2; int k = (val2 - min) * (middle - 5) / ((max - min) + 1); if (val1 > 0) mvprintw(middle - k, args, "@"); else mvprintw(middle + k, args, "@"); 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); } 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); middle = ws.ws_row / 2; while (1) { args = 0; clear(); stdin_read(); refresh(); } }