#include "log.h" #include "env.h" #include "intl.h" #include "util.h" #include #include #include #include #include #include #include int lastprog = -1; struct winsize barwin = {0}; void bar_init() { lastprog = -1; ioctl(STDOUT_FILENO, TIOCGWINSZ, &barwin); printf("\e[?25l"); bar(0, 1); } void bar_free() { int size = barwin.ws_col; printf("\r"); for (int i = 0; i < size; i++) printf(" "); printf("\r"); printf("\e[?25h"); } bool bar(float cur, float max) { if (cur <= 0 || max <= 0 || cur > max) return false; float per = 100 * (cur / max); if (per > 100) { return false; } char perc[20]; sprintf(perc, " %%%.f", per); int size = barwin.ws_col - (3 + strlen(perc)); if (size <= 0) { return false; } int prog = size * (cur / max); if (prog == lastprog || prog > size) return true; lastprog = prog; printf("\r" COLOR_BOLD "["); for (int i = 0; i < prog; i++) { printf("#"); } printf(COLOR_BLUE "#" COLOR_RESET COLOR_BOLD); for (int i = prog; i < size; i++) { printf(" "); } printf("]" COLOR_RESET); printf(COLOR_BOLD COLOR_BLUE "%s" COLOR_RESET "\r", perc); return true; } void info(const char *msg, ...) { va_list args; va_start(args, msg); printf(COLOR_BOLD COLOR_BLUE ">>> " COLOR_RESET COLOR_BOLD); vprintf(msg, args); printf(COLOR_RESET "\n"); va_end(args); } void error(const char *msg, ...) { va_list args; va_start(args, msg); printf(COLOR_BOLD COLOR_RED ">>> " COLOR_RESET COLOR_BOLD); vprintf(msg, args); printf(COLOR_RESET "\n"); va_end(args); } void details(const char *msg, ...) { va_list args; va_start(args, msg); printf(" "COLOR_RESET); vprintf(msg, args); printf(COLOR_RESET "\n"); va_end(args); } void success(const char *msg, ...) { va_list args; va_start(args, msg); printf(COLOR_BOLD COLOR_GREEN ">>> " COLOR_RESET COLOR_BOLD); vprintf(msg, args); printf(COLOR_RESET "\n"); va_end(args); } void debug(const char *msg, ...) { if (!env_mc_debug()) return; va_list args; va_start(args, msg); printf(COLOR_BOLD COLOR_MAGENTA "DEBUG: " COLOR_RESET COLOR_BOLD); vprintf(msg, args); printf(COLOR_RESET "\n"); va_end(args); } void input(const char *msg, ...) { va_list args; va_start(args, msg); printf(COLOR_BOLD COLOR_CYAN ">>> " COLOR_RESET COLOR_BOLD); vprintf(msg, args); printf(COLOR_RESET); va_end(args); } bool yesno(const char *msg){ char question[strlen(msg)+12], inp[2] = {'n','\0'}, c; sprintf(question, "%s [y/n]? ", msg); while(true){ input(question); scanf("%c", &c); inp[0] = c; if(eq(inp, _("y")) || eq(inp, _("Y"))) return true; else if(eq(inp, _("n")) || eq(inp, _("N"))) return false; error(_("Please answer with y/n")); } }