1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker * Copyright (C) 2016 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker *
4*d57664e9SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*d57664e9SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*d57664e9SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*d57664e9SAndroid Build Coastguard Worker *
8*d57664e9SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*d57664e9SAndroid Build Coastguard Worker *
10*d57664e9SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*d57664e9SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*d57664e9SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*d57664e9SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*d57664e9SAndroid Build Coastguard Worker * limitations under the License.
15*d57664e9SAndroid Build Coastguard Worker */
16*d57664e9SAndroid Build Coastguard Worker
17*d57664e9SAndroid Build Coastguard Worker #include "print.h"
18*d57664e9SAndroid Build Coastguard Worker
19*d57664e9SAndroid Build Coastguard Worker #include <sys/ioctl.h>
20*d57664e9SAndroid Build Coastguard Worker #include <stdarg.h>
21*d57664e9SAndroid Build Coastguard Worker #include <stdio.h>
22*d57664e9SAndroid Build Coastguard Worker #include <unistd.h>
23*d57664e9SAndroid Build Coastguard Worker
24*d57664e9SAndroid Build Coastguard Worker #include "util.h"
25*d57664e9SAndroid Build Coastguard Worker
26*d57664e9SAndroid Build Coastguard Worker bool g_stdoutIsTty;
27*d57664e9SAndroid Build Coastguard Worker char const* g_escapeBold;
28*d57664e9SAndroid Build Coastguard Worker char const* g_escapeRedBold;
29*d57664e9SAndroid Build Coastguard Worker char const* g_escapeGreenBold;
30*d57664e9SAndroid Build Coastguard Worker char const* g_escapeYellowBold;
31*d57664e9SAndroid Build Coastguard Worker char const* g_escapeUnderline;
32*d57664e9SAndroid Build Coastguard Worker char const* g_escapeEndColor;
33*d57664e9SAndroid Build Coastguard Worker char const* g_escapeClearLine;
34*d57664e9SAndroid Build Coastguard Worker
35*d57664e9SAndroid Build Coastguard Worker void
init_print()36*d57664e9SAndroid Build Coastguard Worker init_print()
37*d57664e9SAndroid Build Coastguard Worker {
38*d57664e9SAndroid Build Coastguard Worker if (isatty(fileno(stdout))) {
39*d57664e9SAndroid Build Coastguard Worker g_stdoutIsTty = true;
40*d57664e9SAndroid Build Coastguard Worker g_escapeBold = "\033[1m";
41*d57664e9SAndroid Build Coastguard Worker g_escapeRedBold = "\033[91m\033[1m";
42*d57664e9SAndroid Build Coastguard Worker g_escapeGreenBold = "\033[92m\033[1m";
43*d57664e9SAndroid Build Coastguard Worker g_escapeYellowBold = "\033[93m\033[1m";
44*d57664e9SAndroid Build Coastguard Worker g_escapeUnderline = "\033[4m";
45*d57664e9SAndroid Build Coastguard Worker g_escapeEndColor = "\033[0m";
46*d57664e9SAndroid Build Coastguard Worker g_escapeClearLine = "\033[K";
47*d57664e9SAndroid Build Coastguard Worker } else {
48*d57664e9SAndroid Build Coastguard Worker g_stdoutIsTty = false;
49*d57664e9SAndroid Build Coastguard Worker g_escapeBold = "";
50*d57664e9SAndroid Build Coastguard Worker g_escapeRedBold = "";
51*d57664e9SAndroid Build Coastguard Worker g_escapeGreenBold = "";
52*d57664e9SAndroid Build Coastguard Worker g_escapeYellowBold = "";
53*d57664e9SAndroid Build Coastguard Worker g_escapeUnderline = "";
54*d57664e9SAndroid Build Coastguard Worker g_escapeEndColor = "";
55*d57664e9SAndroid Build Coastguard Worker g_escapeClearLine = "";
56*d57664e9SAndroid Build Coastguard Worker }
57*d57664e9SAndroid Build Coastguard Worker }
58*d57664e9SAndroid Build Coastguard Worker
59*d57664e9SAndroid Build Coastguard Worker void
print_status(const char * format,...)60*d57664e9SAndroid Build Coastguard Worker print_status(const char* format, ...)
61*d57664e9SAndroid Build Coastguard Worker {
62*d57664e9SAndroid Build Coastguard Worker printf("\n%s%s", g_escapeBold, g_escapeUnderline);
63*d57664e9SAndroid Build Coastguard Worker
64*d57664e9SAndroid Build Coastguard Worker va_list args;
65*d57664e9SAndroid Build Coastguard Worker va_start(args, format);
66*d57664e9SAndroid Build Coastguard Worker vfprintf(stdout, format, args);
67*d57664e9SAndroid Build Coastguard Worker va_end(args);
68*d57664e9SAndroid Build Coastguard Worker
69*d57664e9SAndroid Build Coastguard Worker printf("%s\n", g_escapeEndColor);
70*d57664e9SAndroid Build Coastguard Worker }
71*d57664e9SAndroid Build Coastguard Worker
72*d57664e9SAndroid Build Coastguard Worker void
print_command(const Command & command)73*d57664e9SAndroid Build Coastguard Worker print_command(const Command& command)
74*d57664e9SAndroid Build Coastguard Worker {
75*d57664e9SAndroid Build Coastguard Worker fputs(g_escapeBold, stdout);
76*d57664e9SAndroid Build Coastguard Worker for (map<string,string>::const_iterator it=command.env.begin(); it!=command.env.end(); it++) {
77*d57664e9SAndroid Build Coastguard Worker fputs(it->first.c_str(), stdout);
78*d57664e9SAndroid Build Coastguard Worker fputc('=', stdout);
79*d57664e9SAndroid Build Coastguard Worker fputs(escape_for_commandline(it->second.c_str()).c_str(), stdout);
80*d57664e9SAndroid Build Coastguard Worker putc(' ', stdout);
81*d57664e9SAndroid Build Coastguard Worker }
82*d57664e9SAndroid Build Coastguard Worker fputs(command.prog.c_str(), stdout);
83*d57664e9SAndroid Build Coastguard Worker for (vector<string>::const_iterator it=command.args.begin(); it!=command.args.end(); it++) {
84*d57664e9SAndroid Build Coastguard Worker putc(' ', stdout);
85*d57664e9SAndroid Build Coastguard Worker fputs(escape_for_commandline(it->c_str()).c_str(), stdout);
86*d57664e9SAndroid Build Coastguard Worker }
87*d57664e9SAndroid Build Coastguard Worker fputs(g_escapeEndColor, stdout);
88*d57664e9SAndroid Build Coastguard Worker fputc('\n', stdout);
89*d57664e9SAndroid Build Coastguard Worker }
90*d57664e9SAndroid Build Coastguard Worker
91*d57664e9SAndroid Build Coastguard Worker void
print_error(const char * format,...)92*d57664e9SAndroid Build Coastguard Worker print_error(const char* format, ...)
93*d57664e9SAndroid Build Coastguard Worker {
94*d57664e9SAndroid Build Coastguard Worker fputs(g_escapeRedBold, stderr);
95*d57664e9SAndroid Build Coastguard Worker
96*d57664e9SAndroid Build Coastguard Worker va_list args;
97*d57664e9SAndroid Build Coastguard Worker va_start(args, format);
98*d57664e9SAndroid Build Coastguard Worker vfprintf(stderr, format, args);
99*d57664e9SAndroid Build Coastguard Worker va_end(args);
100*d57664e9SAndroid Build Coastguard Worker
101*d57664e9SAndroid Build Coastguard Worker fputs(g_escapeEndColor, stderr);
102*d57664e9SAndroid Build Coastguard Worker fputc('\n', stderr);
103*d57664e9SAndroid Build Coastguard Worker }
104*d57664e9SAndroid Build Coastguard Worker
105*d57664e9SAndroid Build Coastguard Worker void
print_warning(const char * format,...)106*d57664e9SAndroid Build Coastguard Worker print_warning(const char* format, ...)
107*d57664e9SAndroid Build Coastguard Worker {
108*d57664e9SAndroid Build Coastguard Worker fputs(g_escapeYellowBold, stderr);
109*d57664e9SAndroid Build Coastguard Worker
110*d57664e9SAndroid Build Coastguard Worker va_list args;
111*d57664e9SAndroid Build Coastguard Worker va_start(args, format);
112*d57664e9SAndroid Build Coastguard Worker vfprintf(stderr, format, args);
113*d57664e9SAndroid Build Coastguard Worker va_end(args);
114*d57664e9SAndroid Build Coastguard Worker
115*d57664e9SAndroid Build Coastguard Worker fputs(g_escapeEndColor, stderr);
116*d57664e9SAndroid Build Coastguard Worker fputc('\n', stderr);
117*d57664e9SAndroid Build Coastguard Worker }
118*d57664e9SAndroid Build Coastguard Worker
119*d57664e9SAndroid Build Coastguard Worker void
print_info(const char * format,...)120*d57664e9SAndroid Build Coastguard Worker print_info(const char* format, ...)
121*d57664e9SAndroid Build Coastguard Worker {
122*d57664e9SAndroid Build Coastguard Worker fputs(g_escapeBold, stdout);
123*d57664e9SAndroid Build Coastguard Worker
124*d57664e9SAndroid Build Coastguard Worker va_list args;
125*d57664e9SAndroid Build Coastguard Worker va_start(args, format);
126*d57664e9SAndroid Build Coastguard Worker vfprintf(stdout, format, args);
127*d57664e9SAndroid Build Coastguard Worker va_end(args);
128*d57664e9SAndroid Build Coastguard Worker
129*d57664e9SAndroid Build Coastguard Worker fputs(g_escapeEndColor, stdout);
130*d57664e9SAndroid Build Coastguard Worker fputc('\n', stdout);
131*d57664e9SAndroid Build Coastguard Worker }
132*d57664e9SAndroid Build Coastguard Worker
133*d57664e9SAndroid Build Coastguard Worker void
print_one_line(const char * format,...)134*d57664e9SAndroid Build Coastguard Worker print_one_line(const char* format, ...)
135*d57664e9SAndroid Build Coastguard Worker {
136*d57664e9SAndroid Build Coastguard Worker if (g_stdoutIsTty) {
137*d57664e9SAndroid Build Coastguard Worker struct winsize ws;
138*d57664e9SAndroid Build Coastguard Worker ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws);
139*d57664e9SAndroid Build Coastguard Worker int size = ws.ws_col + 1;
140*d57664e9SAndroid Build Coastguard Worker char* buf = (char*)malloc(size);
141*d57664e9SAndroid Build Coastguard Worker
142*d57664e9SAndroid Build Coastguard Worker va_list args;
143*d57664e9SAndroid Build Coastguard Worker va_start(args, format);
144*d57664e9SAndroid Build Coastguard Worker vsnprintf(buf, size, format, args);
145*d57664e9SAndroid Build Coastguard Worker va_end(args);
146*d57664e9SAndroid Build Coastguard Worker
147*d57664e9SAndroid Build Coastguard Worker printf("%s%s\r", buf, g_escapeClearLine);
148*d57664e9SAndroid Build Coastguard Worker free(buf);
149*d57664e9SAndroid Build Coastguard Worker
150*d57664e9SAndroid Build Coastguard Worker fflush(stdout);
151*d57664e9SAndroid Build Coastguard Worker } else {
152*d57664e9SAndroid Build Coastguard Worker va_list args;
153*d57664e9SAndroid Build Coastguard Worker va_start(args, format);
154*d57664e9SAndroid Build Coastguard Worker vfprintf(stdout, format, args);
155*d57664e9SAndroid Build Coastguard Worker va_end(args);
156*d57664e9SAndroid Build Coastguard Worker printf("\n");
157*d57664e9SAndroid Build Coastguard Worker }
158*d57664e9SAndroid Build Coastguard Worker }
159*d57664e9SAndroid Build Coastguard Worker
160*d57664e9SAndroid Build Coastguard Worker void
check_error(int err)161*d57664e9SAndroid Build Coastguard Worker check_error(int err)
162*d57664e9SAndroid Build Coastguard Worker {
163*d57664e9SAndroid Build Coastguard Worker if (err != 0) {
164*d57664e9SAndroid Build Coastguard Worker fputc('\n', stderr);
165*d57664e9SAndroid Build Coastguard Worker print_error("Stopping due to errors.");
166*d57664e9SAndroid Build Coastguard Worker exit(1);
167*d57664e9SAndroid Build Coastguard Worker }
168*d57664e9SAndroid Build Coastguard Worker }
169*d57664e9SAndroid Build Coastguard Worker
170*d57664e9SAndroid Build Coastguard Worker
171