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 2020/06/21 04:34:45 UTC

svn commit: r1879056 - in /pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf: BufferedRandomAccessFile.java TTFDataStream.java

Author: tilman
Date: Sun Jun 21 04:34:45 2020
New Revision: 1879056

URL: http://svn.apache.org/viewvc?rev=1879056&view=rev
Log:
PDFBOX-4890: remove recursion

Modified:
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/BufferedRandomAccessFile.java
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/TTFDataStream.java

Modified: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/BufferedRandomAccessFile.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/BufferedRandomAccessFile.java?rev=1879056&r1=1879055&r2=1879056&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/BufferedRandomAccessFile.java (original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/BufferedRandomAccessFile.java Sun Jun 21 04:34:45 2020
@@ -148,25 +148,37 @@ public class BufferedRandomAccessFile ex
     @Override
     public int read(byte[] b, int off, int len) throws IOException
     {
-        int leftover = bufend - bufpos;
-        if (len <= leftover)
-        {
-            System.arraycopy(buffer, bufpos, b, off, len);
-            bufpos += len;
-            return len;
-        }
-        System.arraycopy(buffer, bufpos, b, off, leftover);
-        bufpos += leftover;
-        if (fillBuffer() > 0)
+        int curLen = len; // length of what is left to read (shrinks)
+        int curOff = off; // offset where to put read data (grows)
+        int totalRead = 0;
+
+        while (true)
         {
-            //TODO PDFBOX-4890 remove recursive call. When done, remove Math.min() in TTFDataStream.read()
-            int bytesRead = read(b, off + leftover, len - leftover);
-            if (bytesRead > 0)
+            int leftover = bufend - bufpos;
+            if (curLen <= leftover)
+            {
+                System.arraycopy(buffer, bufpos, b, curOff, curLen);
+                bufpos += curLen;
+                return totalRead + curLen;
+            }
+            // curLen > leftover, we need to read more than what remains in buffer
+            System.arraycopy(buffer, bufpos, b, curOff, leftover);
+            totalRead += leftover;
+            bufpos += leftover;
+            if (fillBuffer() > 0)
+            {
+                curOff += leftover;
+                curLen -= leftover;
+            }
+            else
             {
-                leftover += bytesRead;
+                if (totalRead == 0)
+                {
+                    return -1;
+                }
+                return totalRead;
             }
         }
-        return leftover > 0 ? leftover : -1;
     }
 
     /**

Modified: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/TTFDataStream.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/TTFDataStream.java?rev=1879056&r1=1879055&r2=1879056&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/TTFDataStream.java (original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/TTFDataStream.java Sun Jun 21 04:34:45 2020
@@ -251,8 +251,7 @@ abstract class TTFDataStream implements
         int totalAmountRead = 0;
         // read at most numberOfBytes bytes from the stream.
         while (totalAmountRead < numberOfBytes
-               //TODO PDFBOX-4890: remove Math.min() after removing recursive call from BufferedRandomAccessFile.read
-                && (amountRead = read(data, totalAmountRead, Math.min(numberOfBytes - totalAmountRead, 65536))) != -1)
+                && (amountRead = read(data, totalAmountRead, numberOfBytes - totalAmountRead)) != -1)
         {
             totalAmountRead += amountRead;
         }