poppler/Link.cc |   35 +++++++++++++++++++----------------
 1 file changed, 19 insertions(+), 16 deletions(-)

New commits:
commit b655316706ec394fa6c8ad076d9d9d96ac8ed563
Author: Albert Astals Cid <[email protected]>
Date:   Mon Sep 5 21:05:55 2011 +0200

    xpdf303: Rework LinkURI decoding

diff --git a/poppler/Link.cc b/poppler/Link.cc
index bdbba57..54ef698 100644
--- a/poppler/Link.cc
+++ b/poppler/Link.cc
@@ -542,28 +542,31 @@ LinkURI::LinkURI(Object *uriObj, GooString *baseURI) {
 
   uri = NULL;
   if (uriObj->isString()) {
-    uri2 = uriObj->getString()->copy();
-    if (baseURI && baseURI->getLength() > 0) {
-      n = strcspn(uri2->getCString(), "/:");
-      if (n == uri2->getLength() || uri2->getChar(n) == '/') {
+    uri2 = uriObj->getString();
+    n = (int)strcspn(uri2->getCString(), "/:");
+    if (n < uri2->getLength() && uri2->getChar(n) == ':') {
+      // "http:..." etc.
+      uri = uri2->copy();
+    } else if (!uri2->cmpN("www.", 4)) {
+      // "www.[...]" without the leading "http://";
+      uri = new GooString("http://";);
+      uri->append(uri2);
+    } else {
+      // relative URI
+      if (baseURI) {
        uri = baseURI->copy();
        c = uri->getChar(uri->getLength() - 1);
-       if (c == '/' || c == '?') {
-         if (uri2->getChar(0) == '/') {
-           uri2->del(0);
-         }
+       if (c != '/' && c != '?') {
+         uri->append('/');
+       }
+       if (uri2->getChar(0) == '/') {
+         uri->append(uri2->getCString() + 1, uri2->getLength() - 1);
        } else {
-         if (uri2->getChar(0) != '/') {
-           uri->append('/');
-         }
+         uri->append(uri2);
        }
-       uri->append(uri2);
-       delete uri2;
       } else {
-       uri = uri2;
+       uri = uri2->copy();
       }
-    } else {
-      uri = uri2;
     }
   } else {
     error(errSyntaxWarning, -1, "Illegal URI-type link");
_______________________________________________
poppler mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/poppler

Reply via email to