update for HEAD-2003050101
[reactos.git] / lib / freetype / src / base / ftdebug.c
1 /***************************************************************************/
2 /*                                                                         */
3 /*  ftdebug.c                                                              */
4 /*                                                                         */
5 /*    Debugging and logging component (body).                              */
6 /*                                                                         */
7 /*  Copyright 1996-2001 by                                                 */
8 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
9 /*                                                                         */
10 /*  This file is part of the FreeType project, and may only be used,       */
11 /*  modified, and distributed under the terms of the FreeType project      */
12 /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
13 /*  this file you indicate that you have read the license and              */
14 /*  understand and accept it fully.                                        */
15 /*                                                                         */
16 /***************************************************************************/
17
18
19   /*************************************************************************/
20   /*                                                                       */
21   /* This component contains various macros and functions used to ease the */
22   /* debugging of the FreeType engine.  Its main purpose is in assertion   */
23   /* checking, tracing, and error detection.                               */
24   /*                                                                       */
25   /* There are now three debugging modes:                                  */
26   /*                                                                       */
27   /* - trace mode                                                          */
28   /*                                                                       */
29   /*   Error and trace messages are sent to the log file (which can be the */
30   /*   standard error output).                                             */
31   /*                                                                       */
32   /* - error mode                                                          */
33   /*                                                                       */
34   /*   Only error messages are generated.                                  */
35   /*                                                                       */
36   /* - release mode:                                                       */
37   /*                                                                       */
38   /*   No error message is sent or generated.  The code is free from any   */
39   /*   debugging parts.                                                    */
40   /*                                                                       */
41   /*************************************************************************/
42
43
44 #include <ft2build.h>
45 #include FT_FREETYPE_H
46 #include FT_INTERNAL_DEBUG_H
47
48
49 #if defined( FT_DEBUG_LEVEL_ERROR )
50
51   FT_EXPORT_DEF( void )
52   FT_Message( const char*  fmt, ... )
53   {
54     va_list  ap;
55
56
57     va_start( ap, fmt );
58     vprintf( fmt, ap );
59     va_end( ap );
60   }
61
62
63   FT_EXPORT_DEF( void )
64   FT_Panic( const char*  fmt, ... )
65   {
66     va_list  ap;
67
68
69     va_start( ap, fmt );
70     vprintf( fmt, ap );
71     va_end( ap );
72
73     exit( EXIT_FAILURE );
74   }
75
76 #endif /* FT_DEBUG_LEVEL_ERROR */
77
78
79
80 #ifdef FT_DEBUG_LEVEL_TRACE
81
82   /* array of trace levels, initialized to 0 */
83   int  ft_trace_levels[trace_count];
84
85   /* define array of trace toggle names */
86 #define FT_TRACE_DEF(x)  #x ,
87
88   static const char*  ft_trace_toggles[trace_count + 1] =
89   {
90 #include FT_INTERNAL_TRACE_H
91     NULL
92   };
93
94 #undef FT_TRACE_DEF
95
96
97   /*************************************************************************/
98   /*                                                                       */
99   /* Initialize the tracing sub-system.  This is done by retrieving the    */
100   /* value of the "FT2_DEBUG" environment variable.  It must be a list of  */
101   /* toggles, separated by spaces, `;' or `,'.  Example:                   */
102   /*                                                                       */
103   /*    "any:3 memory:6 stream:5"                                          */
104   /*                                                                       */
105   /* This will request that all levels be set to 3, except the trace level */
106   /* for the memory and stream components which are set to 6 and 5,        */
107   /* respectively.                                                         */
108   /*                                                                       */
109   /* See the file <freetype/internal/fttrace.h> for details of the         */
110   /* available toggle names.                                               */
111   /*                                                                       */
112   /* The level must be between 0 and 6; 0 means quiet (except for serious  */
113   /* runtime errors), and 6 means _very_ verbose.                          */
114   /*                                                                       */
115   FT_BASE_DEF( void )
116   ft_debug_init( void )
117   {
118     const char*  ft2_debug = getenv( "FT2_DEBUG" );
119
120     if ( ft2_debug )
121     {
122       const char*  p = ft2_debug;
123       const char*  q;
124
125
126       for ( ; *p; p++ )
127       {
128         /* skip leading whitespace and separators */
129         if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' )
130           continue;
131
132         /* read toggle name, followed by ':' */
133         q = p;
134         while ( *p && *p != ':' )
135           p++;
136           
137         if ( *p == ':' && p > q )
138         {
139           FT_Int  n, i, len = (FT_Int)(p - q);
140           FT_Int  level = -1, found = -1;
141
142
143           for ( n = 0; n < trace_count; n++ )
144           {
145             const char*  toggle = ft_trace_toggles[n];
146
147
148             for ( i = 0; i < len; i++ )
149             {
150               if ( toggle[i] != q[i] )
151                 break;
152             }
153
154             if ( i == len && toggle[i] == 0 )
155             {
156               found = n;
157               break;
158             }
159           }
160
161           /* read level */
162           p++;
163           if ( *p )
164           {
165             level = *p++ - '0';
166             if ( level < 0 || level > 6 )
167               level = -1;
168           }
169
170           if ( found >= 0 && level >= 0 )
171           {
172             if ( found == trace_any )
173             {
174               /* special case for "any" */
175               for ( n = 0; n < trace_count; n++ )
176                 ft_trace_levels[n] = level;
177             }
178             else
179               ft_trace_levels[found] = level;
180           }
181         }
182       }
183     }
184   }
185
186 #else  /* !FT_DEBUG_LEVEL_TRACE */
187
188   FT_BASE_DEF( void )
189   ft_debug_init( void )
190   {
191     /* nothing */
192   }
193
194 #endif /* !FT_DEBUG_LEVEL_TRACE */
195
196
197 /* END */