/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "print.h" #include #include #include #include "util.h" bool g_stdoutIsTty; char const* g_escapeBold; char const* g_escapeRedBold; char const* g_escapeGreenBold; char const* g_escapeYellowBold; char const* g_escapeUnderline; char const* g_escapeEndColor; char const* g_escapeClearLine; void init_print() { if (isatty(fileno(stdout))) { g_stdoutIsTty = true; g_escapeBold = "\033[1m"; g_escapeRedBold = "\033[91m\033[1m"; g_escapeGreenBold = "\033[92m\033[1m"; g_escapeYellowBold = "\033[93m\033[1m"; g_escapeUnderline = "\033[4m"; g_escapeEndColor = "\033[0m"; g_escapeClearLine = "\033[K"; } else { g_stdoutIsTty = false; g_escapeBold = ""; g_escapeRedBold = ""; g_escapeGreenBold = ""; g_escapeYellowBold = ""; g_escapeUnderline = ""; g_escapeEndColor = ""; g_escapeClearLine = ""; } } void print_status(const char* format, ...) { printf("\n%s%s", g_escapeBold, g_escapeUnderline); va_list args; va_start(args, format); vfprintf(stdout, format, args); va_end(args); printf("%s\n", g_escapeEndColor); } void print_command(const Command& command) { fputs(g_escapeBold, stdout); for (map::const_iterator it=command.env.begin(); it!=command.env.end(); it++) { fputs(it->first.c_str(), stdout); fputc('=', stdout); fputs(escape_for_commandline(it->second.c_str()).c_str(), stdout); putc(' ', stdout); } fputs(command.prog.c_str(), stdout); for (vector::const_iterator it=command.args.begin(); it!=command.args.end(); it++) { putc(' ', stdout); fputs(escape_for_commandline(it->c_str()).c_str(), stdout); } fputs(g_escapeEndColor, stdout); fputc('\n', stdout); } void print_error(const char* format, ...) { fputs(g_escapeRedBold, stderr); va_list args; va_start(args, format); vfprintf(stderr, format, args); va_end(args); fputs(g_escapeEndColor, stderr); fputc('\n', stderr); } void print_warning(const char* format, ...) { fputs(g_escapeYellowBold, stderr); va_list args; va_start(args, format); vfprintf(stderr, format, args); va_end(args); fputs(g_escapeEndColor, stderr); fputc('\n', stderr); } void print_info(const char* format, ...) { fputs(g_escapeBold, stdout); va_list args; va_start(args, format); vfprintf(stdout, format, args); va_end(args); fputs(g_escapeEndColor, stdout); fputc('\n', stdout); } void print_one_line(const char* format, ...) { if (g_stdoutIsTty) { struct winsize ws; ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws); int size = ws.ws_col + 1; char* buf = (char*)malloc(size); va_list args; va_start(args, format); vsnprintf(buf, size, format, args); va_end(args); printf("%s%s\r", buf, g_escapeClearLine); free(buf); fflush(stdout); } else { va_list args; va_start(args, format); vfprintf(stdout, format, args); va_end(args); printf("\n"); } } void check_error(int err) { if (err != 0) { fputc('\n', stderr); print_error("Stopping due to errors."); exit(1); } }