#include "util/console.hpp" #include #include #include "configure.hpp" #ifdef HAVE_ISATTY #include #endif #ifdef HAVE_IOCTL #include #endif static bool native_console = true; namespace color { shell_command reset = { "\x1b[0m" }; shell_command black = { "\x1b[1;30m" }; shell_command red = { "\x1b[1;31m" }; shell_command green = { "\x1b[1;32m" }; shell_command yellow = { "\x1b[1;33m" }; shell_command blue = { "\x1b[1;34m" }; shell_command magenta = { "\x1b[1;35m" }; shell_command cyan = { "\x1b[1;36m" }; shell_command white = { "\x1b[1;37m" }; shell_command dim_black = { "\x1b[0;30m" }; shell_command dim_red = { "\x1b[0;31m" }; shell_command dim_green = { "\x1b[0;32m" }; shell_command dim_yellow = { "\x1b[0;33m" }; shell_command dim_blue = { "\x1b[0;34m" }; shell_command dim_magenta = { "\x1b[0;35m" }; shell_command dim_cyan = { "\x1b[0;36m" }; shell_command dim_white = { "\x1b[0;37m" }; shell_command current = reset; void init() { #ifdef HAVE_ISATTY if(isatty(1) && isatty(2)) { return; } #endif native_console = false; reset.command = ""; black.command = ""; red.command = ""; green.command = ""; yellow.command = ""; blue.command = ""; magenta.command = ""; cyan.command = ""; white.command = ""; dim_black.command = ""; dim_red.command = ""; dim_green.command = ""; dim_yellow.command = ""; dim_blue.command = ""; dim_magenta.command = ""; dim_cyan.command = ""; dim_white.command = ""; current = reset; } } // namespace color namespace progress { void show(float value, const std::string & label) { if(!native_console) { return; } #if defined(HAVE_IOCTL) && defined(TIOCGWINSZ) struct winsize w; ioctl(0, TIOCGWINSZ, &w); clear(); std::ios_base::fmtflags flags = std::cout.flags(); size_t progress_length = w.ws_col - label.length() - 6 - 2 - 2 - 1; if(progress_length > 10) { size_t progress = size_t(std::ceil(float(progress_length) * value)); std::cout << '['; for(size_t i = 0; i < progress; i++) { std::cout << '='; } std::cout << '>'; for(size_t i = progress; i < progress_length; i++) { std::cout << ' '; } std::cout << ']'; } std::cout << std::right << std::fixed << std::setprecision(1) << std::setfill(' ') << std::setw(5) << (value * 100) << "% " << label; std::cout.flush(); std::cout.flags(flags); #endif } void clear() { if(!native_console) { return; } #ifdef HAVE_IOCTL std::cout << "\33[2K\r"; #endif } } // namespace progress