* include/freetype/internal/ftdebug.h, src/base/ftdebug.c: modified
        the debug sub-system initialization. trace levels can now be specified
        within the "FT2_DEBUG" environment variable. See the comments within
        "ftdebug.c" for more details

        * include/freetype/internal/fttrace.h: new file to define the trace
        levels used for debugging. it is used both to define enums and
        toggle names for FT2_DEBUG

        * src/base/ftobjs.c, src/base/ftstream.c: FT_Assert renamed to
        FT_ASSERT

        * include/freetype/internal/ftextend.h, src/base/ftextend.c,
        src/base/Jamfile, src/base/rules.mk: removing "ftextend" from the
        library, since it is now completely obsolete..
diff --git a/ChangeLog b/ChangeLog
index 5d1407d..e96f5ac 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,8 +1,39 @@
+2002-02-21  David Turner  <david@freetype.org>
+
+        * include/freetype/internal/ftdebug.h, src/base/ftdebug.c: modified
+        the debug sub-system initialization. trace levels can now be specified
+        within the "FT2_DEBUG" environment variable. See the comments within
+        "ftdebug.c" for more details
+
+        * include/freetype/internal/fttrace.h: new file to define the trace
+        levels used for debugging. it is used both to define enums and
+        toggle names for FT2_DEBUG
+
+        * src/base/ftobjs.c, src/base/ftstream.c: FT_Assert renamed to
+        FT_ASSERT
+
+        * include/freetype/internal/ftextend.h, src/base/ftextend.c,
+        src/base/Jamfile, src/base/rules.mk: removing "ftextend" from the
+        library, since it is now completely obsolete..
+
+        * include/freetype/fterrors.h: adding "#undef FT_ERR_CAT" to avoid
+        warnings with certain compilers (like LCC)
+
+        * src/pshinter/pshalgo2.c: renaming 'print_zone' to 'psh2_print_zone'
+        to avoid errors during compilation of debug library
+
+
+2002-02-20  David Turner  <david@freetype.org>
+
+        * README: adding "devel@freetype.org" address for bug reports..
+
+
 2002-02-20  Werner Lemberg  <wl@gnu.org>
 
 	* builds/unix/install.mk (check): New dummy target.
 	(.PHONY): Add it.
 
+
 2002-02-19  Werner Lemberg  <wl@gnu.org>
 
 	* builds/freetype.mk (FT_CFLAGS): Use $(INCLUDE_FLAGS) first.
diff --git a/include/freetype/config/ftoption.h b/include/freetype/config/ftoption.h
index 506663b..d163677 100644
--- a/include/freetype/config/ftoption.h
+++ b/include/freetype/config/ftoption.h
@@ -250,7 +250,7 @@
   /*   Don't define any of these macros to compile in `release' mode!      */
   /*                                                                       */
 #undef  FT_DEBUG_LEVEL_ERROR
-#undef  FT_DEBUG_LEVEL_TRACE
+#define FT_DEBUG_LEVEL_TRACE
 
 
   /*************************************************************************/
diff --git a/include/freetype/fterrors.h b/include/freetype/fterrors.h
index 89e0cf3..85dd658 100644
--- a/include/freetype/fterrors.h
+++ b/include/freetype/fterrors.h
@@ -105,6 +105,10 @@
 
 
 #undef  FT_NEED_EXTERN_C
+
+#undef  FT_ERR_XCAT
+#undef  FT_ERR_CAT
+
 #define FT_ERR_XCAT( x, y )  x ## y
 #define FT_ERR_CAT( x, y )   FT_ERR_XCAT( x, y )
 
@@ -192,6 +196,11 @@
                "invalid argument" )
   FT_ERRORDEF_( Unimplemented_Feature,                       0x07, \
                "unimplemented feature" )
+  FT_ERRORDEF_( Invalid_Table,                               0x08, \
+                "broken table" )
+  FT_ERRORDEF_( Invalid_Offset,                              0x09, \
+                "broken offset within table" )
+
 
   /* glyph/character errors */
 
diff --git a/include/freetype/internal/ftdebug.h b/include/freetype/internal/ftdebug.h
index e18acbb..b13aa78 100644
--- a/include/freetype/internal/ftdebug.h
+++ b/include/freetype/internal/ftdebug.h
@@ -27,99 +27,48 @@
 FT_BEGIN_HEADER
 
 
+/* force the definition of FT_DEBUG_LEVEL_ERROR if FT_DEBUG_LEVEL_TRACE */
+/* is already defined.. this simplifies the following #ifdefs..         */
+/*                                                                      */
+#ifdef FT_DEBUG_LEVEL_TRACE
+#  undef  FT_DEBUG_LEVEL_ERROR
+#  define FT_DEBUG_LEVEL_ERROR
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  Define the trace enums as well as the trace levels array when        */
+  /*  they're needed                                                       */
+  /*                                                                       */
+  /*************************************************************************/
+
 #ifdef FT_DEBUG_LEVEL_TRACE
 
+#  define FT_TRACE_DEF(x)   trace_ ## x ,
 
-  /* note that not all levels are used currently */
-
-  typedef enum  FT_Trace_
+ /* defining the enums */ 
+  typedef enum
   {
-    /* the first level must always be `trace_any' */
-    trace_any = 0,
-
-    /* base components */
-    trace_aaraster,  /* anti-aliasing raster    (ftgrays.c)  */
-    trace_calc,      /* calculations            (ftcalc.c)   */
-    trace_extend,    /* extension manager       (ftextend.c) */
-    trace_glyph,     /* glyph manager           (ftglyph.c)  */
-    trace_io,        /* i/o monitoring          (ftsystem.c) */
-    trace_init,      /* initialization          (ftinit.c)   */
-    trace_list,      /* list manager            (ftlist.c)   */
-    trace_memory,    /* memory manager          (ftobjs.c)   */
-    trace_mm,        /* MM interface            (ftmm.c)     */
-    trace_objs,      /* base objects            (ftobjs.c)   */
-    trace_outline,   /* outline management      (ftoutln.c)  */
-    trace_raster,    /* rasterizer              (ftraster.c) */
-    trace_stream,    /* stream manager          (ftstream.c) */
-
-    /* Cache sub-system */
-    trace_cache,
-
-    /* SFNT driver components */
-    trace_sfobjs,    /* SFNT object handler     (sfobjs.c)   */
-    trace_ttcmap,    /* charmap handler         (ttcmap.c)   */
-    trace_ttload,    /* basic TrueType tables   (ttload.c)   */
-    trace_ttpost,    /* PS table processing     (ttpost.c)   */
-    trace_ttsbit,    /* TrueType sbit handling  (ttsbit.c)   */
-
-    /* TrueType driver components */
-    trace_ttdriver,  /* TT font driver          (ttdriver.c) */
-    trace_ttgload,   /* TT glyph loader         (ttgload.c)  */
-    trace_ttinterp,  /* bytecode interpreter    (ttinterp.c) */
-    trace_ttobjs,    /* TT objects manager      (ttobjs.c)   */
-    trace_ttpload,   /* TT data/program loader  (ttpload.c)  */
-
-    /* Type 1 driver components */
-    trace_t1driver,
-    trace_t1gload,
-    trace_t1hint,
-    trace_t1load,
-    trace_t1objs,
-    trace_t1parse,
-
-    /* PostScript helper module `psaux' */
-    trace_t1decode,
-    trace_psobjs,
-
-    /* PostScript hinting module `pshinter' */
-    trace_pshrec,
-    trace_pshalgo1,
-    trace_pshalgo2,
-
-    /* Type 2 driver components */
-    trace_cffdriver,
-    trace_cffgload,
-    trace_cffload,
-    trace_cffobjs,
-    trace_cffparse,
-
-    /* CID driver components */
-    trace_cidafm,
-    trace_ciddriver,
-    trace_cidgload,
-    trace_cidload,
-    trace_cidobjs,
-    trace_cidparse,
-
-    /* Windows fonts component */
-    trace_winfnt,
-
-    /* PCF fonts component */
-    trace_pcfdriver,
-    trace_pcfread,
-
-    /* the last level must always be `trace_max' */
-    trace_max
+#  include FT_INTERNAL_TRACE_H  
+    trace_count,
 
   } FT_Trace;
 
 
-  /* declared in ftdebug.c */
-  extern char  ft_trace_levels[trace_max];
+ /* defining the array of trace levels, provided by 'src/base/ftdebug.c' */
+  extern  int  ft_trace_levels [ trace_count ];
+
+#  undef FT_TRACE_DEF
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
 
 
   /*************************************************************************/
   /*                                                                       */
+  /*  Define the FT_TRACE macro                                            */
+  /*                                                                       */
   /* IMPORTANT!                                                            */
   /*                                                                       */
   /* Each component must define the macro FT_COMPONENT to a valid FT_Trace */
@@ -127,90 +76,20 @@
   /*                                                                       */
   /*************************************************************************/
 
+#ifdef FT_DEBUG_LEVEL_TRACE
 
-#define FT_TRACE( level, varformat )                      \
+#  define FT_TRACE( level, varformat )                    \
           do                                              \
           {                                               \
             if ( ft_trace_levels[FT_COMPONENT] >= level ) \
               FT_Message varformat;                       \
           } while ( 0 )
 
+#else /* !FT_DEBUG_LEVEL_TRACE */
 
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_SetTraceLevel                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Sets the trace level for debugging.                                */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    component :: The component which should be traced.  See above for  */
-  /*                 a complete list.  If set to `trace_any', all          */
-  /*                 components will be traced.                            */
-  /*                                                                       */
-  /*    level     :: The tracing level.                                    */
-  /*                                                                       */
-  FT_EXPORT( void )
-  FT_SetTraceLevel( FT_Trace  component,
-                    char      level );
+#  define FT_TRACE( level, varformat )  do ; while ( 0 )      /* nothing */
 
-
-#elif defined( FT_DEBUG_LEVEL_ERROR )
-
-
-#define FT_TRACE( level, varformat )  do ; while ( 0 )      /* nothing */
-
-
-#else  /* release mode */
-
-
-#define FT_Assert( condition )        do ; while ( 0 )      /* nothing */
-
-#define FT_TRACE( level, varformat )  do ; while ( 0 )      /* nothing */
-#define FT_ERROR( varformat )         do ; while ( 0 )      /* nothing */
-
-
-#endif /* FT_DEBUG_LEVEL_TRACE, FT_DEBUG_LEVEL_ERROR */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Define macros and functions that are common to the debug and trace    */
-  /* modes.                                                                */
-  /*                                                                       */
-  /* You need vprintf() to be able to compile ftdebug.c.                   */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-#if defined( FT_DEBUG_LEVEL_TRACE ) || defined( FT_DEBUG_LEVEL_ERROR )
-
-
-#include "stdio.h"  /* for vprintf() */
-
-
-#define FT_Assert( condition )                                      \
-          do                                                        \
-          {                                                         \
-            if ( !( condition ) )                                   \
-              FT_Panic( "assertion failed on line %d of file %s\n", \
-                        __LINE__, __FILE__ );                       \
-          } while ( 0 )
-
-  /* print a message */
-  FT_EXPORT( void )
-  FT_Message( const char*  fmt, ... );
-
-  /* print a message and exit */
-  FT_EXPORT( void )
-  FT_Panic( const char*  fmt, ... );
-
-#define FT_ERROR( varformat )  FT_Message varformat
-
-
-#endif /* FT_DEBUG_LEVEL_TRACE || FT_DEBUG_LEVEL_ERROR */
-
+#endif /* !FT_DEBUG_LEVEL_TRACE */
 
   /*************************************************************************/
   /*                                                                       */
@@ -230,6 +109,72 @@
 #define FT_TRACE7( varformat )  FT_TRACE( 7, varformat )
 
 
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  Define the FT_ERROR macro                                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+
+#  define FT_ERROR( varformat )  FT_Message  varformat
+
+#else  /* !FT_DEBUG_LEVEL_ERROR */
+
+#  define FT_ERROR( varformat )  do ; while ( 0 )      /* nothing */
+
+#endif /* !FT_DEBUG_LEVEL_ERROR */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  Define the FT_ASSERT macro                                           */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+
+#define FT_ASSERT( condition )                                      \
+          do                                                        \
+          {                                                         \
+            if ( !( condition ) )                                   \
+              FT_Panic( "assertion failed on line %d of file %s\n", \
+                        __LINE__, __FILE__ );                       \
+          } while ( 0 )
+
+#else /* !FT_DEBUG_LEVEL_ERROR */
+
+#  define  FT_ASSERT( condition )      do ; while ( 0 )
+
+#endif /* !FT_DEBUG_LEVEL_ERROR */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  Define 'FT_Message' and 'FT_Panic' when needed                       */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+
+#include "stdio.h"  /* for vprintf() */
+
+  /* print a message */
+  FT_EXPORT( void )
+  FT_Message( const char*  fmt, ... );
+
+  /* print a message and exit */
+  FT_EXPORT( void )
+  FT_Panic( const char*  fmt, ... );
+
+#endif /* FT_DEBUG_LEVEL_ERROR */
+
+
+
+  FT_BASE( void )   ft_debug_init( void );
+
+
 #if defined( _MSC_VER )      /* Visual C++ (and Intel C++) */
 
   /* we disable the warning `conditional expression is constant' here */
diff --git a/include/freetype/internal/ftextend.h b/include/freetype/internal/ftextend.h
deleted file mode 100644
index 8257a2a..0000000
--- a/include/freetype/internal/ftextend.h
+++ /dev/null
@@ -1,211 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftextend.h                                                             */
-/*                                                                         */
-/*    FreeType extensions implementation (specification).                  */
-/*                                                                         */
-/*  Copyright 1996-2001 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#ifndef __FTEXTEND_H__
-#define __FTEXTEND_H__
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_OBJECTS_H
-
-
-FT_BEGIN_HEADER
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* The extensions don't need to be integrated at compile time into the   */
-  /* engine, only at link time.                                            */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    FT_Extension_Initializer                                           */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Each new face object can have several extensions associated with   */
-  /*    it at creation time.  This function is used to initialize given    */
-  /*    extension data for a given face.                                   */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    ext  :: A typeless pointer to the extension data.                  */
-  /*                                                                       */
-  /*    face :: A handle to the source face object the extension is        */
-  /*            associated with.                                           */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    In case of error, the initializer should not destroy the extension */
-  /*    data, as the finalizer will get called later by the function's     */
-  /*    caller.                                                            */
-  /*                                                                       */
-  typedef FT_Error
-  (*FT_Extension_Initializer)( void*    ext,
-                               FT_Face  face );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    FT_Extension_Finalizer                                             */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Each new face object can have several extensions associated with   */
-  /*    it at creation time.  This function is used to finalize given      */
-  /*    extension data for a given face; it occurs before the face object  */
-  /*    itself is finalized.                                               */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    ext  :: A typeless pointer to the extension data.                  */
-  /*                                                                       */
-  /*    face :: A handle to the source face object the extension is        */
-  /*            associated with.                                           */
-  /*                                                                       */
-  typedef void
-  (*FT_Extension_Finalizer)( void*    ext,
-                             FT_Face  face );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_Extension_Class                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A simple structure used to describe a given extension to the       */
-  /*    FreeType base layer.  An FT_Extension_Class is used as a parameter */
-  /*    for FT_Register_Extension().                                       */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    id        :: The extension's ID.  This is a normal C string that   */
-  /*                 is used to uniquely reference the extension's         */
-  /*                 interface.                                            */
-  /*                                                                       */
-  /*    size      :: The size in bytes of the extension data that must be  */
-  /*                 associated with each face object.                     */
-  /*                                                                       */
-  /*    init      :: A pointer to the extension data's initializer.        */
-  /*                                                                       */
-  /*    finalize  :: A pointer to the extension data's finalizer.          */
-  /*                                                                       */
-  /*    interface :: This pointer can be anything, but should usually      */
-  /*                 point to a table of function pointers which implement */
-  /*                 the extension's interface.                            */
-  /*                                                                       */
-  /*    offset    :: This field is set and used within the base layer and  */
-  /*                 should be set to 0 when registering an extension      */
-  /*                 through FT_Register_Extension().  It contains an      */
-  /*                 offset within the face's extension block for the      */
-  /*                 current extension's data.                             */
-  /*                                                                       */
-  typedef struct  FT_Extension_Class_
-  {
-    const char*               id;
-    FT_ULong                  size;
-    FT_Extension_Initializer  init;
-    FT_Extension_Finalizer    finalize;
-    void*                     interface;
-
-    FT_ULong                  offset;
-
-  } FT_Extension_Class;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Register_Extension                                              */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Registers a new extension.                                         */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    driver :: A handle to the driver object.                           */
-  /*                                                                       */
-  /*    class  :: A pointer to a class describing the extension.           */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Register_Extension( FT_Driver            driver,
-                         FT_Extension_Class*  clazz );
-
-
-#ifdef FT_CONFIG_OPTION_EXTEND_ENGINE
-
-
-  /* Initialize the extension component */
-  FT_LOCAL FT_Error
-  FT_Init_Extensions( FT_Library  library );
-
-  /* Finalize the extension component */
-  FT_LOCAL FT_Error
-  FT_Done_Extensions( FT_Library  library );
-
-  /* Create an extension within a face object.  Called by the */
-  /* face object constructor.                                 */
-  FT_LOCAL FT_Error
-  FT_Create_Extensions( FT_Face  face );
-
-  /* Destroy all extensions within a face object.  Called by the */
-  /* face object destructor.                                     */
-  FT_LOCAL FT_Error
-  FT_Destroy_Extensions( FT_Face  face );
-
-
-#endif
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Get_Extension                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Queries an extension block by an extension ID string.              */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face                :: A handle to the face object.                */
-  /*    extension_id        :: An ID string identifying the extension.     */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    extension_interface :: A generic pointer, usually pointing to a    */
-  /*                           table of functions implementing the         */
-  /*                           extension interface.                        */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    A generic pointer to the extension block.                          */
-  /*                                                                       */
-  FT_EXPORT( void* )
-  FT_Get_Extension( FT_Face      face,
-                    const char*  extension_id,
-                    void**       extension_interface );
-
-
-FT_END_HEADER
-
-#endif /* __FTEXTEND_H__ */
-
-
-/* END */
diff --git a/include/freetype/internal/ftobjs.h b/include/freetype/internal/ftobjs.h
index 755faf8..43a44d0 100644
--- a/include/freetype/internal/ftobjs.h
+++ b/include/freetype/internal/ftobjs.h
@@ -26,7 +26,7 @@
 #ifndef __FTOBJS_H__
 #define __FTOBJS_H__
 
-
+#include <setjmp.h>
 #include <ft2build.h>
 #include FT_RENDER_H
 #include FT_SIZES_H
@@ -450,6 +450,171 @@
   /*************************************************************************/
   /****                                                                 ****/
   /****                                                                 ****/
+  /****                         V A L I D A T O R                       ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef struct FT_ValidatorRec_*   FT_Validator;
+
+/*********************************************************************
+ *
+ * there are three distinct validation levels here:
+ *
+ *  DEFAULT ::
+ *    used to perform normal checks. A table validated with this setting
+ *    is sufficiently correct to be used reliably by FreeType
+ *
+ *  TIGHT ::
+ *    this is more strict than default. A table validated with this setting
+ *    is sufficiently correct to be used reliablity by FreeType and to not
+ *    contain invalid data (that will not crash FreeType or produce bogus
+ *    warnings). This is used to spot font converter/generation tool
+ *    bugs..
+ *
+ *    for example, a CharMap table could map a given character code to
+ *    a glyph index that is larger than the number of available glyphs
+ *    in the font. Such a table would not pass the "TIGHT" validation
+ *    even though it can be used safely with FreeType (which will later
+ *    report errors when trying to load the glyph, for example..)
+ *
+ *
+ *  PARANOID ::
+ *    in this mode, everything is checked to the maximum, and according
+ *    to the specification(s) defining the tables being checked. Really
+ *    useful for font fascists and to spot really weird font artefacts.
+ *
+ *    Beware that most fonts will simply not pass this validation level
+ *    though !!
+ */
+ typedef enum
+ {
+   FT_VALIDATE_DEFAULT = 0,
+   FT_VALIDATE_TIGHT,
+   FT_VALIDATE_PARANOID
+
+ } FT_ValidationLevel;
+
+
+/**********************************************************************
+ *
+ * to use it, you need something like:
+ *
+ *   valid->error = 0;
+ *
+ *   if ( setjmp( valid->jump_buffer ) == 0 )
+ *     validate_table( table_data, .... );
+ *
+ *   return valid->error;
+ *
+ */
+ typedef struct FT_ValidatorRec_
+ {
+   FT_Byte*            base;        /* address of table in memory    */
+   FT_Byte*            limit;       /* base + size of table in bytes */
+
+   FT_Error            error;       /* error code. 0 in case of success   */
+   FT_ValidationLevel  level;       /* validation level..                 */
+   FT_UInt             num_glyphs;  /* if level >= FT_VALIDATE_TIGHT only */
+
+   jmp_buf             jump_buffer;
+
+ } FT_ValidatorRec;
+
+
+ /* call this function when an error is detected during validation. this */
+ /* will set the error and call 'longjmp' to return to the top-level     */
+ /* caller of the validation routine..                                   */
+ /*                                                                      */
+  FT_BASE( void )
+  ft_validator_error( FT_Validator  valid,
+                      FT_Error      error );  
+
+ /* this macro assumes that the local variable 'valid' points to the */
+ /* current validator structure..                                    */
+#define  FT_INVALID(e)   ft_validator_error( valid, e )
+
+ /* a few "common" errors in font tables */
+#define  FT_INVALID_TOO_SHORT   FT_INVALID( FT_Err_Invalid_Table )
+#define  FT_INVALID_OFFSET      FT_INVALID( FT_Err_Invalid_Offset )
+#define  FT_INVALID_GLYPH_ID    FT_INVALID( FT_Err_Invalid_Table )
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                         C H A R M A P S                         ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+ /* handle to internal charmap object */
+  typedef struct FT_CMapRec_*   FT_CMap;
+  
+ /* handle to charmap class structure */
+  typedef const struct FT_CMap_ClassRec_*   FT_CMap_Class;
+
+
+ /* internal charmap object structure, sub-class of 'FT_CharMapRec' */
+  typedef struct FT_CMapRec_
+  {
+    FT_CharMapRec  charmap;
+    FT_CMap_Class  clazz;
+    FT_Pointer     data;   /* passed to validate/index/next methods */
+
+  } FT_CMapRec;
+
+ /* useful macros */
+#define  FT_CMAP(x)               ((FT_CMap)(x))
+#define  FT_CMAP_FACE(x)          (FT_CMAP(x)->charmap.face)
+#define  FT_CMAP_PLATFORM_ID(x)   (FT_CMAP(x)->charmap.platform_id)
+#define  FT_CMAP_ENCODING_ID(x)   (FT_CMAP(x)->charmap.encoding_id)
+#define  FT_CMAP_ENCODING(x)      (FT_CMAP(x)->charmap.encoding)
+
+
+ /* charmap initializer */
+  typedef FT_Error  (*FT_CMap_InitFunc)( FT_CMap  cmap );
+
+ /* charmap finalizer */
+  typedef void      (*FT_CMap_DoneFunc)( FT_CMap  cmap );
+
+ /* charmap validation routine */
+  typedef FT_Error  (*FT_CMap_ValidateFunc)( FT_Pointer    cmap_data,
+                                             FT_Validator  valid );
+
+ /* charmap charcode to glyph index mapping function */
+  typedef FT_UInt   (*FT_CMap_CharIndexFunc)( FT_Pointer   cmap_data,
+                                              FT_ULong     char_code );
+
+ /* charmap charcode increment function */
+  typedef FT_ULong  (*FT_CMap_CharNextFunc)( FT_Pointer   cmap_data,
+                                             FT_ULong     char_code,
+                                             FT_UInt     *agindex );
+
+ /* charmap class */
+  typedef struct FT_CMap_ClassRec_
+  {
+    FT_ULong               size;   /* size in bytes */
+    FT_CMap_InitFunc       init;
+    FT_CMap_DoneFunc       done;
+    FT_CMap_ValidateFunc   validate;
+    FT_CMap_CharIndexFunc  char_index;
+    FT_CMap_CharNextFunc   char_next;
+  
+  } FT_CMap_ClassRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
   /****                        R E N D E R E R S                        ****/
   /****                                                                 ****/
   /****                                                                 ****/
diff --git a/include/freetype/internal/fttrace.h b/include/freetype/internal/fttrace.h
new file mode 100644
index 0000000..f1e9d6e
--- /dev/null
+++ b/include/freetype/internal/fttrace.h
@@ -0,0 +1,75 @@
+/* definitions of trace levels for FreeType 2 */
+
+/* the first level must always be `trace_any' */
+FT_TRACE_DEF( any )
+
+/* base components */
+FT_TRACE_DEF( calc )      /* calculations            (ftcalc.c)   */
+FT_TRACE_DEF( memory )    /* memory manager          (ftobjs.c)   */
+FT_TRACE_DEF( stream )    /* stream manager          (ftstream.c) */
+FT_TRACE_DEF( io )        /* i/o interface           (ftsystem.c) */
+FT_TRACE_DEF( list )      /* list management         (ftlist.c)   */
+FT_TRACE_DEF( init )      /* initialization          (ftinit.c)   */
+FT_TRACE_DEF( objs )      /* base objects            (ftobjs.c)   */
+FT_TRACE_DEF( outline )   /* outline management      (ftoutln.c)  */
+FT_TRACE_DEF( glyph )     /* glyph management        (ftglyph.c)  */
+
+FT_TRACE_DEF( raster )    /* monochrome rasterizer   (ftraster.c) */
+FT_TRACE_DEF( smooth )    /* anti-aliasing raster    (ftgrays.c)  */
+FT_TRACE_DEF( mm )        /* MM interface            (ftmm.c)     */
+
+/* Cache sub-system */
+FT_TRACE_DEF( cache )     /* cache sub-system        (ftcache.c, etc..) */
+
+/* SFNT driver components */
+FT_TRACE_DEF( sfobjs )    /*  SFNT object handler     (sfobjs.c)   */
+FT_TRACE_DEF( ttcmap )    /* charmap handler         (ttcmap.c)    */
+FT_TRACE_DEF( ttload )    /* basic TrueType tables   (ttload.c)    */
+FT_TRACE_DEF( ttpost )    /* PS table processing     (ttpost.c)   */
+FT_TRACE_DEF( ttsbit )    /* TrueType sbit handling  (ttsbit.c)   */
+
+/* TrueType driver components */
+FT_TRACE_DEF( ttdriver )  /* TT font driver          (ttdriver.c) */
+FT_TRACE_DEF( ttgload )   /* TT glyph loader         (ttgload.c)  */
+FT_TRACE_DEF( ttinterp )  /* bytecode interpreter    (ttinterp.c) */
+FT_TRACE_DEF( ttobjs )    /* TT objects manager      (ttobjs.c)   */
+FT_TRACE_DEF( ttpload )   /* TT data/program loader  (ttpload.c)  */
+
+/* Type 1 driver components */
+FT_TRACE_DEF( t1driver )
+FT_TRACE_DEF( t1gload )
+FT_TRACE_DEF( t1hint )
+FT_TRACE_DEF( t1load )
+FT_TRACE_DEF( t1objs )
+FT_TRACE_DEF( t1parse )
+
+/* PostScript helper module `psaux' */
+FT_TRACE_DEF( t1decode )
+FT_TRACE_DEF( psobjs )
+
+/* PostScript hinting module `pshinter' */
+FT_TRACE_DEF( pshrec )
+FT_TRACE_DEF( pshalgo1 )
+FT_TRACE_DEF( pshalgo2 )
+
+/* Type 2 driver components */
+FT_TRACE_DEF( cffdriver )
+FT_TRACE_DEF( cffgload )
+FT_TRACE_DEF( cffload )
+FT_TRACE_DEF( cffobjs )
+FT_TRACE_DEF( cffparse )
+
+/* CID driver components */
+FT_TRACE_DEF( cidafm )
+FT_TRACE_DEF( ciddriver )
+FT_TRACE_DEF( cidgload )
+FT_TRACE_DEF( cidload )
+FT_TRACE_DEF( cidobjs )
+FT_TRACE_DEF( cidparse )
+
+/* Windows fonts component */
+FT_TRACE_DEF( winfnt )
+
+/* PCF fonts component */
+FT_TRACE_DEF( pcfdriver )
+FT_TRACE_DEF( pcfread )
diff --git a/include/freetype/internal/internal.h b/include/freetype/internal/internal.h
index cad39bb..32a06f9 100644
--- a/include/freetype/internal/internal.h
+++ b/include/freetype/internal/internal.h
@@ -32,6 +32,7 @@
 #define FT_INTERNAL_CALC_H                <freetype/internal/ftcalc.h>
 #define FT_INTERNAL_DRIVER_H              <freetype/internal/ftdriver.h>
 #define FT_INTERNAL_EXTEND_H              <freetype/internal/ftextend.h>
+#define FT_INTERNAL_TRACE_H               <freetype/internal/fttrace.h>
 
 #define FT_INTERNAL_SFNT_H                <freetype/internal/sfnt.h>
 
diff --git a/src/base/Jamfile b/src/base/Jamfile
index a310914..5c2f5a6 100644
--- a/src/base/Jamfile
+++ b/src/base/Jamfile
@@ -10,7 +10,7 @@
 
   if $(FT2_MULTI)
   {
-    _sources = ftcalc ftextend ftlist ftobjs ftstream ftoutln ftnames fttrigon
+    _sources = ftcalc ftlist ftobjs ftstream ftoutln ftnames fttrigon
                ftdbgmem ;
   }
   else
diff --git a/src/base/ftdebug.c b/src/base/ftdebug.c
index 6a3fc49..ea4033a 100644
--- a/src/base/ftdebug.c
+++ b/src/base/ftdebug.c
@@ -45,12 +45,7 @@
 #include FT_INTERNAL_DEBUG_H
 
 
-#ifdef FT_DEBUG_LEVEL_TRACE
-  char  ft_trace_levels[trace_max];
-#endif
-
-
-#if defined( FT_DEBUG_LEVEL_ERROR ) || defined( FT_DEBUG_LEVEL_TRACE )
+#if defined( FT_DEBUG_LEVEL_ERROR )
 
 
 #include <stdarg.h>
@@ -83,36 +78,123 @@
     exit( EXIT_FAILURE );
   }
 
+#endif /* FT_DEBUG_LEVEL_ERROR */
+
+
 
 #ifdef FT_DEBUG_LEVEL_TRACE
 
-  FT_EXPORT_DEF( void )
-  FT_SetTraceLevel( FT_Trace  component,
-                    char      level )
+  /* array of trace levels, initialized to 0 */
+  int  ft_trace_levels[ trace_count ];
+
+ /* define array of trace toggle names */
+#define  FT_TRACE_DEF(x)   #x ,
+
+  static const char*  ft_trace_toggles[ trace_count+1 ] =
+  { 
+#include FT_INTERNAL_TRACE_H
+    NULL
+  };
+
+#undef FT_TRACE_DEF
+
+
+
+ /************************************************************************
+  *
+  *  initialize the tracing sub-system, this is done by retrieving the
+  *  value of the "FT2_DEBUG" environment variable. It must be a list of
+  *  toggles, separated by spaces, ';' or ':' for example:
+  *
+  *    "any=3 memory=6 stream=5"
+  *
+  *  will request that all levels be set to 3, except the trace level for
+  *  the memory and stream components which are respectively set to 6 and 5
+  *
+  *  see the file <freetype/internal/fttrace.h> for details of the available
+  *  toggle names.
+  *
+  *  the level is between 0 and 6, where 0 is quiet (except in important
+  *  runtime errors), and 6 is _very_ verbose
+  */
+
+  FT_BASE_DEF( void )
+  ft_debug_init( void )
   {
-    if ( component >= trace_max )
-      return;
-
-    /* if component is `trace_any', change _all_ levels at once */
-    if ( component == trace_any )
+    const char*  ft2_debug = getenv( "FT2_DEBUG" );
+    
+    if ( ft2_debug )
     {
-      int  n;
-
-
-      for ( n = trace_any; n < trace_max; n++ )
-        ft_trace_levels[n] = level;
+      const char*  p = ft2_debug;
+      const char*  q;
+      
+      for ( ; *p; p++ )
+      {
+        /* skip leading whitespace and separators */
+        if ( *p == ' ' || *p == '\t' || *p == ':' || *p == ';' || *p == '=' )
+          continue;
+          
+        /* read toggle name, followed by '=' */
+        q = p;
+        while ( *p && *p != '=' )
+          p++;
+          
+        if ( *p == '=' && p > q )
+        {
+          int  n, i, len = p - q;
+          int  level = -1, found = -1;
+          
+          for ( n = 0; n < trace_count; n++ )
+          {
+            const char*  toggle = ft_trace_toggles[n];
+            
+            for ( i = 0; i < len; i++ )
+            {
+              if ( toggle[i] != q[i] )
+                break;
+            }
+            
+            if ( i == len && toggle[i] == 0 )
+            {
+              found = n;
+              break;
+            }
+          }
+          
+          /* read level */
+          p++;
+          if ( *p )
+          {
+            level = *p++ - '0';
+            if ( level < 0 || level > 6 )
+              level = -1;
+          }
+          
+          if ( found >= 0 && level >= 0 )
+          {
+            if ( found == trace_any )
+            {
+              /* special case for "any" */
+              for ( n = 0; n < trace_count; n++ )
+                ft_trace_levels[n] = level;
+            }
+            else
+              ft_trace_levels[ found ] = level;
+          }
+        }
+      }
     }
-    else        /* otherwise, only change individual component */
-      ft_trace_levels[component] = level;
   }
 
-#endif /* FT_DEBUG_LEVEL_TRACE */
+#else  /* !FT_DEBUG_LEVEL_TRACE */
 
-#endif /* FT_DEBUG_LEVEL_TRACE || FT_DEBUG_LEVEL_ERROR */
+  FT_BASE_DEF( void )
+  ft_debut_init( void )
+  {
+    /* nothing */
+  }
 
-
-  /* ANSI C doesn't allow empty files, so we insert a dummy symbol */
-  extern const int  ft_debug_dummy;
+#endif /* !FT_DEBUG_LEVEL_TRACE */
 
 
 /* END */
diff --git a/src/base/ftextend.c b/src/base/ftextend.c
deleted file mode 100644
index cafb284..0000000
--- a/src/base/ftextend.c
+++ /dev/null
@@ -1,302 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftextend.c                                                             */
-/*                                                                         */
-/*    FreeType extensions implementation (body).                           */
-/*                                                                         */
-/*  Copyright 1996-2001 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*  This is an updated version of the extension component, now located   */
-  /*  in the main library's source directory.  It allows the dynamic       */
-  /*  registration/use of various face object extensions through a simple  */
-  /*  API.                                                                 */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_EXTEND_H
-#include FT_INTERNAL_DEBUG_H
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
-  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
-  /* messages during execution.                                            */
-  /*                                                                       */
-#undef  FT_COMPONENT
-#define FT_COMPONENT  trace_extend
-
-
-  typedef struct  FT_Extension_Registry_
-  {
-    FT_Int              num_extensions;
-    FT_Long             cur_offset;
-    FT_Extension_Class  classes[FT_MAX_EXTENSIONS];
-
-  } FT_Extension_Registry;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Init_Extensions                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Initializes the extension component.                               */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    driver :: A handle to the driver object.                           */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF FT_Error
-  FT_Init_Extensions( FT_Driver  driver )
-  {
-    FT_Error                error;
-    FT_Memory               memory;
-    FT_Extension_Registry*  registry;
-
-
-    memory = driver->root.library->memory;
-    if ( ALLOC( registry, sizeof ( *registry ) ) )
-      return error;
-
-    registry->num_extensions = 0;
-    registry->cur_offset     = 0;
-    driver->extensions       = registry;
-
-    FT_TRACE2(( "FT_Init_Extensions: success\n" ));
-
-    return FT_Err_Ok;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Done_Extensions                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Finalizes the extension component.                                 */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    driver :: A handle to the driver object.                           */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF FT_Error
-  FT_Done_Extensions( FT_Driver  driver )
-  {
-    FT_Memory  memory = driver->root.memory;
-
-
-    FREE( driver->extensions );
-    return FT_Err_Ok;
-  }
-
-
-  /* documentation is in ftextend.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Register_Extension( FT_Driver            driver,
-                         FT_Extension_Class*  clazz )
-  {
-    FT_Extension_Registry*  registry;
-
-
-    if ( !driver )
-      return FT_Err_Invalid_Driver_Handle;
-
-    if ( !clazz )
-      return FT_Err_Invalid_Argument;
-
-    registry = (FT_Extension_Registry*)driver->extensions;
-    if ( registry )
-    {
-      FT_Int               n   = registry->num_extensions;
-      FT_Extension_Class*  cur = registry->classes + n;
-
-
-      if ( n >= FT_MAX_EXTENSIONS )
-        return FT_Err_Too_Many_Extensions;
-
-      *cur = *clazz;
-
-      cur->offset  = registry->cur_offset;
-
-      registry->num_extensions++;
-      registry->cur_offset +=
-        ( cur->size + FT_ALIGNMENT - 1 ) & -FT_ALIGNMENT;
-
-      FT_TRACE1(( "FT_Register_Extension: `%s' successfully registered\n",
-                  cur->id ));
-    }
-
-    return FT_Err_Ok;
-  }
-
-
-  /* documentation is in ftextend.h */
-
-  FT_EXPORT_DEF( void* )
-  FT_Get_Extension( FT_Face      face,
-                    const char*  extension_id,
-                    void**       extension_interface )
-  {
-    FT_Extension_Registry*  registry;
-
-
-    if ( !face || !extension_id || !extension_interface )
-      return 0;
-
-    registry = (FT_Extension_Registry*)face->driver->extensions;
-    if ( registry && face->extensions )
-    {
-      FT_Extension_Class*  cur   = registry->classes;
-      FT_Extension_Class*  limit = cur + registry->num_extensions;
-
-
-      for ( ; cur < limit; cur++ )
-        if ( strcmp( cur->id, extension_id ) == 0 )
-        {
-          *extension_interface = cur->interface;
-
-          FT_TRACE1(( "FT_Get_Extension: got `%s'\n", extension_id ));
-
-          return (void*)((char*)face->extensions + cur->offset);
-        }
-    }
-
-    /* could not find the extension id */
-
-    FT_ERROR(( "FT_Get_Extension: couldn't find `%s'\n", extension_id ));
-
-    *extension_interface = 0;
-
-    return 0;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Destroy_Extensions                                              */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Destroys all extensions within a face object.                      */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    face :: A handle to the face object.                               */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    Called by the face object destructor.                              */
-  /*                                                                       */
-  FT_LOCAL_DEF FT_Error
-  FT_Destroy_Extensions( FT_Face  face )
-  {
-    FT_Extension_Registry*  registry;
-    FT_Memory               memory;
-
-
-    registry = (FT_Extension_Registry*)face->driver->extensions;
-    if ( registry && face->extensions )
-    {
-      FT_Extension_Class*  cur   = registry->classes;
-      FT_Extension_Class*  limit = cur + registry->num_extensions;
-
-
-      for ( ; cur < limit; cur++ )
-      {
-        char*  ext = (char*)face->extensions + cur->offset;
-
-        if ( cur->finalize )
-          cur->finalize( ext, face );
-      }
-
-      memory = face->driver->root.memory;
-      FREE( face->extensions );
-    }
-
-    return FT_Err_Ok;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Create_Extensions                                               */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Creates an extension object within a face object for all           */
-  /*    registered extensions.                                             */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    face :: A handle to the face object.                               */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    Called by the face object constructor.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF FT_Error
-  FT_Create_Extensions( FT_Face  face )
-  {
-    FT_Extension_Registry*  registry;
-    FT_Memory               memory;
-    FT_Error                error;
-
-
-    face->extensions = 0;
-
-    /* load extensions registry; exit successfully if none is there */
-
-    registry = (FT_Extension_Registry*)face->driver->extensions;
-    if ( !registry )
-      return FT_Err_Ok;
-
-    memory = face->driver->root.memory;
-    if ( ALLOC( face->extensions, registry->cur_offset ) )
-      return error;
-
-    {
-      FT_Extension_Class*  cur   = registry->classes;
-      FT_Extension_Class*  limit = cur + registry->num_extensions;
-
-
-      for ( ; cur < limit; cur++ )
-      {
-        char*  ext = (char*)face->extensions + cur->offset;
-
-        if ( cur->init )
-        {
-          error = cur->init( ext, face );
-          if ( error )
-            break;
-        }
-      }
-    }
-
-    return error;
-  }
-
-
-/* END */
diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c
index 21a6be0..1b78c9d 100644
--- a/src/base/ftobjs.c
+++ b/src/base/ftobjs.c
@@ -57,7 +57,7 @@
             FT_Long    size,
             void*     *P )
   {
-    FT_Assert( P != 0 );
+    FT_ASSERT( P != 0 );
 
     if ( size > 0 )
     {
@@ -94,7 +94,7 @@
     void*  Q;
 
 
-    FT_Assert( P != 0 );
+    FT_ASSERT( P != 0 );
 
     /* if the original pointer is NULL, call FT_Alloc() */
     if ( !*P )
diff --git a/src/base/ftstream.c b/src/base/ftstream.c
index 96683a2..3fc40f9 100644
--- a/src/base/ftstream.c
+++ b/src/base/ftstream.c
@@ -201,7 +201,7 @@
 
 
     /* check for nested frame access */
-    FT_Assert( stream && stream->cursor == 0 );
+    FT_ASSERT( stream && stream->cursor == 0 );
 
     if ( stream->read )
     {
@@ -265,7 +265,7 @@
     /*  gracefully; however, stream.cursor is really set to 0 by the      */
     /*  FT_Access_Frame() call, and this is not an error.                 */
     /*                                                                    */
-    FT_Assert( stream );
+    FT_ASSERT( stream );
 
     if ( stream->read )
     {
@@ -285,7 +285,7 @@
     FT_Char  result;
 
 
-    FT_Assert( stream && stream->cursor );
+    FT_ASSERT( stream && stream->cursor );
 
     result = 0;
     if ( stream->cursor < stream->limit )
@@ -302,7 +302,7 @@
     FT_Short  result;
 
 
-    FT_Assert( stream && stream->cursor );
+    FT_ASSERT( stream && stream->cursor );
 
     result         = 0;
     p              = stream->cursor;
@@ -321,7 +321,7 @@
     FT_Short  result;
 
 
-    FT_Assert( stream && stream->cursor );
+    FT_ASSERT( stream && stream->cursor );
 
     result         = 0;
     p              = stream->cursor;
@@ -340,7 +340,7 @@
     FT_Long   result;
 
 
-    FT_Assert( stream && stream->cursor );
+    FT_ASSERT( stream && stream->cursor );
 
     result         = 0;
     p              = stream->cursor;
@@ -358,7 +358,7 @@
     FT_Long   result;
 
 
-    FT_Assert( stream && stream->cursor );
+    FT_ASSERT( stream && stream->cursor );
 
     result         = 0;
     p              = stream->cursor;
@@ -376,7 +376,7 @@
     FT_Long   result;
 
 
-    FT_Assert( stream && stream->cursor );
+    FT_ASSERT( stream && stream->cursor );
 
     result         = 0;
     p              = stream->cursor;
@@ -394,7 +394,7 @@
     FT_Byte  result = 0;
 
 
-    FT_Assert( stream );
+    FT_ASSERT( stream );
 
     *error = FT_Err_Ok;
 
@@ -433,7 +433,7 @@
     FT_Short  result = 0;
 
 
-    FT_Assert( stream );
+    FT_ASSERT( stream );
 
     *error = FT_Err_Ok;
 
@@ -480,7 +480,7 @@
     FT_Short  result = 0;
 
 
-    FT_Assert( stream );
+    FT_ASSERT( stream );
 
     *error = FT_Err_Ok;
 
@@ -527,7 +527,7 @@
     FT_Long   result = 0;
 
 
-    FT_Assert( stream );
+    FT_ASSERT( stream );
 
     *error = FT_Err_Ok;
 
@@ -574,7 +574,7 @@
     FT_Long   result = 0;
 
 
-    FT_Assert( stream );
+    FT_ASSERT( stream );
 
     *error = FT_Err_Ok;
 
@@ -621,7 +621,7 @@
     FT_Long   result = 0;
 
 
-    FT_Assert( stream );
+    FT_ASSERT( stream );
 
     *error = FT_Err_Ok;
 
diff --git a/src/base/rules.mk b/src/base/rules.mk
index 8c3bbd4..2c6df87 100644
--- a/src/base/rules.mk
+++ b/src/base/rules.mk
@@ -34,7 +34,6 @@
 #
 BASE_SRC := $(BASE_)ftcalc.c   \
             $(BASE_)fttrigon.c \
-            $(BASE_)ftextend.c \
             $(BASE_)ftlist.c   \
             $(BASE_)ftobjs.c   \
             $(BASE_)ftstream.c \
diff --git a/src/pshinter/pshalgo2.c b/src/pshinter/pshalgo2.c
index a1d874c..bbc5265 100644
--- a/src/pshinter/pshalgo2.c
+++ b/src/pshinter/pshalgo2.c
@@ -523,7 +523,7 @@
 #include <stdio.h>
 
   static void
-  print_zone( PSH2_Zone  zone )
+  psh2_print_zone( PSH2_Zone  zone )
   {
     printf( "zone [scale,delta,min,max] = [%.3f,%.3f,%d,%d]\n",
              zone->scale/65536.0,
@@ -534,7 +534,7 @@
 
 #else
 
-#define print_zone( x )   do { } while ( 0 )
+#define psh2_print_zone( x )   do { } while ( 0 )
 
 #endif
 
@@ -576,7 +576,7 @@
     zone->min   = PSH2_ZONE_MIN;
     zone->max   = hint->org_pos;
 
-    print_zone( zone );
+    psh2_print_zone( zone );
 
     zone++;
 
@@ -597,7 +597,7 @@
         zone->max   = hint->org_pos + hint->org_len;
         zone->delta = hint->cur_pos - FT_MulFix( zone->min, scale2 );
 
-        print_zone( zone );
+        psh2_print_zone( zone );
 
         zone++;
       }
@@ -620,7 +620,7 @@
       zone->delta = hint->cur_pos + hint->cur_len -
                     FT_MulFix( zone->min, scale2 );
 
-      print_zone( zone );
+      psh2_print_zone( zone );
 
       zone++;
 
@@ -634,7 +634,7 @@
     zone->delta = hint->cur_pos + hint->cur_len -
                   FT_MulFix( zone->min, scale );
 
-    print_zone( zone );
+    psh2_print_zone( zone );
 
     zone++;
 
diff --git a/src/smooth/ftgrays.c b/src/smooth/ftgrays.c
index e6d361b..cc47c18 100644
--- a/src/smooth/ftgrays.c
+++ b/src/smooth/ftgrays.c
@@ -96,7 +96,7 @@
   /* messages during execution.                                            */
   /*                                                                       */
 #undef  FT_COMPONENT
-#define FT_COMPONENT  trace_aaraster
+#define FT_COMPONENT  trace_smooth
 
 
 #define ErrRaster_MemoryOverflow   -4