1 // SPDX-License-Identifier: GPL-2.0
2 #include <linux/kernel.h>
3 #include <subcmd/pager.h>
11 int perf_use_color_default
= -1;
13 static int __color_vsnprintf(char *bf
, size_t size
, const char *color
,
14 const char *fmt
, va_list args
, const char *trail
)
21 if (perf_use_color_default
< 0) {
22 if (isatty(1) || pager_in_use())
23 perf_use_color_default
= 1;
25 perf_use_color_default
= 0;
28 if (perf_use_color_default
&& *color
)
29 r
+= scnprintf(bf
, size
, "%s", color
);
30 r
+= vscnprintf(bf
+ r
, size
- r
, fmt
, args
);
31 if (perf_use_color_default
&& *color
)
32 r
+= scnprintf(bf
+ r
, size
- r
, "%s", PERF_COLOR_RESET
);
34 r
+= scnprintf(bf
+ r
, size
- r
, "%s", trail
);
38 /* Colors are not included in return value */
39 static int __color_vfprintf(FILE *fp
, const char *color
, const char *fmt
,
47 if (perf_use_color_default
< 0) {
48 if (isatty(fileno(fp
)) || pager_in_use())
49 perf_use_color_default
= 1;
51 perf_use_color_default
= 0;
54 if (perf_use_color_default
&& *color
)
55 fprintf(fp
, "%s", color
);
56 r
+= vfprintf(fp
, fmt
, args
);
57 if (perf_use_color_default
&& *color
)
58 fprintf(fp
, "%s", PERF_COLOR_RESET
);
62 int color_vsnprintf(char *bf
, size_t size
, const char *color
,
63 const char *fmt
, va_list args
)
65 return __color_vsnprintf(bf
, size
, color
, fmt
, args
, NULL
);
68 int color_vfprintf(FILE *fp
, const char *color
, const char *fmt
, va_list args
)
70 return __color_vfprintf(fp
, color
, fmt
, args
);
73 int color_snprintf(char *bf
, size_t size
, const char *color
,
80 r
= color_vsnprintf(bf
, size
, color
, fmt
, args
);
85 int color_fprintf(FILE *fp
, const char *color
, const char *fmt
, ...)
91 r
= color_vfprintf(fp
, color
, fmt
, args
);
97 * This function splits the buffer by newlines and colors the lines individually.
99 * Returns 0 on success.
101 int color_fwrite_lines(FILE *fp
, const char *color
,
102 size_t count
, const char *buf
)
105 return fwrite(buf
, count
, 1, fp
) != 1;
108 char *p
= memchr(buf
, '\n', count
);
110 if (p
!= buf
&& (fputs(color
, fp
) < 0 ||
111 fwrite(buf
, p
? (size_t)(p
- buf
) : count
, 1, fp
) != 1 ||
112 fputs(PERF_COLOR_RESET
, fp
) < 0))
116 if (fputc('\n', fp
) < 0)
118 count
-= p
+ 1 - buf
;
124 const char *get_percent_color(double percent
)
126 const char *color
= PERF_COLOR_NORMAL
;
129 * We color high-overhead entries in red, mid-overhead
130 * entries in green - and keep the low overhead places
133 if (fabs(percent
) >= MIN_RED
)
134 color
= PERF_COLOR_RED
;
136 if (fabs(percent
) > MIN_GREEN
)
137 color
= PERF_COLOR_GREEN
;
142 int percent_color_fprintf(FILE *fp
, const char *fmt
, double percent
)
147 color
= get_percent_color(percent
);
148 r
= color_fprintf(fp
, color
, fmt
, percent
);
153 int value_color_snprintf(char *bf
, size_t size
, const char *fmt
, double value
)
155 const char *color
= get_percent_color(value
);
156 return color_snprintf(bf
, size
, color
, fmt
, value
);
159 int percent_color_snprintf(char *bf
, size_t size
, const char *fmt
, ...)
165 percent
= va_arg(args
, double);
167 return value_color_snprintf(bf
, size
, fmt
, percent
);
170 int percent_color_len_snprintf(char *bf
, size_t size
, const char *fmt
, ...)
178 len
= va_arg(args
, int);
179 percent
= va_arg(args
, double);
182 color
= get_percent_color(percent
);
183 return color_snprintf(bf
, size
, color
, fmt
, len
, percent
);