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