shithub: freetype+ttf2subf

Download patch

ref: c30aea9846efff38b7eefb15c1f361d93dff65ea
parent: bfe2f98f1f352135da49f19dc0819607af27b8a0
author: David Turner <[email protected]>
date: Fri May 12 11:01:18 EDT 2000

another massive changes in order to completely avoid
compiler warnings with GCC + "-ansi -pedantic -Wall -W"
and LCC.

Also fixed the compilation of "type1z" with Win32-LCC
(its pre-processor is broken !!)

Updated the BUILD document too

git/fs: mount .git/fs: mount/attach disallowed
--- a/BUILD
+++ b/BUILD
@@ -151,7 +151,7 @@
      if you encounter this problem.
      
      Note that the release version will use Autoconf to detect everything
-     on UNix, so this will not be necessary !!
+     on Unix, so this will not be necessary !!
 
 
 II. DETAILED COMPILATION PROCEDURE:
@@ -160,46 +160,31 @@
   If you don't want to compile FreeType 2 from the command-line (for example
   from a graphical IDE on a Mac or Windows), you'll need to understand how the
   FreeType files are organized.
-  
-  First of all, all configuration files are located in "freetype2/config",
-  with system-specific overrides in "freetype2/config/<system>". You should
-  always place "config/<system>" and "config" in your compilation include
-  path, **in this order**
-  
-  Also, place the directory "include" in the compilation include path, as
-  well as "src/base" and "src/shared"
-  
-  Now, FreeType 2 is a very modular design, made of several distinct components.
-  Each component can be compiler either as a stand-alone object file, or as a
-  list of independent objects.
-  
-  For example, the "base layer" is made of the following independent source
-  files:
-  
-     freetype2/
-        src/
-           base/
-              ftcalc.c
-              ftdebug.c
-              ftextend.c
-              ftlist.c
-              ftobjs.c
-              ftstream.c
-              ftraster.c
-              ftoutln.c
-              ftsystem.c
 
-  You can compile each of these files separately.
+  FreeType 2 has a very module design, and it is made of several components.
+  Each component must be compiled as a stand-alone object file, even when it
+  is really made of several C source files. For example, the "base layer"
+  component is made of the following C files:
   
-  Another method is to compile the file "src/base/ftbase.c" which performs
-  a simple include on all these individual files. This will compile the whole
-  base layer as a single object file.
+    src/
+      base/
+        ftcalc.c    - computations
+        ftobjs.c    - object management
+        ftstream.c  - stream input
+        ftlist.c    - simple list management
+        ftoutln.c   - simple outline processing
+        ftextend.c  - extensions support
   
-  Note that through careful macro definitions, compiling a module as a single
-  component avoids the generation of many externals (that really correspond
-  to intra-module dependencies) and provides greater optimisations
-  opportunities.
+  However, you can create a single object file by compiling the file
+  "src/base/ftbase.c", whose content is:
   
+        #include <ftcalc.c>
+        #include <ftobjs.c>
+        #include <ftstream.c>
+        #include <ftlist.c>
+        #include <ftoutln.c>
+        #include <ftextend.c>
+
   Similarly, each component has a single "englobing" C file to compile it
   as a stand-alone object, i.e. :
   
@@ -209,9 +194,39 @@
      src/truetype/truetype.c   - the TrueType font driver
      src/type1/type1.c         - the Type 1 font driver
 
-  Now, you can decide how to compile each module, and add the corresponding
-  object files to your library..
+
+  To compile one component, do the following:
   
-  The directory "freetype2/include" contains all public header files that
-  may be included by client applications..
+   - add the top-level "include" directory to your compilation include path
+   
+   - add the component's path to your compilation include path too. Being
+     in the component's directory isn't enough !!
+
+   - compile the component "source" file (see list below).
+
+  For example, the following line can be used to compile the truetype driver
+  on Unix:
+  
+     cd freetype2/
+     cc -c -Iinclude -Isrc/truetype  src/truetype/truetype.c
+
+  Alternatively:
+  
+     cd freetype2/src/truetype
+     cc -c -I../../include -I. src/truetype/truetype.c
+
+  The complete list of files to compile for a feature-complete build of
+  FreeType 2 is:
+  
+     src/base/ftsystem.c         - system-specific memory and i/o support
+     src/base/ftinit.c           - initialisation layer
+     src/base/ftdebug.c          - debugging component (empty in release build)
+     src/base/ftbase.c           - the "base layer" component
+     src/base/ftraster.c         - the standard raster (scan-converter)
+     src/base/ftgrays.c          - the smooth raster (anti-aliased only)
+     src/base/ftglyph.c          - optional convenience functions
+     src/sfnt/sfnt.c             - the "sfnt" module
+     src/psnames/psnames.c       - the "psnames" module
+     src/truetype/truetype.c     - the TrueType font driver
+     src/type1/type1.c           - the Type 1 font driver
 
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,29 @@
 LATEST CHANGES - 
 
+  - light update/cleaning of the build system + changes to the sources in
+    order to get rid of _all_ compiler warnings with three compilers, i.e:
+
+      gcc with "-ansi -pedantic -Wall -W", Visual C++ with "/W3 /WX"
+      and LCC
+
+     IMPORTANT NOTE FOR WIN32-LCC USERS:
+     |
+     |  It seems the C pre-processor that comes with LCC is broken, it
+     |  doesn't recognize the ANSI standard directives # and ## correctly
+     |  when one of the argument is a macro. Also, something like:
+     |  
+     |     #define F(x)  print##x
+     |     
+     |     F(("hello"))
+     |     
+     |  will get incorrectly translated to:
+     |  
+     |     print "hello")
+     |     
+     |  by its pre-processor. For this reason, you simply cannot build
+     |  FreeType 2 in debug mode with this compiler..
+
+
   - yet another massive grunt work. I've changed the definition of the
     EXPORT_DEF, EXPORT_FUNC, BASE_DEF & BASE_FUNC macros. These now take
     an argument, which is the function's return value type.
@@ -27,6 +51,7 @@
       a different signature).
 
   - updated the tutorial (not finished though).
+  - updated the top-level BUILD  document
 
   - added the declaration of FT_New_Memory_Face in <freetype/freetype.h>, as
     it was missing from the public header (the implementation was already
--- a/config/detect.mk
+++ b/config/detect.mk
@@ -17,8 +17,8 @@
 # the following variables:
 #
 #   BUILD        The configuration and system-specific directory.  Usually
-#                `freetype/config/$(PLATFORM)' but can be different if a
-#                specific compiler has been requested on the command line.
+#                `freetype/config/$(PLATFORM)' but can be different for
+#                custom builds of the library.
 #
 # The following variables must be defined in system specific `detect.mk'
 # files:
@@ -25,8 +25,8 @@
 #
 #   PLATFORM     The detected platform.  This will default to `ansi' if
 #                auto-detection fails.
-#   CONFIG_FILE  The Makefile to use.  This usually depends on the compiler
-#                defined in the `CC' environment variable.
+#   CONFIG_FILE  The configuration sub-makefile to use.  This usually depends
+#                on the compiler defined in the `CC' environment variable.
 #   DELETE       The shell command used to remove a given file.
 #   COPY         The shell command used to copy one file.
 #   SEP          The platform-specific directory separator.
@@ -44,7 +44,7 @@
 endif
 
 # Set auto-detection default to `ansi'.
-# Note that we delay the evaluation of $(CONFIG_), $(BUILD), and
+# Note that we delay the evaluation of $(BUILD_CONFIG_), $(BUILD), and
 # $(CONFIG_RULES).
 #
 PLATFORM    := ansi
@@ -52,9 +52,9 @@
 COPY        := cp
 SEP         := /
 
-CONFIG_      = $(TOP)$(SEP)config$(SEP)
-BUILD        = $(CONFIG_)$(PLATFORM)
-CONFIG_RULES = $(BUILD)$(SEP)$(CONFIG_FILE)
+BUILD_CONFIG_ = $(TOP)$(SEP)config$(SEP)
+BUILD         = $(BUILD_CONFIG_)$(PLATFORM)
+CONFIG_RULES  = $(BUILD)$(SEP)$(CONFIG_FILE)
 
 # We define the BACKSLASH variable to hold a single back-slash character.
 # This is needed because a line like
@@ -74,7 +74,7 @@
 # directories.  Note that the calling order of the various `detect.mk' files
 # isn't predictable.
 #
-include $(wildcard $(CONFIG_)*/detect.mk)
+include $(wildcard $(BUILD_CONFIG_)*/detect.mk)
 
 # In case no detection rule file was successful, use the default.
 #
@@ -86,7 +86,7 @@
 # The following targets are equivalent, with the exception that they use
 # slightly different syntaxes for the `echo' command.
 #
-# std_setup: defined for most platforms
+# std_setup: defined for most (i.e. Unix-like) platforms
 # dos_setup: defined for Dos-ish platforms like Dos, Windows & OS/2
 #
 .PHONY: std_setup dos_setup
--- a/config/dos/detect.mk
+++ b/config/dos/detect.mk
@@ -13,11 +13,6 @@
 # fully.
 
 
-# This configuration file to be used depends on the value of the CC
-# environment variable which is set below according to the compiler name
-# given as a parameter to make.
-
-
 # We test for the COMSPEC environment variable, then run the `ver'
 # command-line program to see if its output contains the word `Dos'.
 #
--- a/config/os2/detect.mk
+++ b/config/os2/detect.mk
@@ -13,11 +13,6 @@
 # fully.
 
 
-# This configuration file to be used depends on the value of the CC
-# environment variable which is set below according to the compiler name
-# given as a parameter to make.
-
-
 ifeq ($(PLATFORM),ansi)
   ifdef OS2_SHELL
 
--- a/config/unix/detect.mk
+++ b/config/unix/detect.mk
@@ -13,7 +13,7 @@
 # fully.
 
 
-# This will probably change a lost in the future if we are going to use
+# This will probably change a lot in the future if we are going to use
 # Automake/Autoconf...
 
 
--- a/config/win32/detect.mk
+++ b/config/win32/detect.mk
@@ -13,11 +13,6 @@
 # fully.
 
 
-# This configuration file to be used depends on the value of the CC
-# environment variable which is set below according to the compiler name
-# given as a parameter to make.
-
-
 ifeq ($(PLATFORM),ansi)
 
   # Detecting Windows NT is easy, as the OS variable must be defined and
--- a/config/win32/w32-lcc.mk
+++ b/config/win32/w32-lcc.mk
@@ -128,7 +128,7 @@
 DIR_OBJ := $(subst /,\\,$(OBJ_DIR))
 
 $(FT_LIBRARY): $(OBJECTS_LIST)
-	lcclnk -o $(subst /,\\,$@) $(subst /,\\,$<)
+	lcclnk -o $(subst /,\\,$@) $(subst /,\\,$(OBJECTS_LIST))
 
 endif
 
--- a/demos/Makefile
+++ b/demos/Makefile
@@ -84,6 +84,7 @@
   LINK = $(CC) $T$@ $< $(FTLIB) $(EFENCE) $(LDFLAGS)
   COMMON_LINK = $(LINK) $(COMMON_OBJ)
   GRAPH_LINK  = $(COMMON_LINK) $(GRAPH_LIB)
+  GRAPH_LINK2 = $(GRAPH_LINK) $(EXTRA_GRAPH_OBJS)
 
   .PHONY: exes clean distclean
 
@@ -187,6 +188,8 @@
   $(OBJ_)ftgrays2.$O: $(SRC_DIR_)ftgrays2.c
 	  $(COMPILE) $T$@ $<
 
+  EXTRA_GRAPH_OBJS := $(OBJ_)ftrast.$O $(OBJ_)ftrast2.$O
+
   $(OBJ_)ftrast.$O: $(SRC_DIR_)ftrast.c
 	  $(COMPILE) $T$@ $<
 
@@ -268,7 +271,7 @@
 
 
   $(BIN_)ftview$E: $(OBJ_)ftview.$O $(FTLIB) $(GRAPH_LIB) $(COMMON_OBJ) $(OBJ_)ftrast2.$O $(OBJ_)ftrast.$O
-	  $(GRAPH_LINK) $(OBJ_)ftrast2.$O $(OBJ_)ftrast.$O
+	  $(GRAPH_LINK2)
 
   $(BIN_)ftstring$E: $(OBJ_)ftstring.$O $(FTLIB) $(GRAPH_LIB) $(COMMON_OBJ)
 	  $(GRAPH_LINK)
--- a/demos/graph/win32/rules.mk
+++ b/demos/graph/win32/rules.mk
@@ -46,6 +46,7 @@
 LINK              = $(LINK_ROOT) $(subst /,\\,$(FTLIB))
 COMMON_LINK       = $(LINK_ROOT) $(subst /,\\,$(COMMON_OBJ)) $(subst /,\\,$(FTLIB))
 GRAPH_LINK        = $(LINK_ROOT) $(subst /,\\,$(COMMON_OBJ)) $(subst /,\\,$(GRAPH_LIB)) $(subst /,\\,$(FTLIB))
+GRAPH_LINK2       = $(GRAPH_LINK) $(subst /,\\,$(EXTRA_GRAPH_OBJS))
 endif
 endif
 
--- a/demos/src/ftrast.c
+++ b/demos/src/ftrast.c
@@ -257,15 +257,7 @@
           (( sizeof(TProfile)+sizeof(long)-1 ) / sizeof(long))
 
 
-  /* Left fill bitmask */
-  static const Byte  LMask[8] =
-    { 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01 };
 
-  /* Right fill bitmask */
-  static const Byte  RMask[8] =
-    { 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF };
-
-
 #ifdef TT_STATIC_RASTER
 
 #define  RAS_ARGS  /* void */
@@ -1815,7 +1807,7 @@
   {
     Long  pitch = ras.target.pitch;
     
-    (void)max;
+    UNUSED(max);
     
     ras.traceIncr = (Short)- pitch;
     ras.traceOfs  = - *min * pitch;
@@ -1838,9 +1830,9 @@
     Byte   f1, f2;
     Byte*  target;
 
-    (void)y;
-    (void)left;
-    (void)right;
+    UNUSED(y);
+    UNUSED(left);
+    UNUSED(right);
 
     /* Drop-out control */
 
@@ -2015,9 +2007,9 @@
   static void  Horizontal_Sweep_Init( RAS_ARGS Short*  min, Short*  max )
   {
     /* nothing, really */
-    (void)raster;
-    (void)min;
-    (void)max;
+    UNUSED(raster);
+    UNUSED(min);
+    UNUSED(max);
   }
 
 
@@ -2031,8 +2023,8 @@
     PByte bits;
     Byte  f1;
 
-    (void)left;
-    (void)right;
+    UNUSED(left);
+    UNUSED(right);
     
     if ( x2-x1 < ras.precision )
     {
@@ -2173,7 +2165,7 @@
   static void Horizontal_Sweep_Step( RAS_ARG )
   {
     /* Nothing, really */
-    (void)raster;
+    UNUSED(raster);
   }
 
 
@@ -2285,12 +2277,12 @@
                                                     PProfile    right )
   {
     /* nothing, really */
-    (void)raster;
-    (void)y;
-    (void)x1;
-    (void)x2;
-    (void)left;
-    (void)right;
+    UNUSED(raster);
+    UNUSED(y);
+    UNUSED(x1);
+    UNUSED(x2);
+    UNUSED(left);
+    UNUSED(right);
   }
 
   static void  Horizontal_Gray_Sweep_Drop( RAS_ARGS Short       y,
--- a/include/freetype/config/ftconfig.h
+++ b/include/freetype/config/ftconfig.h
@@ -95,6 +95,13 @@
 #define FT_ALIGNMENT  8
 
 
+/* UNUSED is a macro used to indicate that a given parameter is not used */
+/* this is only used to get rid of unpleasant compiler warnings..        */
+#ifndef UNUSED
+#define UNUSED( arg )  ( (arg)=(arg) )
+#endif
+
+
 
   /*************************************************************************/
   /*                                                                       */
--- a/include/freetype/config/ftoption.h
+++ b/include/freetype/config/ftoption.h
@@ -170,7 +170,7 @@
   /*   Don't define any of these macros to compile in `release' mode.      */
   /*                                                                       */
 #undef  FT_DEBUG_LEVEL_ERROR
-#define FT_DEBUG_LEVEL_TRACE
+#undef  FT_DEBUG_LEVEL_TRACE
 
 
   /*************************************************************************/
--- a/include/freetype/internal/ftdebug.h
+++ b/include/freetype/internal/ftdebug.h
@@ -51,6 +51,11 @@
 #endif
 
 
+/* A very stupid pre-processor trick. See K&R version 2 */
+/* section A12.3 for details..                          */
+#define FT_CAT(x,y)   x ## y
+#define FT_XCAT(x,y)  FT_CAT(x,y)
+
 #ifdef FT_DEBUG_LEVEL_TRACE
 
 
@@ -78,15 +83,6 @@
     trace_ttextend,
     trace_ttdriver,
 
-#if 0
-    /* define an enum for each TrueDoc driver component */
-    trace_tdobjs,
-    trace_tdload,
-    trace_tdgload,
-    trace_tdhint,
-    trace_tddriver,
-#endif
-
     /* define an enum for each Type1 driver component */
     trace_t1objs,
     trace_t1load,
@@ -120,7 +116,7 @@
           do                                                \
           {                                                 \
             if ( ft_trace_levels[FT_COMPONENT] >= level )   \
-              FT_Message##varformat;                        \
+              FT_XCAT( FT_Message, varformat );             \
           } while ( 0 )
 
 
@@ -174,7 +170,7 @@
   /* print a message and exit */
   EXPORT_DEF(void)  FT_Panic  ( const char*  fmt, ... );
 
-#define FT_ERROR( varformat )  FT_Message##varformat
+#define FT_ERROR(varformat)  do { FT_XCAT( FT_Message, varformat ) } while(0)
 
 
 #endif /* FT_DEBUG_LEVEL_TRACE || FT_DEBUG_LEVEL_ERROR */
--- a/include/freetype/internal/ftobjs.h
+++ b/include/freetype/internal/ftobjs.h
@@ -46,7 +46,7 @@
 #endif
 
 #ifndef UNUSED
-#define UNUSED( arg )  ( (void)(arg) )
+#define UNUSED( arg )  ( (void)(arg)=(arg) )
 #endif
 
 
--- a/src/base/ftgrays.c
+++ b/src/base/ftgrays.c
@@ -1151,7 +1151,7 @@
     TScan  x, y, cover, area;
     PCell  start, cur, limit;
 
-    (void)target;
+    target=target;
 
     cur   = ras.cells;
     limit = cur + ras.num_cells;
--- a/src/base/ftinit.c
+++ b/src/base/ftinit.c
@@ -88,8 +88,10 @@
       error = FT_Add_Driver( library, *cur );
       /* notify errors, but don't stop */
       if ( error )
+      {
         FT_ERROR(( "FT.Default_Drivers: Cannot install `%s', error = %x\n",
                    (*cur)->driver_name, error ));
+      }
       cur++;
     }
   }
--- a/src/base/ftraster.c
+++ b/src/base/ftraster.c
@@ -66,8 +66,8 @@
 #include <freetype/internal/ftdebug.h>
 #endif
 
-#ifndef EXPORT_FUNC
-#define EXPORT_FUNC  /* nothing */
+#ifndef UNUSED
+#define UNUSED( arg )  ( (arg)=(arg) )
 #endif
 
 #undef  FT_COMPONENT
@@ -279,7 +279,7 @@
   /* `->'                                                              */
 #define ras       (*raster)
 
-#define           UNUSED_RASTER   (void)raster;
+#define           UNUSED_RASTER   (raster=raster);
 
   /*************************************************************************/
   /*                                                                       */
--- a/src/base/ftsystem.c
+++ b/src/base/ftsystem.c
@@ -66,7 +66,7 @@
   void*  ft_alloc( FT_Memory  memory,
                    long       size )
   {
-    (void)memory;
+    UNUSED(memory);
     return malloc(size);
   }
 
@@ -110,8 +110,8 @@
                      long       new_size,
                      void*      block )
   {
-    (void)memory;
-    (void)cur_size;
+    UNUSED(memory);
+    UNUSED(cur_size);
 
     return realloc( block, new_size );
   }
@@ -140,7 +140,7 @@
   void  ft_free( FT_Memory  memory,
                  void*      block )
   {
-    (void)memory;
+    UNUSED(memory);
     free( block );
   }
 
--- a/src/psnames/psdriver.c
+++ b/src/psnames/psdriver.c
@@ -233,7 +233,11 @@
     100,        /* driver version                      */
     200,        /* driver requires FreeType 2 or above */
 
-    (void*)&psnames_interface
+    (void*)&psnames_interface,
+    0, 0, 0, 0,
+    0, 0, 0, 0,
+    0, 0, 0, 0,
+    0, 0,
   };
 
 #else
--- a/src/sfnt/sfdriver.c
+++ b/src/sfnt/sfdriver.c
@@ -66,6 +66,10 @@
     1,          /* driver version                      */
     2,          /* driver requires FreeType 2 or above */
 
-    (void*)&sfnt_interface
+    (void*)&sfnt_interface,
+    0, 0, 0, 0,
+    0, 0, 0, 0,
+    0, 0, 0, 0,
+    0, 0,
   };
 
--- a/src/sfnt/ttload.c
+++ b/src/sfnt/ttload.c
@@ -267,6 +267,7 @@
 
     TT_Table *entry, *limit;
 
+    UNUSED(faceIndex);
 
     FT_TRACE2(( "TT_Load_Directory( %08lx, %ld )\n",
               (TT_Long)face, faceIndex ));
--- a/src/sfnt/ttsbit.c
+++ b/src/sfnt/ttsbit.c
@@ -467,6 +467,7 @@
 
     /* this table is optional */
     error = face->goto_table( face, TTAG_EBLC, stream, 0 );
+    if (error)
     {
       error = 0;
       goto Exit;
--- a/src/truetype/ttdriver.c
+++ b/src/truetype/ttdriver.c
@@ -475,8 +475,8 @@
                              TT_UInt  pixel_width,
                              TT_UInt  pixel_height )
   {
-    (void) pixel_width;
-    (void) pixel_height;
+    UNUSED(pixel_width);
+    UNUSED(pixel_height);
 
     /* many things were pre-computed by the base layer */
 
@@ -640,7 +640,7 @@
   static
   FTDriver_Interface  tt_get_interface( TT_Driver  driver, const char* interface )
   {
-    (void)driver;
+    UNUSED(driver);
     
     if (strcmp(interface,"get_sfnt")==0)
       return (FTDriver_Interface)tt_get_sfnt_table;
--- a/src/truetype/ttinterp.c
+++ b/src/truetype/ttinterp.c
@@ -117,7 +117,7 @@
   /* This macro is used whenever `exec' is unused in a function, to avoid  */
   /* stupid warnings from pedantic compilers.                              */
   /*                                                                       */
-#define UNUSED_EXEC  (void)CUR
+#define UNUSED_EXEC  UNUSED(CUR)
 
 
   /*************************************************************************/
@@ -125,7 +125,7 @@
   /* This macro is used whenever `args' is unused in a function, to avoid  */
   /* stupid warnings from pedantic compilers.                              */
   /*                                                                       */
-#define UNUSED_ARG  UNUSED_EXEC; (void)args;
+#define UNUSED_ARG  UNUSED_EXEC; UNUSED(args);
 
 
   /*************************************************************************/
@@ -719,7 +719,7 @@
     exec->callTop = 0;
 
 #if 1
-    (void)debug;
+    UNUSED(debug);
     return exec->face->interpreter( exec );
 #else
     if ( !debug )
--- a/src/truetype/ttobjs.c
+++ b/src/truetype/ttobjs.c
@@ -165,8 +165,8 @@
     PSNames_Interface* psnames;
 
     /* for now, parameters are unused */
-    (void)num_params;
-    (void)params;
+    UNUSED(num_params);
+    UNUSED(params);
 
     sfnt = (SFNT_Interface*)face->sfnt;
     if (!sfnt)
--- a/src/type1/t1gload.c
+++ b/src/type1/t1gload.c
@@ -399,9 +399,9 @@
     }
 
 
-    (void)threshold;
-    (void)end_x;
-    (void)end_y;
+    UNUSED(threshold);
+    UNUSED(end_x);
+    UNUSED(end_y);
 
     flex  = decoder->flex_vectors;
 
@@ -1052,9 +1052,9 @@
     if (wx > decoder->builder.advance.x)
       decoder->builder.advance.x = wx;
 
-    (void)sbx;
-    (void)sby;
-    (void)wy;
+    UNUSED(sbx);
+    UNUSED(sby);
+    UNUSED(wy);
     return -1;    /* return an error code to exit the Type 1 parser */
                   /* immediately.                                   */
   }
@@ -1127,7 +1127,6 @@
                                     type1->subrs,
                                     type1->subrs_len );
       /* ignore the error if one occured - skip to next glyph */
-      (void)error;
     }
 
     *max_advance = decoder.builder.advance.x;
--- a/src/type1/t1load.c
+++ b/src/type1/t1load.c
@@ -554,7 +554,7 @@
   static
   T1_Error  Do_Def_Ignore( T1_Parser*  parser )
   {
-    (void)parser;
+    UNUSED(parser);
     return T1_Err_Ok;
   }
 
--- a/src/type1/t1objs.c
+++ b/src/type1/t1objs.c
@@ -230,10 +230,10 @@
     T1_Error            error;
     PSNames_Interface*  psnames;
 
-    (void)num_params;
-    (void)params;
-    (void)face_index;
-    (void)face;
+    UNUSED(num_params);
+    UNUSED(params);
+    UNUSED(face_index);
+    UNUSED(face);
 
     face->root.num_faces = 1;
 
@@ -506,7 +506,7 @@
   LOCAL_FUNC
   T1_Error  T1_Init_Driver( T1_Driver  driver )
   {
-    (void)driver;
+    UNUSED(driver);
     return T1_Err_Ok;
   }
 
@@ -527,7 +527,7 @@
   LOCAL_DEF
   void  T1_Done_Driver( T1_Driver  driver )
   {
-    (void)driver;
+    UNUSED(driver);
   }
 
 
--- a/src/type1/t1tokens.c
+++ b/src/type1/t1tokens.c
@@ -170,8 +170,6 @@
 
       FT_TRACE2(( "Growing tokenizer buffer by %d bytes\n", left_bytes ));
 
-      (void)stream;  /* unused in non reentrant mode */
-
       if ( !REALLOC( tokzer->base, tokzer->limit, 
                      tokzer->limit + left_bytes )                 &&
            !FILE_Read( tokzer->base + tokzer->limit, left_bytes ) )
--- a/src/type1z/t1gload.c
+++ b/src/type1z/t1gload.c
@@ -1217,7 +1217,6 @@
                                     type1->subrs,
                                     type1->subrs_len );
       /* ignore the error if one occured - skip to next glyph */
-      (void)error;
     }
 
     *max_advance = decoder.builder.advance.x;
@@ -1271,7 +1270,7 @@
       T1_Init_Decoder( &decoder );
       T1_Init_Builder( &decoder.builder, face, size, glyph );
   
-      decoder.builder.no_recurse = !!(load_flags & FT_LOAD_NO_RECURSE);
+      decoder.builder.no_recurse = (FT_Bool)!!(load_flags & FT_LOAD_NO_RECURSE);
       
       /* now load the unscaled outline */
       error = T1_Parse_CharStrings( &decoder,
--- a/src/type1z/t1load.c
+++ b/src/type1z/t1load.c
@@ -83,62 +83,64 @@
   /* each callback is in charge of loading a value and storing it in a  */
   /* given field of the Type 1 face..                                   */
  
-#define PARSE_(x)  static void parse_##x ( T1_Face  face, T1_Loader* loader )
+#define PARSE_(x)  static void FT_XCAT(parse_,x) ( T1_Face  face, T1_Loader* loader )
 
+#define FIELD   FACE.x
+
 #define PARSE_STRING(s,x)   PARSE_(x)                               \
         {                                                           \
-          FACE.##x = T1_ToString(&loader->parser);                  \
-          FT_TRACE2(( "type1.parse_##x##: \"%s\"\n", FACE.##x ));   \
+          FACE.x = T1_ToString(&loader->parser);                  \
+          FT_TRACE2(( "type1.parse_%s: \"%s\"\n", #x, FACE.x ));   \
         }
 
 #define PARSE_NUM(s,x,t)  PARSE_(x)                                 \
         {                                                           \
-          FACE.##x = (t)T1_ToInt(&loader->parser);                  \
-          FT_TRACE2(( "type1.parse_##x##: \"%d\"\n", FACE.##x ));   \
+          FACE.x = (t)T1_ToInt(&loader->parser);                  \
+          FT_TRACE2(( "type1.parse_%s: \"%d\"\n", #x, FACE.x ));   \
         }
         
 #define PARSE_INT(s,x)   PARSE_(x)                                  \
         {                                                           \
-          FACE.##x = T1_ToInt(&loader->parser);                     \
-          FT_TRACE2(( "type1.parse_##x##: \"%d\"\n", FACE.##x ));   \
+          FACE.x = T1_ToInt(&loader->parser);                     \
+          FT_TRACE2(( "type1.parse_%s: \"%d\"\n", #x, FACE.x ));   \
         }
 
 #define PARSE_BOOL(s,x)   PARSE_(x)                                 \
         {                                                           \
-          FACE.##x = T1_ToBool(&loader->parser);                    \
-          FT_TRACE2(( "type1.parse_##x##: \"%s\"\n",                \
-                       FACE.##x ? "true" : "false" ));              \
+          FACE.x = T1_ToBool(&loader->parser);                    \
+          FT_TRACE2(( "type1.parse_%s : \"%s\"\n",                \
+                       #x, FACE.x ? "true" : "false" ));              \
         }
  
 #define PARSE_FIXED(s,x)   PARSE_(x)                                        \
         {                                                                   \
-          FACE.##x = T1_ToFixed(&loader->parser,3);                         \
-          FT_TRACE2(( "type1.parse_##x##: \"%f\"\n", FACE.##x/65536.0 ));   \
+          FACE.x = T1_ToFixed(&loader->parser,3);                         \
+          FT_TRACE2(( "type1.parse_%s: \"%f\"\n", #x, FACE.x/65536.0 ));   \
         }
  
 #define PARSE_COORDS(s,c,m,x)   PARSE_(x)                                         \
         {                                                                         \
-          FACE.##c = T1_ToCoordArray(&loader->parser, m, (T1_Short*)FACE.##x );   \
-          FT_TRACE2(( "type1.parse_##x##\n" ));                                   \
+          FACE.c = T1_ToCoordArray(&loader->parser, m, (T1_Short*)FACE.x );   \
+          FT_TRACE2(( "type1.parse_%s\n", #x ));                                   \
         }
            
 #define PARSE_FIXEDS(s,c,m,x)   PARSE_(x)                                           \
         {                                                                           \
-          FACE.##c = T1_ToFixedArray(&loader->parser, m, (T1_Fixed*)FACE.##x, 3 );  \
-          FT_TRACE2(( "type1.parse_##x##\n" ));                                     \
+          FACE.c = T1_ToFixedArray(&loader->parser, m, (T1_Fixed*)FACE.x, 3 );  \
+          FT_TRACE2(( "type1.parse_%s\n", #x ));                                     \
         }
 
 
 #define PARSE_COORDS2(s,m,x)   PARSE_(x)                                     \
         {                                                                    \
-          (void)T1_ToCoordArray( &loader->parser, m, (T1_Short*)&FACE.##x );  \
-          FT_TRACE2(( "type1.parse_##x##\n" ));                              \
+          (void)T1_ToCoordArray( &loader->parser, m, (T1_Short*)&FACE.x );  \
+          FT_TRACE2(( "type1.parse_%s\n", #x ));                              \
         }
 
 #define PARSE_FIXEDS2(s,m,x)   PARSE_(x)                                           \
         {                                                                           \
-          (void)T1_ToFixedArray(&loader->parser, m, (T1_Fixed*)&FACE.##x, 3 );  \
-          FT_TRACE2(( "type1.parse_##x##\n" ));                                     \
+          (void)T1_ToFixedArray(&loader->parser, m, (T1_Fixed*)&FACE.x, 3 );  \
+          FT_TRACE2(( "type1.parse_%s\n", #x ));                                     \
         }
 
 
--- a/src/type1z/t1objs.c
+++ b/src/type1z/t1objs.c
@@ -53,7 +53,7 @@
   LOCAL_FUNC
   void  T1_Done_Size( T1_Size  size )
   {
-    (void)size;
+    UNUSED(size);
   }
 
 
@@ -76,11 +76,7 @@
   LOCAL_DEF
   T1_Error  T1_Init_Size( T1_Size  size )
   {
-    T1_Error    error;
-      
     size->valid = 0;
-    
-    (void)error;
     return T1_Err_Ok;
   }
 
@@ -105,7 +101,7 @@
   LOCAL_FUNC
   T1_Error  T1_Reset_Size( T1_Size  size )
   {
-    (void)size;
+    UNUSED(size);
     return 0;
   }
 
@@ -461,7 +457,7 @@
   LOCAL_FUNC
   T1_Error  T1_Init_Driver( T1_Driver  driver )
   {
-    (void)driver;
+    UNUSED(driver);
     return T1_Err_Ok;
   }
 
@@ -482,7 +478,7 @@
   LOCAL_DEF
   void  T1_Done_Driver( T1_Driver  driver )
   {
-    (void)driver;
+    UNUSED(driver);
   }