ReactOS  0.4.12-dev-712-ge6be187
debug.c
Go to the documentation of this file.
1 /*
2  * Management of the debugging channels
3  *
4  * Copyright 2000 Alexandre Julliard
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20 
21 #include "wine/config.h"
22 #include "wine/port.h"
23 
24 #include <stdlib.h>
25 #include <stdio.h>
26 #include <stdarg.h>
27 #include <string.h>
28 #include <ctype.h>
29 #include <excpt.h>
30 
31 #define WIN32_NO_STATUS
32 #include "wine/debug.h"
33 #include "wine/library.h"
34 
35 #include <rtlfuncs.h>
36 #include <cmfuncs.h>
37 
40 
41 ULONG
42 NTAPI
46  IN ULONG Level,
48  IN va_list ap);
49 
50 
51 static const char * const debug_classes[] = { "fixme", "err", "warn", "trace" };
52 
53 #define MAX_DEBUG_OPTIONS 256
54 
55 static unsigned char default_flags = (1 << __WINE_DBCL_ERR) | (1 << __WINE_DBCL_FIXME);
56 static int nb_debug_options = -1;
58 
60 
61 static void debug_init(void);
62 
63 
64 /* Wine format */
65 static int winefmt_default_dbg_vlog( enum __wine_debug_class cls, struct __wine_debug_channel *channel,
66  const char *file, const char *func, const int line, const char *format, va_list args );
67 /* ReactOS format (default) */
68 static int rosfmt_default_dbg_vlog( enum __wine_debug_class cls, struct __wine_debug_channel *channel,
69  const char *file, const char *func, const int line, const char *format, va_list args );
70 /* Extended format */
71 static int extfmt_default_dbg_vlog( enum __wine_debug_class cls, struct __wine_debug_channel *channel,
72  const char *file, const char *func, const int line, const char *format, va_list args );
73 
74 
75 static int __cdecl cmp_name( const void *p1, const void *p2 )
76 {
77  const char *name = p1;
78  const struct __wine_debug_channel *chan = p2;
79  return strcmp( name, chan->name );
80 }
81 
82 /* get the flags to use for a given channel, possibly setting them too in case of lazy init */
83 unsigned char __wine_dbg_get_channel_flags( struct __wine_debug_channel *channel )
84 {
85  if (nb_debug_options == -1) debug_init();
86 
87  if (nb_debug_options)
88  {
90  sizeof(debug_options[0]), cmp_name );
91  if (opt) return opt->flags;
92  }
93  /* no option for this channel */
94  if (channel->flags & (1 << __WINE_DBCL_INIT)) channel->flags = default_flags;
95  return default_flags;
96 }
97 
98 /* set the flags to use for a given channel; return 0 if the channel is not available to set */
100  unsigned char set, unsigned char clear )
101 {
102  if (nb_debug_options == -1) debug_init();
103 
104  if (nb_debug_options)
105  {
107  sizeof(debug_options[0]), cmp_name );
108  if (opt)
109  {
110  opt->flags = (opt->flags & ~clear) | set;
111  return 1;
112  }
113  }
114  return 0;
115 }
116 
117 /* add a new debug option at the end of the option list */
118 static void add_option( const char *name, unsigned char set, unsigned char clear )
119 {
120  int min = 0, max = nb_debug_options - 1, pos, res;
121 
122  if (!name[0]) /* "all" option */
123  {
124  default_flags = (default_flags & ~clear) | set;
125  return;
126  }
127  if (strlen(name) >= sizeof(debug_options[0].name)) return;
128 
129  while (min <= max)
130  {
131  pos = (min + max) / 2;
133  if (!res)
134  {
135  debug_options[pos].flags = (debug_options[pos].flags & ~clear) | set;
136  return;
137  }
138  if (res < 0) max = pos - 1;
139  else min = pos + 1;
140  }
141  if (nb_debug_options >= MAX_DEBUG_OPTIONS) return;
142 
143  pos = min;
145  (nb_debug_options - pos) * sizeof(debug_options[0]) );
147  debug_options[pos].flags = (default_flags & ~clear) | set;
149 }
150 
151 /* parse a set of debugging option specifications and add them to the option list */
152 static void parse_options( const char *str )
153 {
154  char *opt, *next, *options;
155  unsigned int i;
156 
157  if (!(options = _strdup(str))) return;
158  for (opt = options; opt; opt = next)
159  {
160  const char *p;
161  unsigned char set = 0, clear = 0;
162 
163  if ((next = strchr( opt, ',' ))) *next++ = 0;
164 
165  p = opt + strcspn( opt, "+-" );
166  if (!p[0]) p = opt; /* assume it's a debug channel name */
167 
168  if (p > opt)
169  {
170  for (i = 0; i < sizeof(debug_classes)/sizeof(debug_classes[0]); i++)
171  {
172  int len = strlen(debug_classes[i]);
173  if (len != (p - opt)) continue;
174  if (!memcmp( opt, debug_classes[i], len )) /* found it */
175  {
176  if (*p == '+') set |= 1 << i;
177  else clear |= 1 << i;
178  break;
179  }
180  }
181  if (i == sizeof(debug_classes)/sizeof(debug_classes[0])) /* bad class name, skip it */
182  continue;
183  }
184  else
185  {
186  if (*p == '-') clear = ~0;
187  else set = ~0;
188  }
189  if (*p == '+' || *p == '-') p++;
190  if (!p[0]) continue;
191 
192  if (!strcmp( p, "all" ))
193  default_flags = (default_flags & ~clear) | set;
194  else
195  add_option( p, set, clear );
196  }
197  free( options );
198 }
199 
200 /*
201  * The syntax of the DEBUGCHANNEL environment variable is:
202  * DEBUGCHANNEL=[class]+xxx,[class]-yyy,...
203  *
204  * For example: DEBUGCHANNEL=+all,warn-heap
205  * turns on all messages except warning heap messages.
206  *
207  * The available message classes are: err, warn, fixme, trace.
208  *
209  * In order to select a different debug trace format, the
210  * DEBUGFORMAT environment variable should be used:
211  *
212  * DEBUGFORMAT=fmt
213  *
214  * where fmt is the format name: 'wine', or 'extended' (abbreviation: 'ext').
215  * If no format or an invalid one is specified, the fall-back default format
216  * is used instead.
217  */
218 
219 /* initialize all options at startup */
220 static void debug_init(void)
221 {
222  char *wine_debug;
223  DWORD dwLength;
224  /* GetEnvironmentVariableA will change LastError! */
225  DWORD LastError = GetLastError();
226 
227  if (nb_debug_options != -1) return; /* already initialized */
228  nb_debug_options = 0;
229 
230  dwLength = GetEnvironmentVariableA("DEBUGCHANNEL", NULL, 0);
231  if (dwLength)
232  {
233  wine_debug = malloc(dwLength);
234  if (wine_debug)
235  {
236  if (GetEnvironmentVariableA("DEBUGCHANNEL", wine_debug, dwLength) < dwLength)
237  parse_options(wine_debug);
238  free(wine_debug);
239  }
240  }
241 
242  dwLength = GetEnvironmentVariableA("DEBUGFORMAT", NULL, 0);
243  if (dwLength)
244  {
245  wine_debug = malloc(dwLength);
246  if (wine_debug)
247  {
248  if (GetEnvironmentVariableA("DEBUGFORMAT", wine_debug, dwLength) < dwLength)
249  {
250  if (strcmp(wine_debug, "wine") == 0)
251  {
252  funcs.dbg_vlog = winefmt_default_dbg_vlog;
253  }
254  else
255  if (strcmp(wine_debug, "extended") == 0 ||
256  strcmp(wine_debug, "ext") == 0)
257  {
258  funcs.dbg_vlog = extfmt_default_dbg_vlog;
259  }
260  else
261  {
262  funcs.dbg_vlog = rosfmt_default_dbg_vlog;
263  }
264  }
265  free(wine_debug);
266  }
267  }
268 
269  SetLastError(LastError);
270 }
271 
272 /* varargs wrapper for funcs.dbg_vprintf */
273 int wine_dbg_printf( const char *format, ... )
274 {
275  int ret;
276  va_list valist;
277 
279  ret = funcs.dbg_vprintf( format, valist );
280  va_end(valist);
281  return ret;
282 }
283 
284 /* printf with temp buffer allocation */
285 const char *wine_dbg_sprintf( const char *format, ... )
286 {
287  static const int max_size = 200;
288  char *ret;
289  int len;
290  va_list valist;
291 
293  ret = funcs.get_temp_buffer( max_size );
295  if (len == -1 || len >= max_size) ret[max_size-1] = 0;
296  else funcs.release_temp_buffer( ret, len + 1 );
297  va_end(valist);
298  return ret;
299 }
300 
301 
302 /* varargs wrapper for funcs.dbg_vlog */
303 int wine_dbg_log( enum __wine_debug_class cls, struct __wine_debug_channel *channel,
304  const char *func, const char *format, ... )
305 {
306  int ret;
307  va_list valist;
308 
309  if (!(__wine_dbg_get_channel_flags( channel ) & (1 << cls))) return -1;
310 
312  ret = funcs.dbg_vlog( cls, channel, NULL, func, 0, format, valist );
313  va_end(valist);
314  return ret;
315 }
316 
317 
318 /* ReactOS compliant debug format wrapper for funcs.dbg_vlog */
319 int ros_dbg_log( enum __wine_debug_class cls, struct __wine_debug_channel *channel,
320  const char *file, const char *func, const int line, const char *format, ... )
321 {
322  int ret;
323  va_list valist;
324 
325  if (!(__wine_dbg_get_channel_flags( channel ) & (1 << cls))) return -1;
326 
328  ret = funcs.dbg_vlog( cls, channel, file, func, line, format, valist );
329  va_end(valist);
330  return ret;
331 }
332 
333 
334 /* allocate some tmp string space */
335 /* FIXME: this is not 100% thread-safe */
336 static char *get_temp_buffer( size_t size )
337 {
338  static char *list[32];
339  static int pos;
340  char *ret;
341  int idx;
342 
343  idx = interlocked_xchg_add( &pos, 1 ) % (sizeof(list)/sizeof(list[0]));
344  if ((ret = realloc( list[idx], size ))) list[idx] = ret;
345  return ret;
346 }
347 
348 
349 /* release unused part of the buffer */
350 static void release_temp_buffer( char *buffer, size_t size )
351 {
352  /* don't bother doing anything */
353 }
354 
355 
356 /* default implementation of wine_dbgstr_an */
357 static const char *default_dbgstr_an( const char *str, int n )
358 {
359  static const char hex[16] = "0123456789abcdef";
360  char *dst, *res;
361  size_t size;
362 
363  if (!((ULONG_PTR)str >> 16))
364  {
365  if (!str) return "(null)";
366  res = funcs.get_temp_buffer( 6 );
367  sprintf( res, "#%04x", LOWORD(str) );
368  return res;
369  }
370  if (n == -1) n = strlen(str);
371  if (n < 0) n = 0;
372  size = 10 + min( 300, n * 4 );
373  dst = res = funcs.get_temp_buffer( size );
374  *dst++ = '"';
375  while (n-- > 0 && dst <= res + size - 9)
376  {
377  unsigned char c = *str++;
378  switch (c)
379  {
380  case '\n': *dst++ = '\\'; *dst++ = 'n'; break;
381  case '\r': *dst++ = '\\'; *dst++ = 'r'; break;
382  case '\t': *dst++ = '\\'; *dst++ = 't'; break;
383  case '"': *dst++ = '\\'; *dst++ = '"'; break;
384  case '\\': *dst++ = '\\'; *dst++ = '\\'; break;
385  default:
386  if (c >= ' ' && c <= 126)
387  *dst++ = c;
388  else
389  {
390  *dst++ = '\\';
391  *dst++ = 'x';
392  *dst++ = hex[(c >> 4) & 0x0f];
393  *dst++ = hex[c & 0x0f];
394  }
395  }
396  }
397  *dst++ = '"';
398  if (n > 0)
399  {
400  *dst++ = '.';
401  *dst++ = '.';
402  *dst++ = '.';
403  }
404  *dst++ = 0;
405  funcs.release_temp_buffer( res, dst - res );
406  return res;
407 }
408 
409 
410 /* default implementation of wine_dbgstr_wn */
411 static const char *default_dbgstr_wn( const WCHAR *str, int n )
412 {
413  char *dst, *res;
414  size_t size;
415 
416  if (!((ULONG_PTR)str >> 16))
417  {
418  if (!str) return "(null)";
419  res = funcs.get_temp_buffer( 6 );
420  sprintf( res, "#%04x", LOWORD(str) );
421  return res;
422  }
423  if (n == -1)
424  {
425  const WCHAR *end = str;
426  while (*end) end++;
427  n = end - str;
428  }
429  if (n < 0) n = 0;
430  size = 12 + min( 300, n * 5 );
431  dst = res = funcs.get_temp_buffer( size );
432  *dst++ = 'L';
433  *dst++ = '"';
434  while (n-- > 0 && dst <= res + size - 10)
435  {
436  WCHAR c = *str++;
437  switch (c)
438  {
439  case '\n': *dst++ = '\\'; *dst++ = 'n'; break;
440  case '\r': *dst++ = '\\'; *dst++ = 'r'; break;
441  case '\t': *dst++ = '\\'; *dst++ = 't'; break;
442  case '"': *dst++ = '\\'; *dst++ = '"'; break;
443  case '\\': *dst++ = '\\'; *dst++ = '\\'; break;
444  default:
445  if (c >= ' ' && c <= 126)
446  *dst++ = c;
447  else
448  {
449  *dst++ = '\\';
450  sprintf(dst,"%04x",c);
451  dst+=4;
452  }
453  }
454  }
455  *dst++ = '"';
456  if (n > 0)
457  {
458  *dst++ = '.';
459  *dst++ = '.';
460  *dst++ = '.';
461  }
462  *dst++ = 0;
463  funcs.release_temp_buffer( res, dst - res );
464  return res;
465 }
466 
467 
468 /* default implementation of wine_dbg_vprintf */
469 static int default_dbg_vprintf( const char *format, va_list args )
470 {
471  return vDbgPrintExWithPrefix("", -1, 0, format, args);
472 }
473 
474 
475 /* default implementation of wine_dbg_vlog */
476 /* Wine format */
478  const char *file, const char *func, const int line, const char *format, va_list args )
479 {
480  int ret = 0;
481 
482  if (TRACE_ON(pid))
485 
486  if (cls < sizeof(debug_classes)/sizeof(debug_classes[0]))
487  ret += wine_dbg_printf( "%s:%s:%s ", debug_classes[cls], channel->name, func );
488  if (format)
489  ret += funcs.dbg_vprintf( format, args );
490  return ret;
491 }
492 /* ReactOS format (default) */
494  const char *file, const char *func, const int line, const char *format, va_list args )
495 {
496  int ret = 0;
497 
498  if (TRACE_ON(tid))
500 
501  if (cls < sizeof(debug_classes)/sizeof(debug_classes[0]))
502  ret += wine_dbg_printf( "%s:", debug_classes[cls] );
503 
504  if (file && line)
505  ret += wine_dbg_printf( "(%s:%d) ", file, line );
506  else
507  ret += wine_dbg_printf( "%s:%s: ", channel->name, func );
508 
509  if (format)
510  ret += funcs.dbg_vprintf( format, args );
511  return ret;
512 }
513 /* Extended format */
515  const char *file, const char *func, const int line, const char *format, va_list args )
516 {
517  int ret = 0;
518 
519  if (TRACE_ON(pid) || TRACE_ON(tid))
520  {
521  ret += wine_dbg_printf( "[%04x:%04x]:",
524  }
525 
526  if (cls < sizeof(debug_classes)/sizeof(debug_classes[0]))
527  ret += wine_dbg_printf( "%s:", debug_classes[cls] );
528 
529  if (file && line)
530  ret += wine_dbg_printf( "(%s:%d):", file, line );
531 
532  ret += wine_dbg_printf( "%s:%s ", channel->name, func );
533 
534  if (format)
535  ret += funcs.dbg_vprintf( format, args );
536  return ret;
537 }
538 
539 /* wrappers to use the function pointers */
540 
541 const char *wine_dbgstr_an( const char * s, int n )
542 {
543  return funcs.dbgstr_an(s, n);
544 }
545 
546 const char *wine_dbgstr_wn( const WCHAR *s, int n )
547 {
548  return funcs.dbgstr_wn(s, n);
549 }
550 
551 void __wine_dbg_set_functions( const struct __wine_debug_functions *new_funcs,
552  struct __wine_debug_functions *old_funcs, size_t size )
553 {
554  if (old_funcs) memcpy( old_funcs, &funcs, min(sizeof(funcs),size) );
555  if (new_funcs) memcpy( &funcs, new_funcs, min(sizeof(funcs),size) );
556 }
557 
558 static struct __wine_debug_functions funcs =
559 {
566 };
#define realloc
Definition: debug_ros.c:6
GLenum func
Definition: glext.h:6028
#define vsnprintf
Definition: tif_win32.c:408
_In_ ULONG_PTR _In_ ULONG _Out_ ULONG_PTR * pid
Definition: winddi.h:3835
#define IN
Definition: typedefs.h:38
static void debug_init(void)
Definition: debug.c:220
#define memmove(s1, s2, n)
Definition: mkisofs.h:881
#define max(a, b)
Definition: svc.c:63
_In_ __drv_aliasesMem PSTRING Prefix
Definition: rtlfuncs.h:1631
static void parse_options(const char *str)
Definition: debug.c:152
int wine_dbg_printf(const char *format,...)
Definition: debug.c:273
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
#define __cdecl
Definition: accygwin.h:79
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
__wchar_t WCHAR
Definition: xmlstorage.h:180
_Check_return_ _CRTIMP size_t __cdecl strcspn(_In_z_ const char *_Str, _In_z_ const char *_Control)
#define free
Definition: debug_ros.c:5
long interlocked_xchg_add(long *dest, long incr)
static char * get_temp_buffer(size_t size)
Definition: debug.c:336
GLdouble n
Definition: glext.h:7729
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
#define HandleToULong(h)
Definition: basetsd.h:95
GLuint buffer
Definition: glext.h:5915
int ros_dbg_log(enum __wine_debug_class cls, struct __wine_debug_channel *channel, const char *file, const char *func, const int line, const char *format,...)
Definition: debug.c:319
_IRQL_requires_same_ typedef _In_ ULONG _In_ UCHAR Level
Definition: wmitypes.h:55
ACPI_BUFFER *RetBuffer ACPI_BUFFER *RetBuffer char ACPI_WALK_RESOURCE_CALLBACK void *Context ACPI_BUFFER *RetBuffer UINT16 ACPI_RESOURCE **ResourcePtr ACPI_GENERIC_ADDRESS *Reg UINT32 *ReturnValue UINT8 UINT8 *Slp_TypB ACPI_PHYSICAL_ADDRESS PhysicalAddress64 UINT32 UINT32 *TimeElapsed UINT32 ACPI_STATUS const char UINT32 ACPI_STATUS const char UINT32 const char const char UINT32 ComponentId
Definition: acpixf.h:1252
GLuint GLuint end
Definition: gl.h:1545
void __wine_dbg_set_functions(const struct __wine_debug_functions *new_funcs, struct __wine_debug_functions *old_funcs, size_t size)
Definition: debug.c:551
HANDLE UniqueProcess
Definition: compat.h:474
#define _strdup
Definition: debug_ros.c:7
static const char hex[16]
Definition: profile.c:123
Definition: match.c:390
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: gl.h:1546
uint32_t ULONG_PTR
Definition: typedefs.h:63
#define sprintf(buf, format,...)
Definition: sprintf.c:55
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
#define va_end(ap)
Definition: acmsvcex.h:90
static INT max_size
Definition: history.c:51
static int extfmt_default_dbg_vlog(enum __wine_debug_class cls, struct __wine_debug_channel *channel, const char *file, const char *func, const int line, const char *format, va_list args)
Definition: debug.c:514
unsigned int idx
Definition: utils.c:41
#define MAX_DEBUG_OPTIONS
Definition: debug.c:53
const WCHAR * str
smooth NULL
Definition: ftsmooth.c:416
Definition: parser.c:48
char * va_list
Definition: acmsvcex.h:78
static int winefmt_default_dbg_vlog(enum __wine_debug_class cls, struct __wine_debug_channel *channel, const char *file, const char *func, const int line, const char *format, va_list args)
Definition: debug.c:477
const char * LPCSTR
Definition: xmlstorage.h:183
static struct __wine_debug_channel debug_options[MAX_DEBUG_OPTIONS]
Definition: debug.c:57
int options
Definition: main.c:106
static const char * default_dbgstr_wn(const WCHAR *str, int n)
Definition: debug.c:411
const char * wine_dbgstr_wn(const WCHAR *s, int n)
Definition: debug.c:546
ULONG NTAPI vDbgPrintExWithPrefix(IN LPCSTR Prefix, IN ULONG ComponentId, IN ULONG Level, IN LPCSTR Format, IN va_list ap)
GLsizeiptr size
Definition: glext.h:5919
_Out_ PCLIENT_ID ClientId
Definition: kefuncs.h:1176
#define GetEnvironmentVariableA(x, y, z)
Definition: compat.h:411
static const char *const debug_classes[]
Definition: debug.c:51
static DWORD DWORD * dwLength
Definition: fusion.c:83
static unsigned char default_flags
Definition: debug.c:55
const GLubyte * c
Definition: glext.h:8905
static struct __wine_debug_functions funcs
Definition: debug.c:59
unsigned long DWORD
Definition: ntddk_ex.h:95
WINE_DECLARE_DEBUG_CHANNEL(pid)
static int rosfmt_default_dbg_vlog(enum __wine_debug_class cls, struct __wine_debug_channel *channel, const char *file, const char *func, const int line, const char *format, va_list args)
Definition: debug.c:493
#define SetLastError(x)
Definition: compat.h:409
HANDLE UniqueThread
Definition: compat.h:475
static int __cdecl cmp_name(const void *p1, const void *p2)
Definition: debug.c:75
int ret
int wine_dbg_log(enum __wine_debug_class cls, struct __wine_debug_channel *channel, const char *func, const char *format,...)
Definition: debug.c:303
unsigned char __wine_dbg_get_channel_flags(struct __wine_debug_channel *channel)
Definition: debug.c:83
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
GLenum GLsizei len
Definition: glext.h:6722
GLdouble s
Definition: gl.h:2039
Definition: _list.h:228
static void release_temp_buffer(char *buffer, size_t size)
Definition: debug.c:350
static int nb_debug_options
Definition: debug.c:56
static void add_option(const char *name, unsigned char set, unsigned char clear)
Definition: debug.c:118
const char * wine_dbg_sprintf(const char *format,...)
Definition: debug.c:285
__wine_debug_class
Definition: debug.h:48
static unsigned __int64 next
Definition: rand_nt.c:6
FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
Definition: psfuncs.h:420
GLenum GLenum dst
Definition: glext.h:6340
int __wine_dbg_set_channel_flags(struct __wine_debug_channel *channel, unsigned char set, unsigned char clear)
Definition: debug.c:99
#define list
Definition: rosglue.h:35
#define va_start(ap, A)
Definition: acmsvcex.h:91
#define min(a, b)
Definition: monoChain.cc:55
char * strchr(const char *String, int ch)
Definition: utclib.c:501
static const char * default_dbgstr_an(const char *str, int n)
Definition: debug.c:357
Definition: name.c:36
void int int ULONGLONG int va_list * ap
Definition: winesup.h:32
GLuint res
Definition: glext.h:9613
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
unsigned char flags
Definition: debug.h:61
#define c
Definition: ke_i.h:80
unsigned int ULONG
Definition: retypes.h:1
char name[15]
Definition: debug.h:62
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
#define malloc
Definition: debug_ros.c:4
static __ms_va_list valist
Definition: printf.c:59
GLfloat GLfloat p
Definition: glext.h:8902
const char * wine_dbgstr_an(const char *s, int n)
Definition: debug.c:541
Definition: _set.h:46
#define TRACE_ON(x)
Definition: compat.h:65
static TfClientId tid
#define LOWORD(l)
Definition: pedump.c:82
static int default_dbg_vprintf(const char *format, va_list args)
Definition: debug.c:469
Definition: fci.c:126
#define bsearch