[poppler] fofi/FoFiType1.cc

Albert Astals Cid aacid at kemper.freedesktop.org
Fri Oct 3 16:43:57 PDT 2008


 fofi/FoFiType1.cc |   28 ++++++++++++++++++++++++----
 1 file changed, 24 insertions(+), 4 deletions(-)

New commits:
commit e8e7809ab4b115cbe67251da12989fc024912514
Author: Albert Astals Cid <aacid at kde.org>
Date:   Sat Oct 4 01:43:02 2008 +0200

    There are files that have more than one encoding definition per line, make them work
    
    Fixes bug 17018, while at it, i've added some comments and some error() to make things a bit clearer

diff --git a/fofi/FoFiType1.cc b/fofi/FoFiType1.cc
index ffd0581..3435823 100644
--- a/fofi/FoFiType1.cc
+++ b/fofi/FoFiType1.cc
@@ -13,7 +13,7 @@
 // All changes made under the Poppler project to this file are licensed
 // under GPL version 2 or later
 //
-// Copyright (C) 2005 Albert Astals Cid <aacid at kde.org>
+// Copyright (C) 2005, 2008 Albert Astals Cid <aacid at kde.org>
 // Copyright (C) 2005 Kristian Høgsberg <krh at redhat.com>
 //
 // To see a description of the changes please see the Changelog file that
@@ -32,6 +32,7 @@
 #include "goo/gmem.h"
 #include "FoFiEncodings.h"
 #include "FoFiType1.h"
+#include "poppler/Error.h"
 
 //------------------------------------------------------------------------
 // FoFiType1
@@ -220,6 +221,7 @@ void FoFiType1::parse() {
 	   j < 300 && line && (line1 = getNextLine(line));
 	   ++j, line = line1) {
 	if ((n = line1 - line) > 255) {
+	  error(-1, "FoFiType1::parse a line has more than 255 characters, we don't support this");
 	  n = 255;
 	}
 	strncpy(buf, line, n);
@@ -229,8 +231,8 @@ void FoFiType1::parse() {
 	  for (p += 3; *p == ' ' || *p == '\t'; ++p) ;
 	  for (p2 = p; *p2 >= '0' && *p2 <= '9'; ++p2) ;
 	  if (*p2) {
-	    c = *p2;
-	    *p2 = '\0';
+	    c = *p2; // store it so we can recover it after atoi
+	    *p2 = '\0'; // terminate p so atoi works
 	    code = atoi(p);
 	    *p2 = c;
 	    if (code == 8 && *p2 == '#') {
@@ -244,8 +246,26 @@ void FoFiType1::parse() {
 	      if (*p == '/') {
 		++p;
 		for (p2 = p; *p2 && *p2 != ' ' && *p2 != '\t'; ++p2) ;
-		*p2 = '\0';
+		c = *p2; // store it so we can recover it after copyString
+		*p2 = '\0'; // terminate p so copyString works
 		encoding[code] = copyString(p);
+		*p2 = c;
+		p = p2;
+		for (; *p == ' ' || *p == '\t'; ++p); // eat spaces between string and put
+		if (!strncmp(p, "put", 3)) {
+		  // eat put and spaces and newlines after put
+		  for (p += 3; *p == ' ' || *p == '\t' || *p == '\n' || *p == '\r'; ++p); // 
+		  if (*p)
+		  {
+		    // there is still something after the definition
+		    // there might be another definition in this line
+		    // so move line1 to the end of our parsing
+		    // so we start in the potential next definition in the next loop
+		    line1 = &line[p - buf];
+		  }
+		} else {
+		  error(-1, "FoFiType1::parse no put after dup");
+		}
 	      }
 	    }
 	  }


More information about the poppler mailing list