* include/freetype/fterrors.h: updated some of the error macros to
        simplify Werner's latest tricks :o)
diff --git a/ChangeLog b/ChangeLog
index 7e672d4..47f9291 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2001-06-19  David Turner  <david@freetype.org>
+
+        * include/freetype/fterrors.h: updated some of the error macros to
+        simplify Werner's latest tricks :o)
+        
+        * include/freetype/freetype.h (FT_New_Memory_Face): updated docs
+        
+        Removing _lots_ of compiler warnings when the most pedantic warning
+        levels of Visual C++ and Borland C++ are used. Too many files to be
+        listed here.., but FT2 now compiles without warnings with VC++ and
+        the "/W4" warning level (lint-style)
+
 2001-06-18  Werner Lemberg  <wl@gnu.org>
 
 	Minor cleanups to remove compiler warnings.
diff --git a/include/freetype/fterrors.h b/include/freetype/fterrors.h
index bdfc8b0..3228f91 100644
--- a/include/freetype/fterrors.h
+++ b/include/freetype/fterrors.h
@@ -85,6 +85,8 @@
 #ifndef __FTERRORS_H__
 #define __FTERRORS_H__
 
+/* include module base error codes */
+#include FT_MODULE_ERRORS_H
 
   /*******************************************************************/
   /*******************************************************************/
@@ -93,37 +95,59 @@
   /*****                                                         *****/
   /*******************************************************************/
   /*******************************************************************/
+  
+#undef   FT_NEED_EXTERN_C
+#define  FT_ERR_XCAT(x,y)    x ## y
+#define  FT_ERR_CAT(x,y)     FT_ERR_XCAT(x,y)
 
-#include FT_MODULE_ERRORS_H
 
-#undef FT_NEED_EXTERN_C
+/* FT_ERR_PREFIX is used as a prefix for error identifiers */
+/* by default, we use "FT_Err_"                            */
+/*                                                         */
+#ifndef   FT_ERR_PREFIX
+#  define FT_ERR_PREFIX  FT_Err_
+#endif
+
+
+
+/* FT_ERR_BASE is used as the base for module-specific errors */
+/*                                                            */
+#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS
+#  ifndef   FT_ERR_BASE
+#    define FT_ERR_BASE  FT_Mod_Err_Base
+#  endif
+#else
+#  define   FT_ERR_BASE  0
+#endif
+
+
+
+/*  if FT_ERRORDEF is not defined, we need to define a simple enumeration */
+/*  type..                                                                */
+/*                                                                        */
 #ifndef FT_ERRORDEF
 
 #  define FT_ERRORDEF( e, v, s )  e = v,
+#  define FT_ERROR_START_LIST     enum {
+#  define FT_ERROR_END_LIST       FT_ERR_CAT(FT_ERR_PREFIX,Max) };
 
 #  ifdef __cplusplus
-#  define FT_NEED_EXTERN_C
+#    define FT_NEED_EXTERN_C
       extern "C" {
 #  endif
 
 #endif /* !FT_ERRORDEF */
 
 
-#ifndef FT_ERROR_START_LIST
-#  define FT_ERROR_START_LIST  enum {
-#endif
-
-#ifndef FT_ERROR_END_LIST
-#  define FT_ERROR_END_LIST    FT_Err_Max };
-#endif
+/* this macro is used to define an error */
+#  define FT_ERRORDEF_( e, v, s )   \
+          FT_ERRORDEF( FT_ERR_CAT(FT_ERR_PREFIX,e), v + FT_ERR_BASE, s )
 
 
+/* this is only used for FT_Err_Ok, which must be 0 !! */
+#  define FT_NOERRORDEF_( e, v, s ) \
+          FT_ERRORDEF( FT_ERR_CAT(FT_ERR_PREFIX,e), v, s )
 
-#define FT_ERRORDEF_( e, v, s )   \
-        FT_ERRORDEF( FT_Err_ ## e, v + FT_Mod_Err_Base, s )
-          
-#define FT_NOERRORDEF_( e, v, s ) \
-        FT_ERRORDEF( FT_Err_ ## e, v, s )
 
 
   /*******************************************************************/
@@ -134,8 +158,9 @@
   /*******************************************************************/
   /*******************************************************************/
 
+#ifdef FT_ERROR_START_LIST
   FT_ERROR_START_LIST
-
+#endif
 
   /* generic errors */
 
@@ -313,8 +338,9 @@
                "argument stack underflow" )
 
 
+#ifdef FT_ERROR_END_LIST
   FT_ERROR_END_LIST
-
+#endif
 
   /*******************************************************************/
   /*******************************************************************/
@@ -324,17 +350,22 @@
   /*******************************************************************/
   /*******************************************************************/
 
-#undef FT_ERROR_START_LIST
-#undef FT_ERROR_END_LIST
-#undef FT_ERRORDEF
-#undef FT_ERRORDEF_
-#undef FT_NOERRORDEF_
-
-
 #ifdef FT_NEED_EXTERN_C
   }
 #endif
 
-#endif /* __FT_ERRORS_H__ */
+#undef FT_ERROR_START_LIST
+#undef FT_ERROR_END_LIST
+
+#undef FT_ERRORDEF
+#undef FT_ERRORDEF_
+#undef FT_NOERRORDEF_
+
+#undef FT_NEED_EXTERN_C
+#undef FT_ERR_PREFIX
+#undef FT_ERR_BASE
+#undef FT_ERR_CONCAT
+
+#endif /* __FTERRORS_H__ */
 
 /* END */
diff --git a/include/freetype/ftmoderr.h b/include/freetype/ftmoderr.h
index 71252a1..0ebbc69 100644
--- a/include/freetype/ftmoderr.h
+++ b/include/freetype/ftmoderr.h
@@ -58,29 +58,40 @@
 #define __FTMODERR_H__
 
 
-#undef FT_NEED_EXTERN_C
+  /*******************************************************************/
+  /*******************************************************************/
+  /*****                                                         *****/
+  /*****                       SETUP MACROS                      *****/
+  /*****                                                         *****/
+  /*******************************************************************/
+  /*******************************************************************/
 
-
-
-
+#undef  FT_NEED_EXTERN_C
 #ifndef FT_MODERRDEF
 
-#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS
-#define FT_MODERRDEF( e, v, s )  FT_Mod_Err_ ## e = v,
-#else
-#define FT_MODERRDEF( e, v, s )  FT_Mod_Err_ ## e = 0,
-#endif
+#  ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS
+#    define FT_MODERRDEF( e, v, s )  FT_Mod_Err_ ## e = v,
+#  else
+#    define FT_MODERRDEF( e, v, s )  FT_Mod_Err_ ## e = 0,
+#  endif
 
-#define FT_MODERR_START_LIST     enum {
-#define FT_MODERR_END_LIST       FT_Mod_Err_Max };
+#  define FT_MODERR_START_LIST     enum {
+#  define FT_MODERR_END_LIST       FT_Mod_Err_Max };
 
-#ifdef __cplusplus
-#define FT_NEED_EXTERN_C
+#  ifdef __cplusplus
+#    define FT_NEED_EXTERN_C
   extern "C" {
-#endif
+#  endif
 
 #endif /* !FT_MODERRDEF */
 
+  /*******************************************************************/
+  /*******************************************************************/
+  /*****                                                         *****/
+  /*****               LIST MODULE ERROR BASES                   *****/
+  /*****                                                         *****/
+  /*******************************************************************/
+  /*******************************************************************/
 
 #ifdef FT_MODERR_START_LIST
   FT_MODERR_START_LIST
@@ -107,16 +118,24 @@
   FT_MODERR_END_LIST
 #endif
 
-
-#undef FT_MODERR_START_LIST
-#undef FT_MODERR_END_LIST
-#undef FT_MODERRDEF
-
+  /*******************************************************************/
+  /*******************************************************************/
+  /*****                                                         *****/
+  /*****                      CLEANUP                            *****/
+  /*****                                                         *****/
+  /*******************************************************************/
+  /*******************************************************************/
 
 #ifdef FT_NEED_EXTERN_C
   }
 #endif
 
+#undef FT_MODERR_START_LIST
+#undef FT_MODERR_END_LIST
+#undef FT_MODERRDEF
+#undef FT_NEED_EXTERN_C
+
+
 #endif /* __FTMODERR_H__ */
 
 
diff --git a/src/autohint/aherrors.h b/src/autohint/aherrors.h
index b236a64..0965d1f 100644
--- a/src/autohint/aherrors.h
+++ b/src/autohint/aherrors.h
@@ -30,13 +30,8 @@
 
 #undef __FTERRORS_H__
 
-#define FT_ERRORDEF_( e, v, s )   \
-          FT_ERRORDEF( AH_Err_ ## e, v + FT_Mod_Err_Autohint, s )
-#define FT_NOERRORDEF_( e, v, s ) \
-          FT_ERRORDEF( AH_Err_ ## e, v, s )
-
-#define FT_ERROR_START_LIST       enum {
-#define FT_ERROR_END_LIST         AH_Err_Max };
+#define FT_ERR_PREFIX     AH_Err_
+#define FT_ERR_BASE       FT_Mod_Err_Autohint
 
 #include FT_ERRORS_H
 
diff --git a/src/cache/ftcerror.h b/src/cache/ftcerror.h
index 3da42b3..dc0a5c6 100644
--- a/src/cache/ftcerror.h
+++ b/src/cache/ftcerror.h
@@ -30,13 +30,8 @@
 
 #undef __FTERRORS_H__
 
-#define FT_ERRORDEF_( e, v, s )   \
-          FT_ERRORDEF( FTC_Err_ ## e, v + FT_Mod_Err_Cache, s )
-#define FT_NOERRORDEF_( e, v, s ) \
-          FT_ERRORDEF( FTC_Err_ ## e, v, s )
-
-#define FT_ERROR_START_LIST       enum {
-#define FT_ERROR_END_LIST         FTC_Err_Max };
+#define FT_ERR_PREFIX     FTC_Err_
+#define FT_ERR_BASE       FT_Mod_Err_Cache
 
 #include FT_ERRORS_H
 
diff --git a/src/cff/cfferrs.h b/src/cff/cfferrs.h
index 0ae0a3d..0eb704f 100644
--- a/src/cff/cfferrs.h
+++ b/src/cff/cfferrs.h
@@ -29,13 +29,9 @@
 
 #undef __FTERRORS_H__
 
-#define FT_ERRORDEF_( e, v, s )   \
-          FT_ERRORDEF( CFF_Err_ ## e, v + FT_Mod_Err_CFF, s )
-#define FT_NOERRORDEF_( e, v, s ) \
-          FT_ERRORDEF( CFF_Err_ ## e, v, s )
+#define FT_ERR_PREFIX     CFF_Err_
+#define FT_ERR_BASE       FT_Mod_Err_CFF
 
-#define FT_ERROR_START_LIST       enum {
-#define FT_ERROR_END_LIST         CFF_Err_Max };
 
 #include FT_ERRORS_H
 
diff --git a/src/cid/ciderrs.h b/src/cid/ciderrs.h
index 9aa2f38..c019e47 100644
--- a/src/cid/ciderrs.h
+++ b/src/cid/ciderrs.h
@@ -29,13 +29,8 @@
 
 #undef __FTERRORS_H__
 
-#define FT_ERRORDEF_( e, v, s )   \
-          FT_ERRORDEF( CID_Err_ ## e, v + FT_Mod_Err_CID, s )
-#define FT_NOERRORDEF_( e, v, s ) \
-          FT_ERRORDEF( CID_Err_ ## e, v, s )
-
-#define FT_ERROR_START_LIST       enum {
-#define FT_ERROR_END_LIST         CID_Err_Max };
+#define FT_ERR_PREFIX     CID_Err_
+#define FT_ERR_BASE       FT_Mod_Err_CID
 
 #include FT_ERRORS_H
 
diff --git a/src/pcf/pcferror.h b/src/pcf/pcferror.h
index 2404ea9..6e0e8d9 100644
--- a/src/pcf/pcferror.h
+++ b/src/pcf/pcferror.h
@@ -29,13 +29,8 @@
 
 #undef __FTERRORS_H__
 
-#define FT_ERRORDEF_( e, v, s )   \
-          FT_ERRORDEF( PCF_Err_ ## e, v + FT_Mod_Err_PCF, s )
-#define FT_NOERRORDEF_( e, v, s ) \
-          FT_ERRORDEF( PCF_Err_ ## e, v, s )
-
-#define FT_ERROR_START_LIST       enum {
-#define FT_ERROR_END_LIST         PCF_Err_Max };
+#define FT_ERR_PREFIX     PCF_Err_
+#define FT_ERR_BASE       FT_Mod_Err_PCF
 
 #include FT_ERRORS_H
 
diff --git a/src/psaux/psauxerr.h b/src/psaux/psauxerr.h
index 2533277..f763653 100644
--- a/src/psaux/psauxerr.h
+++ b/src/psaux/psauxerr.h
@@ -30,13 +30,8 @@
 
 #undef __FTERRORS_H__
 
-#define FT_ERRORDEF_( e, v, s )   \
-          FT_ERRORDEF( PSaux_Err_ ## e, v + FT_Mod_Err_PSaux, s )
-#define FT_NOERRORDEF_( e, v, s ) \
-          FT_ERRORDEF( PSaux_Err_ ## e, v, s )
-
-#define FT_ERROR_START_LIST       enum {
-#define FT_ERROR_END_LIST         PSaux_Err_Max };
+#define FT_ERR_PREFIX     PSaux_Err_
+#define FT_ERR_BASE       FT_Mod_Err_PSaux
 
 #include FT_ERRORS_H
 
diff --git a/src/psnames/psnamerr.h b/src/psnames/psnamerr.h
index c620a87..134845a 100644
--- a/src/psnames/psnamerr.h
+++ b/src/psnames/psnamerr.h
@@ -30,13 +30,8 @@
 
 #undef __FTERRORS_H__
 
-#define FT_ERRORDEF_( e, v, s )   \
-          FT_ERRORDEF( PSnames_Err_ ## e, v + FT_Mod_Err_PSnames, s )
-#define FT_NOERRORDEF_( e, v, s ) \
-          FT_ERRORDEF( PSnames_Err_ ## e, v, s )
-
-#define FT_ERROR_START_LIST       enum {
-#define FT_ERROR_END_LIST         PSnames_Err_Max };
+#define FT_ERR_PREFIX     PSnames_Err_
+#define FT_ERR_BASE       FT_Mod_Err_PSnames
 
 #include FT_ERRORS_H
 
diff --git a/src/raster/rasterrs.h b/src/raster/rasterrs.h
index a9b3805..3e4d5fe 100644
--- a/src/raster/rasterrs.h
+++ b/src/raster/rasterrs.h
@@ -30,13 +30,8 @@
 
 #undef __FTERRORS_H__
 
-#define FT_ERRORDEF_( e, v, s )   \
-          FT_ERRORDEF( Raster_Err_ ## e, v + FT_Mod_Err_Raster, s )
-#define FT_NOERRORDEF_( e, v, s ) \
-          FT_ERRORDEF( Raster_Err_ ## e, v, s )
-
-#define FT_ERROR_START_LIST       enum {
-#define FT_ERROR_END_LIST         Raster_Err_Max };
+#define FT_ERR_PREFIX     Raster_Err_
+#define FT_ERR_BASE       FT_Mod_Err_Raster
 
 #include FT_ERRORS_H
 
diff --git a/src/sfnt/sferrors.h b/src/sfnt/sferrors.h
index fefd160..d9c4f76 100644
--- a/src/sfnt/sferrors.h
+++ b/src/sfnt/sferrors.h
@@ -29,13 +29,8 @@
 
 #undef __FTERRORS_H__
 
-#define FT_ERRORDEF_( e, v, s )   \
-          FT_ERRORDEF( SFNT_Err_ ## e, v + FT_Mod_Err_SFNT, s )
-#define FT_NOERRORDEF_( e, v, s ) \
-          FT_ERRORDEF( SFNT_Err_ ## e, v, s )
-
-#define FT_ERROR_START_LIST       enum {
-#define FT_ERROR_END_LIST         SFNT_Err_Max };
+#define FT_ERR_PREFIX     SFNT_Err_
+#define FT_ERR_BASE       FT_Mod_Err_SFNT
 
 #include FT_ERRORS_H
 
diff --git a/src/sfnt/ttsbit.c b/src/sfnt/ttsbit.c
index 8850c6a..f3b8eec 100644
--- a/src/sfnt/ttsbit.c
+++ b/src/sfnt/ttsbit.c
@@ -105,7 +105,7 @@
     for ( height = target->rows; height > 0; height-- )
     {
       FT_Byte*  cur   = line_buff;      /* current write cursor          */
-      FT_UInt   count = line_bits;      /* # of bits to extract per line */
+      FT_Int    count = line_bits;      /* # of bits to extract per line */
       FT_Byte   shift = (FT_Byte)(x_offset & 7); /* current write shift  */
       FT_Byte   space = (FT_Byte)(8 - shift);
 
@@ -156,7 +156,7 @@
 
 
         /* ensure that there are at least `count' bits in the accumulator */
-        if ( loaded < count )
+        if ( (FT_Int)loaded < count )
         {
           acc    |= (FT_UShort)*source++ << ( 8 - loaded );
           loaded += 8;
diff --git a/src/smooth/ftsmerrs.h b/src/smooth/ftsmerrs.h
index 0eb4062..9f06bbc 100644
--- a/src/smooth/ftsmerrs.h
+++ b/src/smooth/ftsmerrs.h
@@ -30,13 +30,8 @@
 
 #undef __FTERRORS_H__
 
-#define FT_ERRORDEF_( e, v, s )   \
-          FT_ERRORDEF( Smooth_Err_ ## e, v + FT_Mod_Err_Smooth, s )
-#define FT_NOERRORDEF_( e, v, s ) \
-          FT_ERRORDEF( Smooth_Err_ ## e, v, s )
-
-#define FT_ERROR_START_LIST       enum {
-#define FT_ERROR_END_LIST         Smooth_Err_Max };
+#define FT_ERR_PREFIX     Smooth_Err_
+#define FT_ERR_BASE       FT_Mod_Err_Smooth
 
 #include FT_ERRORS_H
 
diff --git a/src/truetype/tterrors.h b/src/truetype/tterrors.h
index bb611b5..bf67190 100644
--- a/src/truetype/tterrors.h
+++ b/src/truetype/tterrors.h
@@ -30,13 +30,8 @@
 
 #undef __FTERRORS_H__
 
-#define FT_ERRORDEF_( e, v, s )   \
-          FT_ERRORDEF( TT_Err_ ## e, v + FT_Mod_Err_TrueType, s )
-#define FT_NOERRORDEF_( e, v, s ) \
-          FT_ERRORDEF( TT_Err_ ## e, v, s )
-
-#define FT_ERROR_START_LIST       enum {
-#define FT_ERROR_END_LIST         TT_Err_Max };
+#define FT_ERR_PREFIX     TT_Err_
+#define FT_ERR_BASE       FT_Mod_Err_TrueType
 
 #include FT_ERRORS_H
 
diff --git a/src/type1/t1errors.h b/src/type1/t1errors.h
index cf5c8b6..90f65e6 100644
--- a/src/type1/t1errors.h
+++ b/src/type1/t1errors.h
@@ -29,13 +29,8 @@
 
 #undef __FTERRORS_H__
 
-#define FT_ERRORDEF_( e, v, s )   \
-          FT_ERRORDEF( T1_Err_ ## e, v + FT_Mod_Err_Type1, s )
-#define FT_NOERRORDEF_( e, v, s ) \
-          FT_ERRORDEF( T1_Err_ ## e, v, s )
-
-#define FT_ERROR_START_LIST       enum {
-#define FT_ERROR_END_LIST         T1_Err_Max };
+#define FT_ERR_PREFIX     T1_Err_
+#define FT_ERR_BASE       FT_Mod_Err_Type1
 
 #include FT_ERRORS_H
 
diff --git a/src/winfonts/fnterrs.h b/src/winfonts/fnterrs.h
index 730d4ea..a05a7e9 100644
--- a/src/winfonts/fnterrs.h
+++ b/src/winfonts/fnterrs.h
@@ -30,13 +30,8 @@
 
 #undef __FTERRORS_H__
 
-#define FT_ERRORDEF_( e, v, s )   \
-          FT_ERRORDEF( FNT_Err_ ## e, v + FT_Mod_Err_Winfonts, s )
-#define FT_NOERRORDEF_( e, v, s ) \
-          FT_ERRORDEF( FNT_Err_ ## e, v, s )
-
-#define FT_ERROR_START_LIST       enum {
-#define FT_ERROR_END_LIST         FNT_Err_Max };
+#define FT_ERR_PREFIX     FNT_Err_
+#define FT_ERR_BASE       FT_Mod_Err_Winfonts
 
 #include FT_ERRORS_H