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
);
96 const char *get_percent_color(double percent
)
98 const char *color
= PERF_COLOR_NORMAL
;
101 * We color high-overhead entries in red, mid-overhead
102 * entries in green - and keep the low overhead places
105 if (fabs(percent
) >= MIN_RED
)
106 color
= PERF_COLOR_RED
;
108 if (fabs(percent
) > MIN_GREEN
)
109 color
= PERF_COLOR_GREEN
;
114 int percent_color_fprintf(FILE *fp
, const char *fmt
, double percent
)
119 color
= get_percent_color(percent
);
120 r
= color_fprintf(fp
, color
, fmt
, percent
);
125 int value_color_snprintf(char *bf
, size_t size
, const char *fmt
, double value
)
127 const char *color
= get_percent_color(value
);
128 return color_snprintf(bf
, size
, color
, fmt
, value
);
131 int percent_color_snprintf(char *bf
, size_t size
, const char *fmt
, ...)
137 percent
= va_arg(args
, double);
139 return value_color_snprintf(bf
, size
, fmt
, percent
);
142 int percent_color_len_snprintf(char *bf
, size_t size
, const char *fmt
, ...)
150 len
= va_arg(args
, int);
151 percent
= va_arg(args
, double);
154 color
= get_percent_color(percent
);
155 return color_snprintf(bf
, size
, color
, fmt
, len
, percent
);