10578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato/* 20578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato * Copyright (C) 2016 The Android Open Source Project 30578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato * 40578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato * Licensed under the Apache License, Version 2.0 (the "License"); 50578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato * you may not use this file except in compliance with the License. 60578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato * You may obtain a copy of the License at 70578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato * 80578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato * http://www.apache.org/licenses/LICENSE-2.0 90578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato * 100578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato * Unless required by applicable law or agreed to in writing, software 110578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato * distributed under the License is distributed on an "AS IS" BASIS, 120578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato * See the License for the specific language governing permissions and 140578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato * limitations under the License. 150578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato */ 160578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato 170578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato#include "print.h" 180578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato 190578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato#include <sys/ioctl.h> 200578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato#include <stdio.h> 210578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato#include <unistd.h> 220578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato 230578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato#include "util.h" 240578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato 250578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onoratobool g_stdoutIsTty; 260578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onoratochar const* g_escapeBold; 270578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onoratochar const* g_escapeRedBold; 280578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onoratochar const* g_escapeGreenBold; 290578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onoratochar const* g_escapeYellowBold; 300578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onoratochar const* g_escapeUnderline; 310578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onoratochar const* g_escapeEndColor; 320578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onoratochar const* g_escapeClearLine; 330578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato 340578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onoratovoid 350578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onoratoinit_print() 360578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato{ 370578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato if (isatty(fileno(stdout))) { 380578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato g_stdoutIsTty = true; 390578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato g_escapeBold = "\033[1m"; 400578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato g_escapeRedBold = "\033[91m\033[1m"; 410578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato g_escapeGreenBold = "\033[92m\033[1m"; 420578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato g_escapeYellowBold = "\033[93m\033[1m"; 430578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato g_escapeUnderline = "\033[4m"; 440578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato g_escapeEndColor = "\033[0m"; 450578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato g_escapeClearLine = "\033[K"; 460578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato } else { 470578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato g_stdoutIsTty = false; 480578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato g_escapeBold = ""; 490578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato g_escapeRedBold = ""; 500578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato g_escapeGreenBold = ""; 510578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato g_escapeYellowBold = ""; 520578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato g_escapeUnderline = ""; 530578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato g_escapeEndColor = ""; 540578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato g_escapeClearLine = ""; 550578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato } 560578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato} 570578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato 580578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onoratovoid 590578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onoratoprint_status(const char* format, ...) 600578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato{ 610578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato printf("\n%s%s", g_escapeBold, g_escapeUnderline); 620578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato 630578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato va_list args; 640578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato va_start(args, format); 650578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato vfprintf(stdout, format, args); 660578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato va_end(args); 670578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato 680578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato printf("%s\n", g_escapeEndColor); 690578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato} 700578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato 710578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onoratovoid 720578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onoratoprint_command(const Command& command) 730578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato{ 740578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato fputs(g_escapeBold, stdout); 750578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato for (map<string,string>::const_iterator it=command.env.begin(); it!=command.env.end(); it++) { 760578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato fputs(it->first.c_str(), stdout); 770578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato fputc('=', stdout); 780578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato fputs(escape_for_commandline(it->second.c_str()).c_str(), stdout); 790578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato putc(' ', stdout); 800578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato } 810578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato fputs(command.prog.c_str(), stdout); 820578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato for (vector<string>::const_iterator it=command.args.begin(); it!=command.args.end(); it++) { 830578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato putc(' ', stdout); 840578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato fputs(escape_for_commandline(it->c_str()).c_str(), stdout); 850578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato } 860578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato fputs(g_escapeEndColor, stdout); 870578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato fputc('\n', stdout); 880578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato} 890578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato 900578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onoratovoid 910578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onoratoprint_error(const char* format, ...) 920578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato{ 930578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato fputs(g_escapeRedBold, stderr); 940578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato 950578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato va_list args; 960578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato va_start(args, format); 970578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato vfprintf(stderr, format, args); 980578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato va_end(args); 990578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato 1000578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato fputs(g_escapeEndColor, stderr); 1010578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato fputc('\n', stderr); 1020578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato} 1030578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato 1040578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onoratovoid 1050578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onoratoprint_warning(const char* format, ...) 1060578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato{ 1070578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato fputs(g_escapeYellowBold, stderr); 1080578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato 1090578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato va_list args; 1100578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato va_start(args, format); 1110578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato vfprintf(stderr, format, args); 1120578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato va_end(args); 1130578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato 1140578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato fputs(g_escapeEndColor, stderr); 1150578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato fputc('\n', stderr); 1160578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato} 1170578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato 1180578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onoratovoid 1190578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onoratoprint_one_line(const char* format, ...) 1200578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato{ 1210578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato if (g_stdoutIsTty) { 1220578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato struct winsize ws; 1230578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws); 1240578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato int size = ws.ws_col + 1; 1250578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato char* buf = (char*)malloc(size); 1260578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato 1270578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato va_list args; 1280578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato va_start(args, format); 1290578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato vsnprintf(buf, size, format, args); 1300578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato va_end(args); 1310578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato 1320578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato printf("%s%s\r", buf, g_escapeClearLine); 1330578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato free(buf); 1340578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato 1350578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato fflush(stdout); 1360578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato } else { 1370578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato va_list args; 1380578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato va_start(args, format); 1390578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato vfprintf(stdout, format, args); 1400578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato va_end(args); 1410578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato printf("\n"); 1420578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato } 1430578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato} 1440578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato 1450578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onoratovoid 1460578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onoratocheck_error(int err) 1470578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato{ 1480578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato if (err != 0) { 1490578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato fputc('\n', stderr); 1500578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato print_error("Stopping due to errors."); 1510578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato exit(1); 1520578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato } 1530578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato} 1540578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato 1550578cbc6c527bc09a38a0fcd8b9642c25c8ea023Joe Onorato 156