summaryrefslogtreecommitdiff
path: root/src/PostscriptDSC.cxx
diff options
context:
space:
mode:
authorJohannes Hofmann <Johannes.Hofmann@gmx.de>2006-02-10 17:16:24 +0100
committerJohannes Hofmann <Johannes.Hofmann@gmx.de>2006-02-10 17:16:24 +0100
commit34eacf87403f8a3382beab0271a28764b030c333 (patch)
treefd11ce442eb246ad01b0c59b3698f909c68f8510 /src/PostscriptDSC.cxx
parent676eec5dc5331a0d006bb32d8b8c946bda8069c1 (diff)
make PostscriptDSC stuff more robust
Diffstat (limited to 'src/PostscriptDSC.cxx')
-rw-r--r--src/PostscriptDSC.cxx59
1 files changed, 42 insertions, 17 deletions
diff --git a/src/PostscriptDSC.cxx b/src/PostscriptDSC.cxx
index 40b39c9..dfc9775 100644
--- a/src/PostscriptDSC.cxx
+++ b/src/PostscriptDSC.cxx
@@ -36,6 +36,12 @@ PostscriptDSC::PostscriptDSC() {
}
PostscriptDSC::~PostscriptDSC() {
+ if (page_off) {
+ free(page_off);
+ }
+ if (page_len) {
+ free(page_len);
+ }
}
int
@@ -52,8 +58,15 @@ PostscriptDSC::parse(int fd) {
bb_h = 841; //
setup_len = 0;
pages = 0;
- page_off = NULL;
- page_len = NULL;
+
+ if (page_off) {
+ free(page_off);
+ page_off = NULL;
+ }
+ if(page_len) {
+ free(page_len);
+ page_len = NULL;
+ }
fp = fdopen(fd, "r");
if (!fp) {
@@ -72,38 +85,50 @@ PostscriptDSC::parse(int fd) {
} else if (sscanf(linebuf, "%%%%Pages: %d", &ps) == 1) {
if (pages != 0) {
fprintf(stderr, "Multiple Pages tags found\n");
- free(page_off);
- free(page_len);
return 1;
}
pages = ps;
- page_off = (size_t*) malloc(sizeof(size_t) * (pages + 1));
- memset(page_off, 0, sizeof(size_t) * (pages + 1));
- page_len = (size_t*) malloc(sizeof(size_t) * (pages + 1));
- memset(page_len, 0, sizeof(size_t) * (pages + 1));
+ page_off = (size_t*) malloc(sizeof(size_t) * pages);
+ memset(page_off, 0, sizeof(size_t) * pages);
+ page_len = (size_t*) malloc(sizeof(size_t) * pages);
+ memset(page_len, 0, sizeof(size_t) * pages);
+
} else if (sscanf(linebuf, "%%%%Page: %d %d", &p1, &p2) == 2) {
+
+ if (!page_off || !page_len) {
+ fprintf(stderr, "Number of pages not defined\n");
+ return 1;
+ }
+
if (p1 > pages || p1 < 1) {
- fprintf(stderr, "Page %d out of range (0 - %d)\n", p1, pages);
+ fprintf(stderr, "Page %d out of range (1 - %d)\n", p1, pages);
return 1;
}
- if (page_off[p1] != NULL) {
+ if (page_off[p1 - 1] != 0) {
fprintf(stderr, "Page %d already defined\n", p1);
return 1;
}
- if (p1 > 1 && page_off[p1 - 1] == NULL) {
+ if (p1 > 1 && page_off[p1 - 2] == NULL) {
fprintf(stderr, "Page %d not yet defined\n", p1 - 1);
return 1;
}
- page_off[p1] = ftello(fp);
+ page_off[p1 - 1] = ftello(fp);
if (p1 > 1) {
- page_len[p1 - 1] = page_off[p1] - page_off[p1 - 1];
+ page_len[p1 - 2] = page_off[p1 - 1] - page_off[p1 - 2];
}
}
}
- page_len[p1] = ftello(fp) - page_off[p1];
+ page_len[p1 - 1] = ftello(fp) - page_off[p1 - 1];
+
+ for (int i=0; i<pages; i++) {
+ if (page_off[i] == 0 || page_len[i] == 0) {
+ fprintf(stderr, "Page %d not defined\n", i);
+ return 1;
+ }
+ }
return 0;
}
@@ -128,12 +153,12 @@ PostscriptDSC::get_setup_len() {
size_t
PostscriptDSC::get_page_off(int p) {
- return page_off[p+1];
+ return page_off[p];
}
size_t
PostscriptDSC::get_page_len(int p) {
- return page_len[p+1];
+ return page_len[p];
}
void
@@ -142,7 +167,7 @@ PostscriptDSC::print() {
printf("x %d, y %d, w %d, h %d\n", bb_x, bb_y, bb_w, bb_h);
printf("setup_len %d\n", setup_len);
- for (i=1; i<=pages; i++) {
+ for (i=0; i<pages; i++) {
printf("p %d, off %d, len %d\n", i, page_off[i], page_len[i]);
}
}