Commit 850fee2ccbc52805237b349db64db3da47605ec3

Werner Lemberg 2003-07-24T06:16:21

* include/freetype/internal/psaux.h (PS_Parser_FuncsRec): New member function `to_bytes'. * src/psaux/psauxmod.c (ps_parser_funcs): New member `ps_parser_to_bytes'. (psaux_module_class): Increase version to 0x20000L. * src/psaux/psobjs.c (IS_T1_LINESPACE): Add \f. (IS_T1_NULLSPACE): New macro. (IS_T1_SPACE): Add it. (skip_spaces, skip_alpha): New functions. (ps_parser_skip_spaces, ps_parser_skip_alpha): Use them. (ps_tobytes, ps_parser_to_bytes): New functions.

diff --git a/ChangeLog b/ChangeLog
index 56e393a..4dcb854 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2003-07-23  YAMANO-UCHI Hidetoshi  <mer@din.or.jp>
+
+	* include/freetype/internal/psaux.h (PS_Parser_FuncsRec): New
+	member function `to_bytes'.
+
+	* src/psaux/psauxmod.c (ps_parser_funcs): New member
+	`ps_parser_to_bytes'.
+	(psaux_module_class): Increase version to 0x20000L.
+
+	* src/psaux/psobjs.c (IS_T1_LINESPACE): Add \f.
+	(IS_T1_NULLSPACE): New macro.
+	(IS_T1_SPACE): Add it.
+	(skip_spaces, skip_alpha): New functions.
+	(ps_parser_skip_spaces, ps_parser_skip_alpha): Use them.
+	(ps_tobytes, ps_parser_to_bytes): New functions.
+
 2003-07-07  Werner Lemberg  <wl@gnu.org>
 
 	* builds/freetype.mk (DOC_DIR): New variable.
diff --git a/include/freetype/internal/psaux.h b/include/freetype/internal/psaux.h
index 1e5b7f2..71e0331 100644
--- a/include/freetype/internal/psaux.h
+++ b/include/freetype/internal/psaux.h
@@ -352,6 +352,12 @@ FT_BEGIN_HEADER
     FT_Fixed
     (*to_fixed)( PS_Parser  parser,
                  FT_Int     power_ten );
+    FT_Error
+    (*to_bytes)( PS_Parser  parser,
+                 FT_Byte*   bytes,
+                 FT_Int     max_bytes,
+                 FT_Int*    pnum_bytes );
+
     FT_Int
     (*to_coord_array)( PS_Parser  parser,
                        FT_Int     max_coords,
diff --git a/src/psaux/psauxmod.c b/src/psaux/psauxmod.c
index fa0c4aa..d602417 100644
--- a/src/psaux/psauxmod.c
+++ b/src/psaux/psauxmod.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType auxiliary PostScript module implementation (body).          */
 /*                                                                         */
-/*  Copyright 2000-2001, 2002 by                                           */
+/*  Copyright 2000-2001, 2002, 2003 by                                     */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -42,6 +42,7 @@
     ps_parser_skip_alpha,
     ps_parser_to_int,
     ps_parser_to_fixed,
+    ps_parser_to_bytes,
     ps_parser_to_coord_array,
     ps_parser_to_fixed_array,
     ps_parser_to_token,
@@ -104,7 +105,7 @@
     0,
     sizeof( FT_ModuleRec ),
     "psaux",
-    0x10000L,
+    0x20000L,
     0x20000L,
 
     &psaux_interface,  /* module-specific interface */
diff --git a/src/psaux/psobjs.c b/src/psaux/psobjs.c
index 09bfb47..c88e3e4 100644
--- a/src/psaux/psobjs.c
+++ b/src/psaux/psobjs.c
@@ -266,18 +266,24 @@
   /*************************************************************************/
   /*************************************************************************/
 
-
+  /* In the PostScript Language Reference Manual (PLRM) the following */
+  /* characters are called `white-space characters'.                  */
 #define IS_T1_WHITESPACE( c )  ( (c) == ' '  || (c) == '\t' )
-#define IS_T1_LINESPACE( c )   ( (c) == '\r' || (c) == '\n' )
+#define IS_T1_LINESPACE( c )   ( (c) == '\r' || (c) == '\n' || (c) == '\f' )
+#define IS_T1_NULLSPACE( c )   ( (c) == '\0' )
 
-#define IS_T1_SPACE( c )  ( IS_T1_WHITESPACE( c ) || IS_T1_LINESPACE( c ) )
+  /* According to the PLRM all white-space characters are equivalent, */
+  /* except in comments and strings.                                  */
+#define IS_T1_SPACE( c )  ( IS_T1_WHITESPACE( c ) || \
+                            IS_T1_LINESPACE( c )  || \
+                            IS_T1_NULLSPACE( c )  )
 
 
-  FT_LOCAL_DEF( void )
-  ps_parser_skip_spaces( PS_Parser  parser )
+  static void
+  skip_spaces( FT_Byte**  acur,
+               FT_Byte*   limit )
   {
-    FT_Byte*  cur   = parser->cursor;
-    FT_Byte*  limit = parser->limit;
+    FT_Byte* cur = *acur;
 
 
     while ( cur < limit )
@@ -289,15 +295,16 @@
         break;
       cur++;
     }
-    parser->cursor = cur;
+
+    *acur = cur;
   }
 
 
-  FT_LOCAL_DEF( void )
-  ps_parser_skip_alpha( PS_Parser  parser )
+  static void
+  skip_alpha( FT_Byte**  acur,
+              FT_Byte*   limit )
   {
-    FT_Byte*  cur   = parser->cursor;
-    FT_Byte*  limit = parser->limit;
+    FT_Byte*  cur = *acur;
 
 
     while ( cur < limit )
@@ -309,7 +316,22 @@
         break;
       cur++;
     }
-    parser->cursor = cur;
+
+    *acur = cur;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  ps_parser_skip_spaces( PS_Parser  parser )
+  {
+    skip_spaces( &parser->cursor, parser->limit );
+  }
+
+
+  FT_LOCAL_DEF( void )
+  ps_parser_skip_alpha( PS_Parser  parser )
+  {
+    skip_alpha( &parser->cursor, parser->limit );
   }
 
 
@@ -531,6 +553,69 @@
   }
 
 
+  /* <...>: hexadecimal string */
+  static FT_Error
+  ps_tobytes( FT_Byte**  cursor,
+              FT_Byte*   limit,
+              FT_Int     max_bytes,
+              FT_Byte*   bytes,
+              FT_Int*    pnum_bytes )
+  {
+    FT_Error  error = PSaux_Err_Ok;
+
+    FT_Byte*  cur = *cursor;
+    FT_Int    n   = 0;
+    FT_Byte   b;
+
+
+    skip_spaces( &cur, limit );
+
+    if ( *cur != '<' )
+    {
+      error = PSaux_Err_Invalid_File_Format;
+      goto Exit;
+    }
+
+    cur++;
+
+    for ( ; cur < limit; n++ )
+    {
+      FT_Byte*  cur2 = cur;
+
+
+      if ( n + 1 > max_bytes * 2 )
+        goto Exit;
+
+      /* All white-space charcters are ignored. */
+      skip_spaces( &cur, limit );
+
+      b = T1Radix( 16, &cur, cur + 1 );
+
+      if ( cur == cur2 )
+        break;
+
+      /* <f> == <f0> != <0f> */
+      bytes[n / 2] = ( n % 2 ) ? bytes[n / 2] + b
+                               : b * 16;
+    }
+
+    skip_spaces( &cur, limit );
+
+    if ( *cur != '>' )
+    {
+      error = PSaux_Err_Invalid_File_Format;
+      goto Exit;
+    }
+
+    *cursor = ++cur;
+
+  Exit:
+    *pnum_bytes = ( n + 1 ) / 2;
+
+    return error;
+  }
+
+
   static FT_Long
   t1_tofixed( FT_Byte**  cursor,
               FT_Byte*   limit,
@@ -1171,6 +1256,20 @@
   }
 
 
+  FT_LOCAL_DEF( FT_Error )
+  ps_parser_to_bytes( PS_Parser  parser,
+                      FT_Byte*   bytes,
+                      FT_Int     max_bytes,
+                      FT_Int*    pnum_bytes )
+  {
+    return ps_tobytes( &parser->cursor,
+                       parser->limit,
+                       max_bytes,
+                       bytes,
+                       pnum_bytes );
+  }
+
+
   FT_LOCAL_DEF( FT_Fixed )
   ps_parser_to_fixed( PS_Parser  parser,
                       FT_Int     power_ten )