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