utils/pdfseparate.cc | 60 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 44 insertions(+), 16 deletions(-)
New commits: commit 9f09b9596f1fc52481914019d68c8f9b85b5c438 Merge: bd893d4 61f79b8 Author: Albert Astals Cid <[email protected]> Date: Thu Oct 24 01:03:02 2013 +0200 Merge remote-tracking branch 'origin/poppler-0.24' diff --cc utils/pdfseparate.cc index 2844dc5,6424d20..924e5c7 --- a/utils/pdfseparate.cc +++ b/utils/pdfseparate.cc @@@ -55,6 -55,6 +56,12 @@@ bool extractPages (const char *srcFileN return false; } ++ // destFileName can have multiple %% and one %d ++ // We use auxDestFileName to replace all the valid % appearances ++ // by 'A' (random char that is not %), if at the end of replacing ++ // any of the valid appearances there is still any % around, the ++ // pattern is wrong ++ char *auxDestFileName = strdup(destFileName); if (firstPage == 0 && lastPage == 0) { firstPage = 1; lastPage = doc->getNumPages(); @@@ -63,25 -63,38 +70,46 @@@ lastPage = doc->getNumPages(); if (firstPage == 0) firstPage = 1; - if (firstPage != lastPage) { - bool foundmatch = false; - if (strstr(destFileName, "%d") != NULL) { - foundmatch = true; - } else { - char pattern[5]; - for (int i = 2; i < 10; i++) { - sprintf(pattern, "%%0%dd", i); - if (strstr(destFileName, pattern) != NULL) { - foundmatch = true; - break; - } - if (firstPage != lastPage && strstr(destFileName, "%d") == NULL) { - error(errSyntaxError, -1, "'{0:s}' must contain '%d' if more than one page should be extracted", destFileName); ++ bool foundmatch = false; ++ char *p = strstr(auxDestFileName, "%d"); ++ if (p != NULL) { ++ foundmatch = true; ++ *p = 'A'; ++ } else { ++ char pattern[5]; ++ for (int i = 2; i < 10; i++) { ++ sprintf(pattern, "%%0%dd", i); ++ p = strstr(auxDestFileName, pattern); ++ if (p != NULL) { ++ foundmatch = true; ++ *p = 'A'; ++ break; + } + } - if (!foundmatch) { - error(errSyntaxError, -1, "'{0:s}' must contain '%%d' if more than one page should be extracted", destFileName); - return false; - } + } ++ if (!foundmatch && firstPage != lastPage) { ++ error(errSyntaxError, -1, "'{0:s}' must contain '%%d' if more than one page should be extracted", destFileName); ++ free(auxDestFileName); + return false; + } - - // destFileName can have multiple %% and one %d - // We use auxDestFileName to replace all the valid % appearances - // by 'A' (random char that is not %), if at the end of replacing - // any of the valid appearances there is still any % around, the - // pattern is wrong - char *auxDestFileName = strdup(destFileName); - // %% can appear as many times as you want - char *p = strstr(auxDestFileName, "%%"); ++ ++ // at this point auxDestFileName can only contain %% ++ p = strstr(auxDestFileName, "%%"); + while (p != NULL) { + *p = 'A'; + *(p + 1) = 'A'; + p = strstr(p, "%%"); + } - // %d can appear only one time - p = strstr(auxDestFileName, "%d"); - if (p != NULL) { - *p = 'A'; - } ++ + // at this point any other % is wrong + p = strstr(auxDestFileName, "%"); + if (p != NULL) { + error(errSyntaxError, -1, "'{0:s}' can only contain one '%d' pattern", destFileName); + free(auxDestFileName); + return false; + } + free(auxDestFileName); + for (int pageNo = firstPage; pageNo <= lastPage; pageNo++) { snprintf (pathName, sizeof (pathName) - 1, destFileName, pageNo); GooString *gpageName = new GooString (pathName); commit 61f79b8447c3ac8ab5a26e79e0c28053ffdccf75 Author: Albert Astals Cid <[email protected]> Date: Thu Oct 24 00:54:56 2013 +0200 Allow only one %d in the filename Fixes crashes if you had %s and similar in the filename Inspired from patch by Pedro Ribeiro <[email protected]> Bug #69434 diff --git a/utils/pdfseparate.cc b/utils/pdfseparate.cc index 1d4901b..6424d20 100644 --- a/utils/pdfseparate.cc +++ b/utils/pdfseparate.cc @@ -20,6 +20,7 @@ #include "PDFDoc.h" #include "ErrorCodes.h" #include "GlobalParams.h" +#include <ctype.h> static int firstPage = 0; static int lastPage = 0; @@ -63,9 +64,37 @@ bool extractPages (const char *srcFileName, const char *destFileName) { if (firstPage == 0) firstPage = 1; if (firstPage != lastPage && strstr(destFileName, "%d") == NULL) { - error(errSyntaxError, -1, "'{0:s}' must contain '%%d' if more than one page should be extracted", destFileName); + error(errSyntaxError, -1, "'{0:s}' must contain '%d' if more than one page should be extracted", destFileName); return false; } + + // destFileName can have multiple %% and one %d + // We use auxDestFileName to replace all the valid % appearances + // by 'A' (random char that is not %), if at the end of replacing + // any of the valid appearances there is still any % around, the + // pattern is wrong + char *auxDestFileName = strdup(destFileName); + // %% can appear as many times as you want + char *p = strstr(auxDestFileName, "%%"); + while (p != NULL) { + *p = 'A'; + *(p + 1) = 'A'; + p = strstr(p, "%%"); + } + // %d can appear only one time + p = strstr(auxDestFileName, "%d"); + if (p != NULL) { + *p = 'A'; + } + // at this point any other % is wrong + p = strstr(auxDestFileName, "%"); + if (p != NULL) { + error(errSyntaxError, -1, "'{0:s}' can only contain one '%d' pattern", destFileName); + free(auxDestFileName); + return false; + } + free(auxDestFileName); + for (int pageNo = firstPage; pageNo <= lastPage; pageNo++) { snprintf (pathName, sizeof (pathName) - 1, destFileName, pageNo); GooString *gpageName = new GooString (pathName); _______________________________________________ poppler mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/poppler
