tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

ftdebug.c (7493B)


      1 /****************************************************************************
      2 *
      3 * ftdebug.c
      4 *
      5 *   Debugging and logging component for WinCE (body).
      6 *
      7 * Copyright (C) 1996-2025 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 <freetype/freetype.h>
     45 #include <freetype/internal/ftdebug.h>
     46 
     47 
     48 #ifdef FT_DEBUG_LEVEL_ERROR
     49 
     50 #include <stdarg.h>
     51 #include <stdlib.h>
     52 #include <string.h>
     53 
     54 #include <windows.h>
     55 
     56 
     57  static void
     58  OutputDebugStringEx( const char*  str )
     59  {
     60    static WCHAR  buf[8192];
     61 
     62    int  sz = MultiByteToWideChar( CP_ACP, 0, str, -1, buf,
     63                                   sizeof ( buf ) / sizeof ( *buf ) );
     64 
     65 
     66    if ( !sz )
     67      lstrcpyW( buf, L"OutputDebugStringEx: MultiByteToWideChar failed" );
     68 
     69    OutputDebugStringW( buf );
     70  }
     71 
     72 
     73  /* documentation is in ftdebug.h */
     74 
     75  FT_BASE_DEF( void )
     76  FT_Message( const char*  fmt,
     77              ... )
     78  {
     79    static char  buf[8192];
     80    va_list      ap;
     81 
     82 
     83    va_start( ap, fmt );
     84    vfprintf( stderr, fmt, ap );
     85    /* send the string to the debugger as well */
     86    vsprintf( buf, fmt, ap );
     87    OutputDebugStringEx( buf );
     88    va_end( ap );
     89  }
     90 
     91 
     92  /* documentation is in ftdebug.h */
     93 
     94  FT_BASE_DEF( void )
     95  FT_Panic( const char*  fmt,
     96            ... )
     97  {
     98    static char  buf[8192];
     99    va_list      ap;
    100 
    101 
    102    va_start( ap, fmt );
    103    vsprintf( buf, fmt, ap );
    104    OutputDebugStringEx( buf );
    105    va_end( ap );
    106 
    107    exit( EXIT_FAILURE );
    108  }
    109 
    110 
    111  /* documentation is in ftdebug.h */
    112 
    113  FT_BASE_DEF( int )
    114  FT_Throw( FT_Error     error,
    115            int          line,
    116            const char*  file )
    117  {
    118 #if 0
    119    /* activating the code in this block makes FreeType very chatty */
    120    fprintf( stderr,
    121             "%s:%d: error 0x%02x: %s\n",
    122             file,
    123             line,
    124             error,
    125             FT_Error_String( error ) );
    126 #else
    127    FT_UNUSED( error );
    128    FT_UNUSED( line );
    129    FT_UNUSED( file );
    130 #endif
    131 
    132    return 0;
    133  }
    134 
    135 #endif /* FT_DEBUG_LEVEL_ERROR */
    136 
    137 
    138 #ifdef FT_DEBUG_LEVEL_TRACE
    139 
    140  /* array of trace levels, initialized to 0; */
    141  /* this gets adjusted at run-time           */
    142  static int  ft_trace_levels_enabled[trace_count];
    143 
    144  /* array of trace levels, always initialized to 0 */
    145  static int  ft_trace_levels_disabled[trace_count];
    146 
    147  /* a pointer to either `ft_trace_levels_enabled' */
    148  /* or `ft_trace_levels_disabled'                 */
    149  int*  ft_trace_levels;
    150 
    151  /* define array of trace toggle names */
    152 #define FT_TRACE_DEF( x )  #x ,
    153 
    154  static const char*  ft_trace_toggles[trace_count + 1] =
    155  {
    156 #include <freetype/internal/fttrace.h>
    157    NULL
    158  };
    159 
    160 #undef FT_TRACE_DEF
    161 
    162 
    163  /* documentation is in ftdebug.h */
    164 
    165  FT_BASE_DEF( FT_Int )
    166  FT_Trace_Get_Count( void )
    167  {
    168    return trace_count;
    169  }
    170 
    171 
    172  /* documentation is in ftdebug.h */
    173 
    174  FT_BASE_DEF( const char * )
    175  FT_Trace_Get_Name( FT_Int  idx )
    176  {
    177    int  max = FT_Trace_Get_Count();
    178 
    179 
    180    if ( idx < max )
    181      return ft_trace_toggles[idx];
    182    else
    183      return NULL;
    184  }
    185 
    186 
    187  /* documentation is in ftdebug.h */
    188 
    189  FT_BASE_DEF( void )
    190  FT_Trace_Disable( void )
    191  {
    192    ft_trace_levels = ft_trace_levels_disabled;
    193  }
    194 
    195 
    196  /* documentation is in ftdebug.h */
    197 
    198  FT_BASE_DEF( void )
    199  FT_Trace_Enable( void )
    200  {
    201    ft_trace_levels = ft_trace_levels_enabled;
    202  }
    203 
    204 
    205  /**************************************************************************
    206   *
    207   * Initialize the tracing sub-system.  This is done by retrieving the
    208   * value of the `FT2_DEBUG' environment variable.  It must be a list of
    209   * toggles, separated by spaces, `;', or `,'.  Example:
    210   *
    211   *   export FT2_DEBUG="any:3 memory:7 stream:5"
    212   *
    213   * This requests that all levels be set to 3, except the trace level for
    214   * the memory and stream components which are set to 7 and 5,
    215   * respectively.
    216   *
    217   * See the file `include/freetype/internal/fttrace.h' for details of
    218   * the available toggle names.
    219   *
    220   * The level must be between 0 and 7; 0 means quiet (except for serious
    221   * runtime errors), and 7 means _very_ verbose.
    222   */
    223  FT_BASE_DEF( void )
    224  ft_debug_init( void )
    225  {
    226    /* Windows Mobile doesn't have environment API:           */
    227    /* GetEnvironmentStrings, GetEnvironmentVariable, getenv. */
    228    /*                                                        */
    229    /* FIXME!!! How to set debug mode?                        */
    230 
    231    /* const char*  ft2_debug = getenv( "FT2_DEBUG" ); */
    232 
    233    const char*  ft2_debug = NULL;
    234 
    235 
    236    if ( ft2_debug )
    237    {
    238      const char*  p = ft2_debug;
    239      const char*  q;
    240 
    241 
    242      for ( ; *p; p++ )
    243      {
    244        /* skip leading whitespace and separators */
    245        if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' )
    246          continue;
    247 
    248        /* read toggle name, followed by ':' */
    249        q = p;
    250        while ( *p && *p != ':' )
    251          p++;
    252 
    253        if ( !*p )
    254          break;
    255 
    256        if ( *p == ':' && p > q )
    257        {
    258          FT_Int  n, i, len = (FT_Int)( p - q );
    259          FT_Int  level = -1, found = -1;
    260 
    261 
    262          for ( n = 0; n < trace_count; n++ )
    263          {
    264            const char*  toggle = ft_trace_toggles[n];
    265 
    266 
    267            for ( i = 0; i < len; i++ )
    268            {
    269              if ( toggle[i] != q[i] )
    270                break;
    271            }
    272 
    273            if ( i == len && toggle[i] == 0 )
    274            {
    275              found = n;
    276              break;
    277            }
    278          }
    279 
    280          /* read level */
    281          p++;
    282          if ( *p )
    283          {
    284            level = *p - '0';
    285            if ( level < 0 || level > 7 )
    286              level = -1;
    287          }
    288 
    289          if ( found >= 0 && level >= 0 )
    290          {
    291            if ( found == trace_any )
    292            {
    293              /* special case for `any' */
    294              for ( n = 0; n < trace_count; n++ )
    295                ft_trace_levels_enabled[n] = level;
    296            }
    297            else
    298              ft_trace_levels_enabled[found] = level;
    299          }
    300        }
    301      }
    302    }
    303 
    304    ft_trace_levels = ft_trace_levels_enabled;
    305  }
    306 
    307 
    308 #else  /* !FT_DEBUG_LEVEL_TRACE */
    309 
    310 
    311  FT_BASE_DEF( void )
    312  ft_debug_init( void )
    313  {
    314    /* nothing */
    315  }
    316 
    317 
    318  FT_BASE_DEF( FT_Int )
    319  FT_Trace_Get_Count( void )
    320  {
    321    return 0;
    322  }
    323 
    324 
    325  FT_BASE_DEF( const char * )
    326  FT_Trace_Get_Name( FT_Int  idx )
    327  {
    328    FT_UNUSED( idx );
    329 
    330    return NULL;
    331  }
    332 
    333 
    334  FT_BASE_DEF( void )
    335  FT_Trace_Disable( void )
    336  {
    337    /* nothing */
    338  }
    339 
    340 
    341  /* documentation is in ftdebug.h */
    342 
    343  FT_BASE_DEF( void )
    344  FT_Trace_Enable( void )
    345  {
    346    /* nothing */
    347  }
    348 
    349 
    350 #endif /* !FT_DEBUG_LEVEL_TRACE */
    351 
    352 
    353 /* END */