@@ -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,29 @@ 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
+ else
159
+ {
160
+ std::fprintf (output, " [dpf] " );
161
+ std::vfprintf (output, fmt, args);
162
+ std::fprintf (output, " \n " );
163
+ }
164
+
165
+ std::fflush (output);
132
166
va_end (args);
133
167
} catch (...) {}
134
168
}
@@ -140,11 +174,18 @@ void d_debug(const char* const fmt, ...) noexcept
140
174
static inline
141
175
void d_stdout (const char * const fmt, ...) noexcept
142
176
{
177
+ static FILE* const output = __d_fopen (" /tmp/dpf.stdout.log" , stdout);
178
+
143
179
try {
144
180
va_list args;
145
181
va_start (args, fmt);
146
- std::vfprintf (stdout, fmt, args);
147
- std::fprintf (stdout, " \n " );
182
+ std::fprintf (output, " [dpf] " );
183
+ std::vfprintf (output, fmt, args);
184
+ std::fprintf (output, " \n " );
185
+ #ifndef DEBUG
186
+ if (output != stdout)
187
+ #endif
188
+ std::fflush (output);
148
189
va_end (args);
149
190
} catch (...) {}
150
191
}
@@ -155,11 +196,18 @@ void d_stdout(const char* const fmt, ...) noexcept
155
196
static inline
156
197
void d_stderr (const char * const fmt, ...) noexcept
157
198
{
199
+ static FILE* const output = __d_fopen (" /tmp/dpf.stderr.log" , stderr);
200
+
158
201
try {
159
202
va_list args;
160
203
va_start (args, fmt);
161
- std::vfprintf (stderr, fmt, args);
162
- std::fprintf (stderr, " \n " );
204
+ std::fprintf (output, " [dpf] " );
205
+ std::vfprintf (output, fmt, args);
206
+ std::fprintf (output, " \n " );
207
+ #ifndef DEBUG
208
+ if (output != stderr)
209
+ #endif
210
+ std::fflush (output);
163
211
va_end (args);
164
212
} catch (...) {}
165
213
}
@@ -170,12 +218,26 @@ void d_stderr(const char* const fmt, ...) noexcept
170
218
static inline
171
219
void d_stderr2 (const char * const fmt, ...) noexcept
172
220
{
221
+ static FILE* const output = __d_fopen (" /tmp/dpf.stderr2.log" , stderr);
222
+
173
223
try {
174
224
va_list args;
175
225
va_start (args, fmt);
176
- std::fprintf (stderr, " \x1b [31m" );
177
- std::vfprintf (stderr, fmt, args);
178
- std::fprintf (stderr, " \x1b [0m\n " );
226
+
227
+ if (output == stdout)
228
+ {
229
+ std::fprintf (output, " \x1b [31m[dpf] " );
230
+ std::vfprintf (output, fmt, args);
231
+ std::fprintf (output, " \x1b [0m\n " );
232
+ }
233
+ else
234
+ {
235
+ std::fprintf (output, " [dpf] " );
236
+ std::vfprintf (output, fmt, args);
237
+ std::fprintf (output, " \n " );
238
+ }
239
+
240
+ std::fflush (output);
179
241
va_end (args);
180
242
} catch (...) {}
181
243
}
0 commit comments