summaryrefslogtreecommitdiff
path: root/poppler/FileSpec.cc
diff options
context:
space:
mode:
authorCarlos Garcia Campos <carlosgc@gnome.org>2009-07-07 10:57:31 +0200
committerCarlos Garcia Campos <carlosgc@gnome.org>2009-07-08 11:20:17 +0200
commitef261f5f72d37a0aa2709611ee2bad7d55340ed8 (patch)
treed7d1b71dca42f949e829edfa85b54176da52c41a /poppler/FileSpec.cc
parentcafd4653dc6c7574214e80aa09489dcd24e347a6 (diff)
Do not use F and UF entries if Unix or DOS are present in FileSpec dict
Diffstat (limited to 'poppler/FileSpec.cc')
-rw-r--r--poppler/FileSpec.cc114
1 files changed, 51 insertions, 63 deletions
diff --git a/poppler/FileSpec.cc b/poppler/FileSpec.cc
index 07a5ed8c..9ec48570 100644
--- a/poppler/FileSpec.cc
+++ b/poppler/FileSpec.cc
@@ -5,7 +5,7 @@
// All changes made under the Poppler project to this file are licensed
// under GPL version 2 or later
//
-// Copyright (C) 2008 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2008-2009 Carlos Garcia Campos <carlosgc@gnome.org>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -63,84 +63,72 @@ GBool getFileSpecNameForPlatform (Object *fileSpec, Object *fileName)
return gTrue;
}
- Object obj1;
- GooString *name;
-
- name = NULL;
-
if (fileSpec->isDict()) {
#ifdef WIN32
- if (!fileSpec->dictLookup("DOS", &obj1)->isString()) {
+ fileSpec->dictLookup("DOS", fileName);
#else
- if (!fileSpec->dictLookup("Unix", &obj1)->isString()) {
+ fileSpec->dictLookup("Unix", fileName);
#endif
- obj1.free();
- if (fileSpec->dictLookup("UF", &obj1)->isString ()) {
- name = obj1.getString()->copy();
- } else if (fileSpec->dictLookup("F", &obj1)->isString ()) {
- name = obj1.getString()->copy();
- } else {
- error(-1, "Illegal file spec in link");
+ if (!fileName->isString()) {
+ fileName->free();
+ if (!fileSpec->dictLookup("UF", fileName)->isString ()) {
+ fileName->free();
+ if (!fileSpec->dictLookup("F", fileName)->isString ()) {
+ fileName->free();
+ error(-1, "Illegal file spec");
+ return gFalse;
+ }
}
}
- obj1.free();
-
- // error
} else {
- error(-1, "Illegal file spec in link");
+ error(-1, "Illegal file spec");
+ return gFalse;
}
// system-dependent path manipulation
- if (name) {
#ifdef WIN32
- int i, j;
-
- // "//...." --> "\...."
- // "/x/...." --> "x:\...."
- // "/server/share/...." --> "\\server\share\...."
- // convert escaped slashes to slashes and unescaped slashes to backslashes
- i = 0;
- if (name->getChar(0) == '/') {
- if (name->getLength() >= 2 && name->getChar(1) == '/') {
- name->del(0);
- i = 0;
- } else if (name->getLength() >= 2 &&
- ((name->getChar(1) >= 'a' && name->getChar(1) <= 'z') ||
- (name->getChar(1) >= 'A' && name->getChar(1) <= 'Z')) &&
- (name->getLength() == 2 || name->getChar(2) == '/')) {
- name->setChar(0, name->getChar(1));
- name->setChar(1, ':');
- i = 2;
- } else {
- for (j = 2; j < name->getLength(); ++j) {
- if (name->getChar(j-1) != '\\' &&
- name->getChar(j) == '/') {
- break;
- }
- }
- if (j < name->getLength()) {
- name->setChar(0, '\\');
- name->insert(0, '\\');
- i = 2;
+ int i, j;
+ GooString *name = fileName->getString();
+ // "//...." --> "\...."
+ // "/x/...." --> "x:\...."
+ // "/server/share/...." --> "\\server\share\...."
+ // convert escaped slashes to slashes and unescaped slashes to backslashes
+ i = 0;
+ if (name->getChar(0) == '/') {
+ if (name->getLength() >= 2 && name->getChar(1) == '/') {
+ name->del(0);
+ i = 0;
+ } else if (name->getLength() >= 2 &&
+ ((name->getChar(1) >= 'a' && name->getChar(1) <= 'z') ||
+ (name->getChar(1) >= 'A' && name->getChar(1) <= 'Z')) &&
+ (name->getLength() == 2 || name->getChar(2) == '/')) {
+ name->setChar(0, name->getChar(1));
+ name->setChar(1, ':');
+ i = 2;
+ } else {
+ for (j = 2; j < name->getLength(); ++j) {
+ if (name->getChar(j-1) != '\\' &&
+ name->getChar(j) == '/') {
+ break;
}
}
- }
- for (; i < name->getLength(); ++i) {
- if (name->getChar(i) == '/') {
- name->setChar(i, '\\');
- } else if (name->getChar(i) == '\\' &&
- i+1 < name->getLength() &&
- name->getChar(i+1) == '/') {
- name->del(i);
+ if (j < name->getLength()) {
+ name->setChar(0, '\\');
+ name->insert(0, '\\');
+ i = 2;
}
}
-#else
- // no manipulation needed for Unix
-#endif
- } else {
- return gFalse;
}
+ for (; i < name->getLength(); ++i) {
+ if (name->getChar(i) == '/') {
+ name->setChar(i, '\\');
+ } else if (name->getChar(i) == '\\' &&
+ i+1 < name->getLength() &&
+ name->getChar(i+1) == '/') {
+ name->del(i);
+ }
+ }
+#endif /* WIN32 */
- fileName->initString (name);
return gTrue;
}