@@ -109,6 +109,27 @@ void d_pass() noexcept {}
109
109
@{
110
110
*/
111
111
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
+
112
133
/* *
113
134
Print a string to stdout with newline (gray color).
114
135
Does nothing if DEBUG is not defined.
@@ -119,16 +140,30 @@ void d_pass() noexcept {}
119
140
static inline
120
141
void d_debug (const char * const fmt, ...) noexcept
121
142
{
143
+ static FILE* const output = __d_fopen (" /tmp/dpf.debug.log" , stdout);
144
+
122
145
try {
123
146
va_list args;
124
147
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);
132
167
va_end (args);
133
168
} catch (...) {}
134
169
}
@@ -140,11 +175,18 @@ void d_debug(const char* const fmt, ...) noexcept
140
175
static inline
141
176
void d_stdout (const char * const fmt, ...) noexcept
142
177
{
178
+ static FILE* const output = __d_fopen (" /tmp/dpf.stdout.log" , stdout);
179
+
143
180
try {
144
181
va_list args;
145
182
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);
148
190
va_end (args);
149
191
} catch (...) {}
150
192
}
@@ -155,11 +197,18 @@ void d_stdout(const char* const fmt, ...) noexcept
155
197
static inline
156
198
void d_stderr (const char * const fmt, ...) noexcept
157
199
{
200
+ static FILE* const output = __d_fopen (" /tmp/dpf.stderr.log" , stderr);
201
+
158
202
try {
159
203
va_list args;
160
204
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);
163
212
va_end (args);
164
213
} catch (...) {}
165
214
}
@@ -170,12 +219,26 @@ void d_stderr(const char* const fmt, ...) noexcept
170
219
static inline
171
220
void d_stderr2 (const char * const fmt, ...) noexcept
172
221
{
222
+ static FILE* const output = __d_fopen (" /tmp/dpf.stderr2.log" , stderr);
223
+
173
224
try {
174
225
va_list args;
175
226
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);
179
242
va_end (args);
180
243
} catch (...) {}
181
244
}
0 commit comments