Initialize Tizen 2.3
[framework/graphics/freetype.git] / builds / win32 / ftdebug.c
1 /***************************************************************************/
2 /*                                                                         */
3 /*  ftdebug.c                                                              */
4 /*                                                                         */
5 /*    Debugging and logging component for Win32 (body).                    */
6 /*                                                                         */
7 /*  Copyright 1996-2001, 2002, 2005, 2008, 2009 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_INTERNAL_DEBUG_H
46
47
48 #ifdef FT_DEBUG_LEVEL_ERROR
49
50
51 #include <stdarg.h>
52 #include <stdlib.h>
53 #include <string.h>
54
55 #include <windows.h>
56
57
58   FT_BASE_DEF( void )
59   FT_Message( const char*  fmt, ... )
60   {
61     static char  buf[8192];
62     va_list      ap;
63
64
65     va_start( ap, fmt );
66     vprintf( fmt, ap );
67     /* send the string to the debugger as well */
68     vsprintf( buf, fmt, ap );
69     OutputDebugStringA( buf );
70     va_end( ap );
71   }
72
73
74   FT_BASE_DEF( void )
75   FT_Panic( const char*  fmt, ... )
76   {
77     static char  buf[8192];
78     va_list      ap;
79
80
81     va_start( ap, fmt );
82     vsprintf( buf, fmt, ap );
83     OutputDebugStringA( buf );
84     va_end( ap );
85
86     exit( EXIT_FAILURE );
87   }
88
89
90 #ifdef FT_DEBUG_LEVEL_TRACE
91
92
93   /* array of trace levels, initialized to 0 */
94   int  ft_trace_levels[trace_count];
95
96   /* define array of trace toggle names */
97 #define FT_TRACE_DEF( x )  #x ,
98
99   static const char*  ft_trace_toggles[trace_count + 1] =
100   {
101 #include FT_INTERNAL_TRACE_H
102     NULL
103   };
104
105 #undef FT_TRACE_DEF
106
107
108   /*************************************************************************/
109   /*                                                                       */
110   /* Initialize the tracing sub-system.  This is done by retrieving the    */
111   /* value of the "FT2_DEBUG" environment variable.  It must be a list of  */
112   /* toggles, separated by spaces, `;' or `,'.  Example:                   */
113   /*                                                                       */
114   /*    "any:3 memory:6 stream:5"                                          */
115   /*                                                                       */
116   /* This will request that all levels be set to 3, except the trace level */
117   /* for the memory and stream components which are set to 6 and 5,        */
118   /* respectively.                                                         */
119   /*                                                                       */
120   /* See the file <freetype/internal/fttrace.h> for details of the         */
121   /* available toggle names.                                               */
122   /*                                                                       */
123   /* The level must be between 0 and 6; 0 means quiet (except for serious  */
124   /* runtime errors), and 6 means _very_ verbose.                          */
125   /*                                                                       */
126   FT_BASE_DEF( void )
127   ft_debug_init( void )
128   {
129     const char*  ft2_debug = getenv( "FT2_DEBUG" );
130
131
132     if ( ft2_debug )
133     {
134       const char*  p = ft2_debug;
135       const char*  q;
136
137
138       for ( ; *p; p++ )
139       {
140         /* skip leading whitespace and separators */
141         if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' )
142           continue;
143
144         /* read toggle name, followed by ':' */
145         q = p;
146         while ( *p && *p != ':' )
147           p++;
148
149         if ( *p == ':' && p > q )
150         {
151           int  n, i, len = p - q;
152           int  level = -1, found = -1;
153
154
155           for ( n = 0; n < trace_count; n++ )
156           {
157             const char*  toggle = ft_trace_toggles[n];
158
159
160             for ( i = 0; i < len; i++ )
161             {
162               if ( toggle[i] != q[i] )
163                 break;
164             }
165
166             if ( i == len && toggle[i] == 0 )
167             {
168               found = n;
169               break;
170             }
171           }
172
173           /* read level */
174           p++;
175           if ( *p )
176           {
177             level = *p++ - '0';
178             if ( level < 0 || level > 7 )
179               level = -1;
180           }
181
182           if ( found >= 0 && level >= 0 )
183           {
184             if ( found == trace_any )
185             {
186               /* special case for "any" */
187               for ( n = 0; n < trace_count; n++ )
188                 ft_trace_levels[n] = level;
189             }
190             else
191               ft_trace_levels[found] = level;
192           }
193         }
194       }
195     }
196   }
197
198
199 #else  /* !FT_DEBUG_LEVEL_TRACE */
200
201
202   FT_BASE_DEF( void )
203   ft_debug_init( void )
204   {
205     /* nothing */
206   }
207
208
209 #endif /* !FT_DEBUG_LEVEL_TRACE */
210
211 #endif /* FT_DEBUG_LEVEL_ERROR */
212
213
214 /* END */