| /* | |
| * 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 <sys/ioctl.h> | |
| #include <stdarg.h> | |
| #include <stdio.h> | |
| #include <unistd.h> | |
| #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<string,string>::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<string>::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); | |
| } | |
| } | |