You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2014/07/19 15:26:30 UTC

svn commit: r1611912 - /pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/type1/Type1Lexer.java

Author: tilman
Date: Sat Jul 19 13:26:30 2014
New Revision: 1611912

URL: http://svn.apache.org/r1611912
Log:
PDFBOX-2216: skip NUL bytes
PDFBOX-2227: handle radix numbers

Modified:
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/type1/Type1Lexer.java

Modified: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/type1/Type1Lexer.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/type1/Type1Lexer.java?rev=1611912&r1=1611911&r2=1611912&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/type1/Type1Lexer.java (original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/type1/Type1Lexer.java Sat Jul 19 13:26:30 2014
@@ -21,6 +21,8 @@ package org.apache.fontbox.type1;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 
 /**
  * Lexer for the ASCII portions of an Adobe Type 1 font.
@@ -42,7 +44,12 @@ import java.nio.ByteBuffer;
  */
 class Type1Lexer
 {
-    private ByteBuffer buffer;
+    /**
+     * Log instance.
+     */
+    private static final Log LOG = LogFactory.getLog(Type1Lexer.class);
+    
+    private final ByteBuffer buffer;
     private Token aheadToken;
     private int openParens = 0;
 
@@ -53,7 +60,7 @@ class Type1Lexer
      */
     public Type1Lexer(byte[] bytes) throws IOException
     {
-        this.buffer = ByteBuffer.wrap(bytes);
+        buffer = ByteBuffer.wrap(bytes);
         aheadToken = readToken(null);
     }
 
@@ -139,6 +146,11 @@ class Type1Lexer
                 {
                     skip = true;
                 }
+                else if (c == 0)
+                {
+                    LOG.warn("NULL byte in font, skipped");
+                    skip = true;
+                }
                 else
                 {
                     buffer.position(buffer.position() -1);
@@ -185,6 +197,7 @@ class Type1Lexer
         buffer.mark();
 
         StringBuilder sb = new StringBuilder();
+        StringBuilder radix = null;
         char c = getChar();
         boolean hasDigit = false;
 
@@ -209,6 +222,13 @@ class Type1Lexer
             sb.append(c);
             c = getChar();
         }
+        else if (c == '#')
+        {
+            // PostScript radix number takes the form base#number
+            radix = sb;
+            sb = new StringBuilder();
+            c = getChar();
+        }
         else if (sb.length() == 0 || !hasDigit)
         {
             // failure
@@ -268,9 +288,13 @@ class Type1Lexer
                 c = getChar();
             }
         }
-
-        // real
-        buffer.position(buffer.position() -1);
+        
+        buffer.position(buffer.position() - 1);
+        if (radix != null)
+        {
+            Integer val = Integer.parseInt(sb.toString(), Integer.parseInt(radix.toString()));
+            return new Token(val.toString(), Token.INTEGER);
+        }
         return new Token(sb.toString(), Token.REAL);
     }