@@ -109,6 +109,27 @@ void d_pass() noexcept {}
109109 @{
110110 */
111111
112+ /*
113+ * Internal noexcept-safe fopen function.
114+ */
115+ static inline
116+ FILE* __d_fopen (const char * const filename, FILE* const fallback) noexcept
117+ {
118+ if (std::getenv (" DPF_CAPTURE_CONSOLE_OUTPUT" ) == nullptr )
119+ return fallback;
120+
121+ FILE* ret = nullptr ;
122+
123+ try {
124+ ret = std::fopen (filename, " a+" );
125+ } catch (...) {}
126+
127+ if (ret == nullptr )
128+ ret = fallback;
129+
130+ return ret;
131+ }
132+
112133/* *
113134 Print a string to stdout with newline (gray color).
114135 Does nothing if DEBUG is not defined.
@@ -119,16 +140,30 @@ void d_pass() noexcept {}
119140static inline
120141void d_debug (const char * const fmt, ...) noexcept
121142{
143+ static FILE* const output = __d_fopen (" /tmp/dpf.debug.log" , stdout);
144+
122145 try {
123146 va_list args;
124147 va_start (args, fmt);
125- #ifdef DISTRHO_OS_MAC
126- std::fprintf (stdout, " \x1b [37;1m" );
127- #else
128- std::fprintf (stdout, " \x1b [30;1m" );
129- #endif
130- std::vfprintf (stdout, fmt, args);
131- std::fprintf (stdout, " \x1b [0m\n " );
148+
149+ if (output == stdout)
150+ {
151+ #ifdef DISTRHO_OS_MAC
152+ std::fprintf (output, " \x1b [37;1m[dpf] " );
153+ #else
154+ std::fprintf (output, " \x1b [30;1m[dpf] " );
155+ #endif
156+ std::vfprintf (output, fmt, args);
157+ std::fprintf (output, " \x1b [0m\n " );
158+ }
159+ else
160+ {
161+ std::fprintf (output, " [dpf] " );
162+ std::vfprintf (output, fmt, args);
163+ std::fprintf (output, " \n " );
164+ }
165+
166+ std::fflush (output);
132167 va_end (args);
133168 } catch (...) {}
134169}
@@ -140,11 +175,18 @@ void d_debug(const char* const fmt, ...) noexcept
140175static inline
141176void d_stdout (const char * const fmt, ...) noexcept
142177{
178+ static FILE* const output = __d_fopen (" /tmp/dpf.stdout.log" , stdout);
179+
143180 try {
144181 va_list args;
145182 va_start (args, fmt);
146- std::vfprintf (stdout, fmt, args);
147- std::fprintf (stdout, " \n " );
183+ std::fprintf (output, " [dpf] " );
184+ std::vfprintf (output, fmt, args);
185+ std::fprintf (output, " \n " );
186+ #ifndef DEBUG
187+ if (output != stdout)
188+ #endif
189+ std::fflush (output);
148190 va_end (args);
149191 } catch (...) {}
150192}
@@ -155,11 +197,18 @@ void d_stdout(const char* const fmt, ...) noexcept
155197static inline
156198void d_stderr (const char * const fmt, ...) noexcept
157199{
200+ static FILE* const output = __d_fopen (" /tmp/dpf.stderr.log" , stderr);
201+
158202 try {
159203 va_list args;
160204 va_start (args, fmt);
161- std::vfprintf (stderr, fmt, args);
162- std::fprintf (stderr, " \n " );
205+ std::fprintf (output, " [dpf] " );
206+ std::vfprintf (output, fmt, args);
207+ std::fprintf (output, " \n " );
208+ #ifndef DEBUG
209+ if (output != stderr)
210+ #endif
211+ std::fflush (output);
163212 va_end (args);
164213 } catch (...) {}
165214}
@@ -170,12 +219,26 @@ void d_stderr(const char* const fmt, ...) noexcept
170219static inline
171220void d_stderr2 (const char * const fmt, ...) noexcept
172221{
222+ static FILE* const output = __d_fopen (" /tmp/dpf.stderr2.log" , stderr);
223+
173224 try {
174225 va_list args;
175226 va_start (args, fmt);
176- std::fprintf (stderr, " \x1b [31m" );
177- std::vfprintf (stderr, fmt, args);
178- std::fprintf (stderr, " \x1b [0m\n " );
227+
228+ if (output == stdout)
229+ {
230+ std::fprintf (output, " \x1b [31m[dpf] " );
231+ std::vfprintf (output, fmt, args);
232+ std::fprintf (output, " \x1b [0m\n " );
233+ }
234+ else
235+ {
236+ std::fprintf (output, " [dpf] " );
237+ std::vfprintf (output, fmt, args);
238+ std::fprintf (output, " \n " );
239+ }
240+
241+ std::fflush (output);
179242 va_end (args);
180243 } catch (...) {}
181244}
0 commit comments