xref: /aosp_15_r20/external/AFLplusplus/include/debug.h (revision 08b48e0b10e97b33e7b60c5b6e2243bd915777f2)
1*08b48e0bSAndroid Build Coastguard Worker /*
2*08b48e0bSAndroid Build Coastguard Worker    american fuzzy lop++ - debug / error handling macros
3*08b48e0bSAndroid Build Coastguard Worker    ----------------------------------------------------
4*08b48e0bSAndroid Build Coastguard Worker 
5*08b48e0bSAndroid Build Coastguard Worker    Originally written by Michal Zalewski
6*08b48e0bSAndroid Build Coastguard Worker 
7*08b48e0bSAndroid Build Coastguard Worker    Now maintained by Marc Heuse <[email protected]>,
8*08b48e0bSAndroid Build Coastguard Worker                      Heiko Eißfeldt <[email protected]>,
9*08b48e0bSAndroid Build Coastguard Worker                      Andrea Fioraldi <[email protected]>,
10*08b48e0bSAndroid Build Coastguard Worker                      Dominik Maier <[email protected]>
11*08b48e0bSAndroid Build Coastguard Worker 
12*08b48e0bSAndroid Build Coastguard Worker    Copyright 2016, 2017 Google Inc. All rights reserved.
13*08b48e0bSAndroid Build Coastguard Worker    Copyright 2019-2024 AFLplusplus Project. All rights reserved.
14*08b48e0bSAndroid Build Coastguard Worker 
15*08b48e0bSAndroid Build Coastguard Worker    Licensed under the Apache License, Version 2.0 (the "License");
16*08b48e0bSAndroid Build Coastguard Worker    you may not use this file except in compliance with the License.
17*08b48e0bSAndroid Build Coastguard Worker    You may obtain a copy of the License at:
18*08b48e0bSAndroid Build Coastguard Worker 
19*08b48e0bSAndroid Build Coastguard Worker      https://www.apache.org/licenses/LICENSE-2.0
20*08b48e0bSAndroid Build Coastguard Worker 
21*08b48e0bSAndroid Build Coastguard Worker  */
22*08b48e0bSAndroid Build Coastguard Worker 
23*08b48e0bSAndroid Build Coastguard Worker #ifndef _HAVE_DEBUG_H
24*08b48e0bSAndroid Build Coastguard Worker #define _HAVE_DEBUG_H
25*08b48e0bSAndroid Build Coastguard Worker 
26*08b48e0bSAndroid Build Coastguard Worker #include <errno.h>
27*08b48e0bSAndroid Build Coastguard Worker 
28*08b48e0bSAndroid Build Coastguard Worker #include "types.h"
29*08b48e0bSAndroid Build Coastguard Worker #include "config.h"
30*08b48e0bSAndroid Build Coastguard Worker 
31*08b48e0bSAndroid Build Coastguard Worker /*******************
32*08b48e0bSAndroid Build Coastguard Worker  * Terminal colors *
33*08b48e0bSAndroid Build Coastguard Worker  *******************/
34*08b48e0bSAndroid Build Coastguard Worker 
35*08b48e0bSAndroid Build Coastguard Worker #ifndef MESSAGES_TO_STDOUT
36*08b48e0bSAndroid Build Coastguard Worker   #define MESSAGES_TO_STDOUT
37*08b48e0bSAndroid Build Coastguard Worker #endif
38*08b48e0bSAndroid Build Coastguard Worker 
39*08b48e0bSAndroid Build Coastguard Worker #ifdef USE_COLOR
40*08b48e0bSAndroid Build Coastguard Worker 
41*08b48e0bSAndroid Build Coastguard Worker   #define cBLK "\x1b[0;30m"
42*08b48e0bSAndroid Build Coastguard Worker   #define cRED "\x1b[0;31m"
43*08b48e0bSAndroid Build Coastguard Worker   #define cGRN "\x1b[0;32m"
44*08b48e0bSAndroid Build Coastguard Worker   #define cBRN "\x1b[0;33m"
45*08b48e0bSAndroid Build Coastguard Worker   #define cBLU "\x1b[0;34m"
46*08b48e0bSAndroid Build Coastguard Worker   #define cMGN "\x1b[0;35m"
47*08b48e0bSAndroid Build Coastguard Worker   #define cCYA "\x1b[0;36m"
48*08b48e0bSAndroid Build Coastguard Worker   #define cLGR "\x1b[0;37m"
49*08b48e0bSAndroid Build Coastguard Worker   #define cGRA "\x1b[1;90m"
50*08b48e0bSAndroid Build Coastguard Worker   #define cLRD "\x1b[1;91m"
51*08b48e0bSAndroid Build Coastguard Worker   #define cLGN "\x1b[1;92m"
52*08b48e0bSAndroid Build Coastguard Worker   #define cYEL "\x1b[1;93m"
53*08b48e0bSAndroid Build Coastguard Worker   #define cLBL "\x1b[1;94m"
54*08b48e0bSAndroid Build Coastguard Worker   #define cPIN "\x1b[1;95m"
55*08b48e0bSAndroid Build Coastguard Worker   #define cLCY "\x1b[1;96m"
56*08b48e0bSAndroid Build Coastguard Worker   #define cBRI "\x1b[1;97m"
57*08b48e0bSAndroid Build Coastguard Worker   #define cRST "\x1b[0m"
58*08b48e0bSAndroid Build Coastguard Worker 
59*08b48e0bSAndroid Build Coastguard Worker   #define bgBLK "\x1b[40m"
60*08b48e0bSAndroid Build Coastguard Worker   #define bgRED "\x1b[41m"
61*08b48e0bSAndroid Build Coastguard Worker   #define bgGRN "\x1b[42m"
62*08b48e0bSAndroid Build Coastguard Worker   #define bgBRN "\x1b[43m"
63*08b48e0bSAndroid Build Coastguard Worker   #define bgBLU "\x1b[44m"
64*08b48e0bSAndroid Build Coastguard Worker   #define bgMGN "\x1b[45m"
65*08b48e0bSAndroid Build Coastguard Worker   #define bgCYA "\x1b[46m"
66*08b48e0bSAndroid Build Coastguard Worker   #define bgLGR "\x1b[47m"
67*08b48e0bSAndroid Build Coastguard Worker   #define bgGRA "\x1b[100m"
68*08b48e0bSAndroid Build Coastguard Worker   #define bgLRD "\x1b[101m"
69*08b48e0bSAndroid Build Coastguard Worker   #define bgLGN "\x1b[102m"
70*08b48e0bSAndroid Build Coastguard Worker   #define bgYEL "\x1b[103m"
71*08b48e0bSAndroid Build Coastguard Worker   #define bgLBL "\x1b[104m"
72*08b48e0bSAndroid Build Coastguard Worker   #define bgPIN "\x1b[105m"
73*08b48e0bSAndroid Build Coastguard Worker   #define bgLCY "\x1b[106m"
74*08b48e0bSAndroid Build Coastguard Worker   #define bgBRI "\x1b[107m"
75*08b48e0bSAndroid Build Coastguard Worker 
76*08b48e0bSAndroid Build Coastguard Worker #else
77*08b48e0bSAndroid Build Coastguard Worker 
78*08b48e0bSAndroid Build Coastguard Worker   #define cBLK ""
79*08b48e0bSAndroid Build Coastguard Worker   #define cRED ""
80*08b48e0bSAndroid Build Coastguard Worker   #define cGRN ""
81*08b48e0bSAndroid Build Coastguard Worker   #define cBRN ""
82*08b48e0bSAndroid Build Coastguard Worker   #define cBLU ""
83*08b48e0bSAndroid Build Coastguard Worker   #define cMGN ""
84*08b48e0bSAndroid Build Coastguard Worker   #define cCYA ""
85*08b48e0bSAndroid Build Coastguard Worker   #define cLGR ""
86*08b48e0bSAndroid Build Coastguard Worker   #define cGRA ""
87*08b48e0bSAndroid Build Coastguard Worker   #define cLRD ""
88*08b48e0bSAndroid Build Coastguard Worker   #define cLGN ""
89*08b48e0bSAndroid Build Coastguard Worker   #define cYEL ""
90*08b48e0bSAndroid Build Coastguard Worker   #define cLBL ""
91*08b48e0bSAndroid Build Coastguard Worker   #define cPIN ""
92*08b48e0bSAndroid Build Coastguard Worker   #define cLCY ""
93*08b48e0bSAndroid Build Coastguard Worker   #define cBRI ""
94*08b48e0bSAndroid Build Coastguard Worker   #define cRST ""
95*08b48e0bSAndroid Build Coastguard Worker 
96*08b48e0bSAndroid Build Coastguard Worker   #define bgBLK ""
97*08b48e0bSAndroid Build Coastguard Worker   #define bgRED ""
98*08b48e0bSAndroid Build Coastguard Worker   #define bgGRN ""
99*08b48e0bSAndroid Build Coastguard Worker   #define bgBRN ""
100*08b48e0bSAndroid Build Coastguard Worker   #define bgBLU ""
101*08b48e0bSAndroid Build Coastguard Worker   #define bgMGN ""
102*08b48e0bSAndroid Build Coastguard Worker   #define bgCYA ""
103*08b48e0bSAndroid Build Coastguard Worker   #define bgLGR ""
104*08b48e0bSAndroid Build Coastguard Worker   #define bgGRA ""
105*08b48e0bSAndroid Build Coastguard Worker   #define bgLRD ""
106*08b48e0bSAndroid Build Coastguard Worker   #define bgLGN ""
107*08b48e0bSAndroid Build Coastguard Worker   #define bgYEL ""
108*08b48e0bSAndroid Build Coastguard Worker   #define bgLBL ""
109*08b48e0bSAndroid Build Coastguard Worker   #define bgPIN ""
110*08b48e0bSAndroid Build Coastguard Worker   #define bgLCY ""
111*08b48e0bSAndroid Build Coastguard Worker   #define bgBRI ""
112*08b48e0bSAndroid Build Coastguard Worker 
113*08b48e0bSAndroid Build Coastguard Worker #endif                                                        /* ^USE_COLOR */
114*08b48e0bSAndroid Build Coastguard Worker 
115*08b48e0bSAndroid Build Coastguard Worker /*************************
116*08b48e0bSAndroid Build Coastguard Worker  * Box drawing sequences *
117*08b48e0bSAndroid Build Coastguard Worker  *************************/
118*08b48e0bSAndroid Build Coastguard Worker 
119*08b48e0bSAndroid Build Coastguard Worker #ifdef FANCY_BOXES_NO_UTF
120*08b48e0bSAndroid Build Coastguard Worker 
121*08b48e0bSAndroid Build Coastguard Worker   #define SET_G1 "\x1b)0"                      /* Set G1 for box drawing    */
122*08b48e0bSAndroid Build Coastguard Worker   #define RESET_G1 "\x1b)B"                    /* Reset G1 to ASCII         */
123*08b48e0bSAndroid Build Coastguard Worker   #define bSTART "\x0e"                        /* Enter G1 drawing mode     */
124*08b48e0bSAndroid Build Coastguard Worker   #define bSTOP "\x0f"                         /* Leave G1 drawing mode     */
125*08b48e0bSAndroid Build Coastguard Worker   #define bH "q"                               /* Horizontal line           */
126*08b48e0bSAndroid Build Coastguard Worker   #define bV "x"                               /* Vertical line             */
127*08b48e0bSAndroid Build Coastguard Worker   #define bLT "l"                              /* Left top corner           */
128*08b48e0bSAndroid Build Coastguard Worker   #define bRT "k"                              /* Right top corner          */
129*08b48e0bSAndroid Build Coastguard Worker   #define bLB "m"                              /* Left bottom corner        */
130*08b48e0bSAndroid Build Coastguard Worker   #define bRB "j"                              /* Right bottom corner       */
131*08b48e0bSAndroid Build Coastguard Worker   #define bX "n"                               /* Cross                     */
132*08b48e0bSAndroid Build Coastguard Worker   #define bVR "t"                              /* Vertical, branch right    */
133*08b48e0bSAndroid Build Coastguard Worker   #define bVL "u"                              /* Vertical, branch left     */
134*08b48e0bSAndroid Build Coastguard Worker   #define bHT "v"                              /* Horizontal, branch top    */
135*08b48e0bSAndroid Build Coastguard Worker   #define bHB "w"                              /* Horizontal, branch bottom */
136*08b48e0bSAndroid Build Coastguard Worker 
137*08b48e0bSAndroid Build Coastguard Worker #else
138*08b48e0bSAndroid Build Coastguard Worker 
139*08b48e0bSAndroid Build Coastguard Worker   #ifdef FANCY_BOXES
140*08b48e0bSAndroid Build Coastguard Worker 
141*08b48e0bSAndroid Build Coastguard Worker     #define SET_G1 ""
142*08b48e0bSAndroid Build Coastguard Worker     #define RESET_G1 ""
143*08b48e0bSAndroid Build Coastguard Worker     #define bSTART ""
144*08b48e0bSAndroid Build Coastguard Worker     #define bSTOP ""
145*08b48e0bSAndroid Build Coastguard Worker     #define bH "\u2500"                        /* Horizontal line           */
146*08b48e0bSAndroid Build Coastguard Worker     #define bV "\u2502"                        /* Vertical line             */
147*08b48e0bSAndroid Build Coastguard Worker     #define bLT "\u250c"                       /* Left top corner           */
148*08b48e0bSAndroid Build Coastguard Worker     #define bRT "\u2510"                       /* Right top corner          */
149*08b48e0bSAndroid Build Coastguard Worker     #define bLB "\u2514"                       /* Left bottom corner        */
150*08b48e0bSAndroid Build Coastguard Worker     #define bRB "\u2518"                       /* Right bottom corner       */
151*08b48e0bSAndroid Build Coastguard Worker     #define bX "\u253c"                        /* Cross                     */
152*08b48e0bSAndroid Build Coastguard Worker     #define bVR "\u251c"                       /* Vertical, branch right    */
153*08b48e0bSAndroid Build Coastguard Worker     #define bVL "\u2524"                       /* Vertical, branch left     */
154*08b48e0bSAndroid Build Coastguard Worker     #define bHT "\u2534"                       /* Horizontal, branch top    */
155*08b48e0bSAndroid Build Coastguard Worker     #define bHB "\u252c"                       /* Horizontal, branch bottom */
156*08b48e0bSAndroid Build Coastguard Worker 
157*08b48e0bSAndroid Build Coastguard Worker   #else
158*08b48e0bSAndroid Build Coastguard Worker 
159*08b48e0bSAndroid Build Coastguard Worker     #define SET_G1 ""
160*08b48e0bSAndroid Build Coastguard Worker     #define RESET_G1 ""
161*08b48e0bSAndroid Build Coastguard Worker     #define bSTART ""
162*08b48e0bSAndroid Build Coastguard Worker     #define bSTOP ""
163*08b48e0bSAndroid Build Coastguard Worker     #define bH "-"
164*08b48e0bSAndroid Build Coastguard Worker     #define bV "|"
165*08b48e0bSAndroid Build Coastguard Worker     #define bLT "+"
166*08b48e0bSAndroid Build Coastguard Worker     #define bRT "+"
167*08b48e0bSAndroid Build Coastguard Worker     #define bLB "+"
168*08b48e0bSAndroid Build Coastguard Worker     #define bRB "+"
169*08b48e0bSAndroid Build Coastguard Worker     #define bX "+"
170*08b48e0bSAndroid Build Coastguard Worker     #define bVR "+"
171*08b48e0bSAndroid Build Coastguard Worker     #define bVL "+"
172*08b48e0bSAndroid Build Coastguard Worker     #define bHT "+"
173*08b48e0bSAndroid Build Coastguard Worker     #define bHB "+"
174*08b48e0bSAndroid Build Coastguard Worker 
175*08b48e0bSAndroid Build Coastguard Worker   #endif
176*08b48e0bSAndroid Build Coastguard Worker #endif                                                      /* ^FANCY_BOXES */
177*08b48e0bSAndroid Build Coastguard Worker 
178*08b48e0bSAndroid Build Coastguard Worker /***********************
179*08b48e0bSAndroid Build Coastguard Worker  * Misc terminal codes *
180*08b48e0bSAndroid Build Coastguard Worker  ***********************/
181*08b48e0bSAndroid Build Coastguard Worker 
182*08b48e0bSAndroid Build Coastguard Worker #define TERM_HOME "\x1b[H"
183*08b48e0bSAndroid Build Coastguard Worker #define TERM_CLEAR TERM_HOME "\x1b[2J"
184*08b48e0bSAndroid Build Coastguard Worker #define cEOL "\x1b[0K"
185*08b48e0bSAndroid Build Coastguard Worker #define CURSOR_HIDE "\x1b[?25l"
186*08b48e0bSAndroid Build Coastguard Worker #define CURSOR_SHOW "\x1b[?25h"
187*08b48e0bSAndroid Build Coastguard Worker 
188*08b48e0bSAndroid Build Coastguard Worker /************************
189*08b48e0bSAndroid Build Coastguard Worker  * Debug & error macros *
190*08b48e0bSAndroid Build Coastguard Worker  ************************/
191*08b48e0bSAndroid Build Coastguard Worker 
192*08b48e0bSAndroid Build Coastguard Worker #if defined USE_COLOR && !defined ALWAYS_COLORED
193*08b48e0bSAndroid Build Coastguard Worker   #include <unistd.h>
194*08b48e0bSAndroid Build Coastguard Worker   #pragma GCC diagnostic ignored "-Wformat-security"
colorfilter(const char * x)195*08b48e0bSAndroid Build Coastguard Worker static inline const char *colorfilter(const char *x) {
196*08b48e0bSAndroid Build Coastguard Worker 
197*08b48e0bSAndroid Build Coastguard Worker   static int once = 1;
198*08b48e0bSAndroid Build Coastguard Worker   static int disabled = 0;
199*08b48e0bSAndroid Build Coastguard Worker 
200*08b48e0bSAndroid Build Coastguard Worker   if (once) {
201*08b48e0bSAndroid Build Coastguard Worker 
202*08b48e0bSAndroid Build Coastguard Worker     /* when there is no tty -> we always want filtering
203*08b48e0bSAndroid Build Coastguard Worker      * when AFL_NO_UI is set filtering depends on AFL_NO_COLOR
204*08b48e0bSAndroid Build Coastguard Worker      * otherwise we want always colors
205*08b48e0bSAndroid Build Coastguard Worker      */
206*08b48e0bSAndroid Build Coastguard Worker     disabled =
207*08b48e0bSAndroid Build Coastguard Worker         isatty(2) && (!getenv("AFL_NO_UI") ||
208*08b48e0bSAndroid Build Coastguard Worker                       (!getenv("AFL_NO_COLOR") && !getenv("AFL_NO_COLOUR")));
209*08b48e0bSAndroid Build Coastguard Worker     once = 0;
210*08b48e0bSAndroid Build Coastguard Worker 
211*08b48e0bSAndroid Build Coastguard Worker   }
212*08b48e0bSAndroid Build Coastguard Worker 
213*08b48e0bSAndroid Build Coastguard Worker   if (likely(disabled)) return x;
214*08b48e0bSAndroid Build Coastguard Worker 
215*08b48e0bSAndroid Build Coastguard Worker   static char monochromestring[4096];
216*08b48e0bSAndroid Build Coastguard Worker   char       *d = monochromestring;
217*08b48e0bSAndroid Build Coastguard Worker   int         in_seq = 0;
218*08b48e0bSAndroid Build Coastguard Worker 
219*08b48e0bSAndroid Build Coastguard Worker   while (*x) {
220*08b48e0bSAndroid Build Coastguard Worker 
221*08b48e0bSAndroid Build Coastguard Worker     if (in_seq && *x == 'm') {
222*08b48e0bSAndroid Build Coastguard Worker 
223*08b48e0bSAndroid Build Coastguard Worker       in_seq = 0;
224*08b48e0bSAndroid Build Coastguard Worker 
225*08b48e0bSAndroid Build Coastguard Worker     } else {
226*08b48e0bSAndroid Build Coastguard Worker 
227*08b48e0bSAndroid Build Coastguard Worker       if (!in_seq && *x == '\x1b') { in_seq = 1; }
228*08b48e0bSAndroid Build Coastguard Worker       if (!in_seq) { *d++ = *x; }
229*08b48e0bSAndroid Build Coastguard Worker 
230*08b48e0bSAndroid Build Coastguard Worker     }
231*08b48e0bSAndroid Build Coastguard Worker 
232*08b48e0bSAndroid Build Coastguard Worker     ++x;
233*08b48e0bSAndroid Build Coastguard Worker 
234*08b48e0bSAndroid Build Coastguard Worker   }
235*08b48e0bSAndroid Build Coastguard Worker 
236*08b48e0bSAndroid Build Coastguard Worker   *d = '\0';
237*08b48e0bSAndroid Build Coastguard Worker   return monochromestring;
238*08b48e0bSAndroid Build Coastguard Worker 
239*08b48e0bSAndroid Build Coastguard Worker }
240*08b48e0bSAndroid Build Coastguard Worker 
241*08b48e0bSAndroid Build Coastguard Worker #else
242*08b48e0bSAndroid Build Coastguard Worker   #define colorfilter(x) x                        /* no filtering necessary */
243*08b48e0bSAndroid Build Coastguard Worker #endif
244*08b48e0bSAndroid Build Coastguard Worker 
245*08b48e0bSAndroid Build Coastguard Worker /* macro magic to transform the first parameter to SAYF
246*08b48e0bSAndroid Build Coastguard Worker  * through colorfilter which strips coloring */
247*08b48e0bSAndroid Build Coastguard Worker #define GET_MACRO(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, \
248*08b48e0bSAndroid Build Coastguard Worker                   _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26,  \
249*08b48e0bSAndroid Build Coastguard Worker                   _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38,  \
250*08b48e0bSAndroid Build Coastguard Worker                   _39, _40, NAME, ...)                                         \
251*08b48e0bSAndroid Build Coastguard Worker   NAME
252*08b48e0bSAndroid Build Coastguard Worker 
253*08b48e0bSAndroid Build Coastguard Worker #define SAYF(...)                                                           \
254*08b48e0bSAndroid Build Coastguard Worker   GET_MACRO(__VA_ARGS__, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N,    \
255*08b48e0bSAndroid Build Coastguard Worker             SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, \
256*08b48e0bSAndroid Build Coastguard Worker             SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, \
257*08b48e0bSAndroid Build Coastguard Worker             SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, \
258*08b48e0bSAndroid Build Coastguard Worker             SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, SAYF_N, \
259*08b48e0bSAndroid Build Coastguard Worker             SAYF_N, SAYF_1)                                                 \
260*08b48e0bSAndroid Build Coastguard Worker   (__VA_ARGS__)
261*08b48e0bSAndroid Build Coastguard Worker 
262*08b48e0bSAndroid Build Coastguard Worker #define SAYF_1(x) MY_SAYF(colorfilter(x))
263*08b48e0bSAndroid Build Coastguard Worker #define SAYF_N(x, ...) MY_SAYF(colorfilter(x), __VA_ARGS__)
264*08b48e0bSAndroid Build Coastguard Worker 
265*08b48e0bSAndroid Build Coastguard Worker /* Just print stuff to the appropriate stream. */
266*08b48e0bSAndroid Build Coastguard Worker #ifdef MESSAGES_TO_STDOUT
267*08b48e0bSAndroid Build Coastguard Worker   #define MY_SAYF(x...) printf(x)
268*08b48e0bSAndroid Build Coastguard Worker #else
269*08b48e0bSAndroid Build Coastguard Worker   #define MY_SAYF(x...) fprintf(stderr, x)
270*08b48e0bSAndroid Build Coastguard Worker #endif                                               /* ^MESSAGES_TO_STDOUT */
271*08b48e0bSAndroid Build Coastguard Worker 
272*08b48e0bSAndroid Build Coastguard Worker /* Show a prefixed warning. */
273*08b48e0bSAndroid Build Coastguard Worker 
274*08b48e0bSAndroid Build Coastguard Worker #define WARNF(x...)                            \
275*08b48e0bSAndroid Build Coastguard Worker   do {                                         \
276*08b48e0bSAndroid Build Coastguard Worker                                                \
277*08b48e0bSAndroid Build Coastguard Worker     SAYF(cYEL "[!] " cBRI "WARNING: " cRST x); \
278*08b48e0bSAndroid Build Coastguard Worker     SAYF(cRST "\n");                           \
279*08b48e0bSAndroid Build Coastguard Worker                                                \
280*08b48e0bSAndroid Build Coastguard Worker   } while (0)
281*08b48e0bSAndroid Build Coastguard Worker 
282*08b48e0bSAndroid Build Coastguard Worker /* Show a prefixed "doing something" message. */
283*08b48e0bSAndroid Build Coastguard Worker 
284*08b48e0bSAndroid Build Coastguard Worker #define ACTF(x...)            \
285*08b48e0bSAndroid Build Coastguard Worker   do {                        \
286*08b48e0bSAndroid Build Coastguard Worker                               \
287*08b48e0bSAndroid Build Coastguard Worker     SAYF(cLBL "[*] " cRST x); \
288*08b48e0bSAndroid Build Coastguard Worker     SAYF(cRST "\n");          \
289*08b48e0bSAndroid Build Coastguard Worker                               \
290*08b48e0bSAndroid Build Coastguard Worker   } while (0)
291*08b48e0bSAndroid Build Coastguard Worker 
292*08b48e0bSAndroid Build Coastguard Worker /* Show a prefixed "success" message. */
293*08b48e0bSAndroid Build Coastguard Worker 
294*08b48e0bSAndroid Build Coastguard Worker #define OKF(x...)             \
295*08b48e0bSAndroid Build Coastguard Worker   do {                        \
296*08b48e0bSAndroid Build Coastguard Worker                               \
297*08b48e0bSAndroid Build Coastguard Worker     SAYF(cLGN "[+] " cRST x); \
298*08b48e0bSAndroid Build Coastguard Worker     SAYF(cRST "\n");          \
299*08b48e0bSAndroid Build Coastguard Worker                               \
300*08b48e0bSAndroid Build Coastguard Worker   } while (0)
301*08b48e0bSAndroid Build Coastguard Worker 
302*08b48e0bSAndroid Build Coastguard Worker /* Show a prefixed fatal error message (not used in afl). */
303*08b48e0bSAndroid Build Coastguard Worker 
304*08b48e0bSAndroid Build Coastguard Worker #define BADF(x...)              \
305*08b48e0bSAndroid Build Coastguard Worker   do {                          \
306*08b48e0bSAndroid Build Coastguard Worker                                 \
307*08b48e0bSAndroid Build Coastguard Worker     SAYF(cLRD "\n[-] " cRST x); \
308*08b48e0bSAndroid Build Coastguard Worker     SAYF(cRST "\n");            \
309*08b48e0bSAndroid Build Coastguard Worker                                 \
310*08b48e0bSAndroid Build Coastguard Worker   } while (0)
311*08b48e0bSAndroid Build Coastguard Worker 
312*08b48e0bSAndroid Build Coastguard Worker /* Die with a verbose non-OS fatal error message. */
313*08b48e0bSAndroid Build Coastguard Worker 
314*08b48e0bSAndroid Build Coastguard Worker #define FATAL(x...)                                                      \
315*08b48e0bSAndroid Build Coastguard Worker   do {                                                                   \
316*08b48e0bSAndroid Build Coastguard Worker                                                                          \
317*08b48e0bSAndroid Build Coastguard Worker     SAYF(bSTOP RESET_G1 CURSOR_SHOW cRST cLRD                            \
318*08b48e0bSAndroid Build Coastguard Worker          "\n[-] PROGRAM ABORT : " cRST   x);                               \
319*08b48e0bSAndroid Build Coastguard Worker     SAYF(cLRD "\n         Location : " cRST "%s(), %s:%u\n\n", __func__, \
320*08b48e0bSAndroid Build Coastguard Worker          __FILE__, (u32)__LINE__);                                       \
321*08b48e0bSAndroid Build Coastguard Worker     exit(1);                                                             \
322*08b48e0bSAndroid Build Coastguard Worker                                                                          \
323*08b48e0bSAndroid Build Coastguard Worker   } while (0)
324*08b48e0bSAndroid Build Coastguard Worker 
325*08b48e0bSAndroid Build Coastguard Worker /* Die by calling abort() to provide a core dump. */
326*08b48e0bSAndroid Build Coastguard Worker 
327*08b48e0bSAndroid Build Coastguard Worker #define ABORT(x...)                                                      \
328*08b48e0bSAndroid Build Coastguard Worker   do {                                                                   \
329*08b48e0bSAndroid Build Coastguard Worker                                                                          \
330*08b48e0bSAndroid Build Coastguard Worker     SAYF(bSTOP RESET_G1 CURSOR_SHOW cRST cLRD                            \
331*08b48e0bSAndroid Build Coastguard Worker          "\n[-] PROGRAM ABORT : " cRST   x);                               \
332*08b48e0bSAndroid Build Coastguard Worker     SAYF(cLRD "\n    Stop location : " cRST "%s(), %s:%u\n\n", __func__, \
333*08b48e0bSAndroid Build Coastguard Worker          __FILE__, (u32)__LINE__);                                       \
334*08b48e0bSAndroid Build Coastguard Worker     abort();                                                             \
335*08b48e0bSAndroid Build Coastguard Worker                                                                          \
336*08b48e0bSAndroid Build Coastguard Worker   } while (0)
337*08b48e0bSAndroid Build Coastguard Worker 
338*08b48e0bSAndroid Build Coastguard Worker /* Die while also including the output of perror(). */
339*08b48e0bSAndroid Build Coastguard Worker 
340*08b48e0bSAndroid Build Coastguard Worker #define PFATAL(x...)                                                   \
341*08b48e0bSAndroid Build Coastguard Worker   do {                                                                 \
342*08b48e0bSAndroid Build Coastguard Worker                                                                        \
343*08b48e0bSAndroid Build Coastguard Worker     fflush(stdout);                                                    \
344*08b48e0bSAndroid Build Coastguard Worker     SAYF(bSTOP RESET_G1 CURSOR_SHOW cRST cLRD                          \
345*08b48e0bSAndroid Build Coastguard Worker          "\n[-]  SYSTEM ERROR : " cRST   x);                             \
346*08b48e0bSAndroid Build Coastguard Worker     SAYF(cLRD "\n    Stop location : " cRST "%s(), %s:%u\n", __func__, \
347*08b48e0bSAndroid Build Coastguard Worker          __FILE__, (u32)__LINE__);                                     \
348*08b48e0bSAndroid Build Coastguard Worker     SAYF(cLRD "       OS message : " cRST "%s\n", strerror(errno));    \
349*08b48e0bSAndroid Build Coastguard Worker     exit(1);                                                           \
350*08b48e0bSAndroid Build Coastguard Worker                                                                        \
351*08b48e0bSAndroid Build Coastguard Worker   } while (0)
352*08b48e0bSAndroid Build Coastguard Worker 
353*08b48e0bSAndroid Build Coastguard Worker /* Die with FATAL() or PFATAL() depending on the value of res (used to
354*08b48e0bSAndroid Build Coastguard Worker    interpret different failure modes for read(), write(), etc). */
355*08b48e0bSAndroid Build Coastguard Worker 
356*08b48e0bSAndroid Build Coastguard Worker #define RPFATAL(res, x...) \
357*08b48e0bSAndroid Build Coastguard Worker   do {                     \
358*08b48e0bSAndroid Build Coastguard Worker                            \
359*08b48e0bSAndroid Build Coastguard Worker     if (res < 0)           \
360*08b48e0bSAndroid Build Coastguard Worker       PFATAL(x);           \
361*08b48e0bSAndroid Build Coastguard Worker     else                   \
362*08b48e0bSAndroid Build Coastguard Worker       FATAL(x);            \
363*08b48e0bSAndroid Build Coastguard Worker                            \
364*08b48e0bSAndroid Build Coastguard Worker   } while (0)
365*08b48e0bSAndroid Build Coastguard Worker 
366*08b48e0bSAndroid Build Coastguard Worker /* Show a prefixed debug output. */
367*08b48e0bSAndroid Build Coastguard Worker 
368*08b48e0bSAndroid Build Coastguard Worker #define DEBUGF(x...)                                    \
369*08b48e0bSAndroid Build Coastguard Worker   do {                                                  \
370*08b48e0bSAndroid Build Coastguard Worker                                                         \
371*08b48e0bSAndroid Build Coastguard Worker     fprintf(stderr, cMGN "[D] " cBRI "DEBUG: " cRST x); \
372*08b48e0bSAndroid Build Coastguard Worker     fprintf(stderr, cRST "");                           \
373*08b48e0bSAndroid Build Coastguard Worker                                                         \
374*08b48e0bSAndroid Build Coastguard Worker   } while (0)
375*08b48e0bSAndroid Build Coastguard Worker 
376*08b48e0bSAndroid Build Coastguard Worker /* Error-checking versions of read() and write() that call RPFATAL() as
377*08b48e0bSAndroid Build Coastguard Worker    appropriate. */
378*08b48e0bSAndroid Build Coastguard Worker 
379*08b48e0bSAndroid Build Coastguard Worker #define ck_write(fd, buf, len, fn)                                            \
380*08b48e0bSAndroid Build Coastguard Worker   do {                                                                        \
381*08b48e0bSAndroid Build Coastguard Worker                                                                               \
382*08b48e0bSAndroid Build Coastguard Worker     if (len <= 0) break;                                                      \
383*08b48e0bSAndroid Build Coastguard Worker     int _fd = (fd);                                                           \
384*08b48e0bSAndroid Build Coastguard Worker     s32 _written = 0, _off = 0, _len = (s32)(len);                            \
385*08b48e0bSAndroid Build Coastguard Worker                                                                               \
386*08b48e0bSAndroid Build Coastguard Worker     do {                                                                      \
387*08b48e0bSAndroid Build Coastguard Worker                                                                               \
388*08b48e0bSAndroid Build Coastguard Worker       s32 _res = write(_fd, (buf) + _off, _len);                              \
389*08b48e0bSAndroid Build Coastguard Worker       if (_res != _len && (_res > 0 && _written + _res != _len)) {            \
390*08b48e0bSAndroid Build Coastguard Worker                                                                               \
391*08b48e0bSAndroid Build Coastguard Worker         if (_res > 0) {                                                       \
392*08b48e0bSAndroid Build Coastguard Worker                                                                               \
393*08b48e0bSAndroid Build Coastguard Worker           _written += _res;                                                   \
394*08b48e0bSAndroid Build Coastguard Worker           _len -= _res;                                                       \
395*08b48e0bSAndroid Build Coastguard Worker           _off += _res;                                                       \
396*08b48e0bSAndroid Build Coastguard Worker                                                                               \
397*08b48e0bSAndroid Build Coastguard Worker         } else {                                                              \
398*08b48e0bSAndroid Build Coastguard Worker                                                                               \
399*08b48e0bSAndroid Build Coastguard Worker           RPFATAL(_res, "Short write to %s, fd %d (%d of %d bytes)", fn, _fd, \
400*08b48e0bSAndroid Build Coastguard Worker                   _res, _len);                                                \
401*08b48e0bSAndroid Build Coastguard Worker                                                                               \
402*08b48e0bSAndroid Build Coastguard Worker         }                                                                     \
403*08b48e0bSAndroid Build Coastguard Worker                                                                               \
404*08b48e0bSAndroid Build Coastguard Worker       } else {                                                                \
405*08b48e0bSAndroid Build Coastguard Worker                                                                               \
406*08b48e0bSAndroid Build Coastguard Worker         break;                                                                \
407*08b48e0bSAndroid Build Coastguard Worker                                                                               \
408*08b48e0bSAndroid Build Coastguard Worker       }                                                                       \
409*08b48e0bSAndroid Build Coastguard Worker                                                                               \
410*08b48e0bSAndroid Build Coastguard Worker     } while (1);                                                              \
411*08b48e0bSAndroid Build Coastguard Worker                                                                               \
412*08b48e0bSAndroid Build Coastguard Worker                                                                               \
413*08b48e0bSAndroid Build Coastguard Worker                                                                               \
414*08b48e0bSAndroid Build Coastguard Worker   } while (0)
415*08b48e0bSAndroid Build Coastguard Worker 
416*08b48e0bSAndroid Build Coastguard Worker #define ck_read(fd, buf, len, fn)                              \
417*08b48e0bSAndroid Build Coastguard Worker   do {                                                         \
418*08b48e0bSAndroid Build Coastguard Worker                                                                \
419*08b48e0bSAndroid Build Coastguard Worker     s32 _len = (s32)(len);                                     \
420*08b48e0bSAndroid Build Coastguard Worker     s32 _res = read(fd, buf, _len);                            \
421*08b48e0bSAndroid Build Coastguard Worker     if (_res != _len) RPFATAL(_res, "Short read from %s", fn); \
422*08b48e0bSAndroid Build Coastguard Worker                                                                \
423*08b48e0bSAndroid Build Coastguard Worker   } while (0)
424*08b48e0bSAndroid Build Coastguard Worker 
425*08b48e0bSAndroid Build Coastguard Worker #endif                                                   /* ! _HAVE_DEBUG_H */
426*08b48e0bSAndroid Build Coastguard Worker 
427