summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pdf/pdf_interpret.c203
1 files changed, 108 insertions, 95 deletions
diff --git a/pdf/pdf_interpret.c b/pdf/pdf_interpret.c
index 870050df..050417e8 100644
--- a/pdf/pdf_interpret.c
+++ b/pdf/pdf_interpret.c
@@ -2393,7 +2393,7 @@ static void pdf_run_dquote(pdf_csi *csi)
#define B(a,b) (a | b << 8)
#define C(a,b,c) (a | b << 8 | c << 16)
-static void
+static int
pdf_run_keyword(pdf_csi *csi, pdf_obj *rdb, fz_stream *file, char *buf)
{
fz_context *ctx = csi->dev->ctx;
@@ -2525,22 +2525,28 @@ pdf_run_keyword(pdf_csi *csi, pdf_obj *rdb, fz_stream *file, char *buf)
case A('y'): pdf_run_y(csi); break;
default:
if (!csi->xbalance)
- fz_throw(ctx, "unknown keyword: '%s'", buf);
+ {
+ fz_warn(ctx, "unknown keyword: '%s'", buf);
+ return 1;
+ }
break;
}
+ return 0;
}
static void
pdf_run_stream(pdf_csi *csi, pdf_obj *rdb, fz_stream *file, pdf_lexbuf *buf)
{
fz_context *ctx = csi->dev->ctx;
- int tok, in_array;
+ int tok = PDF_TOK_ERROR;
+ int in_array;
/* make sure we have a clean slate if we come here from flush_text */
pdf_clear_stack(csi);
in_array = 0;
fz_var(in_array);
+ fz_var(tok);
if (csi->cookie)
{
@@ -2550,117 +2556,124 @@ pdf_run_stream(pdf_csi *csi, pdf_obj *rdb, fz_stream *file, pdf_lexbuf *buf)
do
{
- if (csi->top == nelem(csi->stack) - 1)
- fz_throw(ctx, "stack overflow");
-
- /* Check the cookie */
- if (csi->cookie)
- {
- if (csi->cookie->abort)
- {
- tok = PDF_TOK_EOF;
- break;
- }
- csi->cookie->progress++;
- }
-
fz_try(ctx)
{
- tok = pdf_lex(file, buf);
- /* RJW: "lexical error in content stream" */
-
- if (in_array)
+ do
{
- if (tok == PDF_TOK_CLOSE_ARRAY)
- {
- in_array = 0;
- }
- else if (tok == PDF_TOK_REAL)
- {
- pdf_gstate *gstate = csi->gstate + csi->gtop;
- pdf_show_space(csi, -buf->f * gstate->size * 0.001f);
- }
- else if (tok == PDF_TOK_INT)
- {
- pdf_gstate *gstate = csi->gstate + csi->gtop;
- pdf_show_space(csi, -buf->i * gstate->size * 0.001f);
- }
- else if (tok == PDF_TOK_STRING)
+ if (csi->top == nelem(csi->stack) - 1)
+ fz_throw(ctx, "stack overflow");
+
+ /* Check the cookie */
+ if (csi->cookie)
{
- pdf_show_string(csi, (unsigned char *)buf->scratch, buf->len);
+ if (csi->cookie->abort)
+ {
+ tok = PDF_TOK_EOF;
+ break;
+ }
+ csi->cookie->progress++;
}
- else if (tok == PDF_TOK_KEYWORD)
+
+ tok = pdf_lex(file, buf);
+ /* RJW: "lexical error in content stream" */
+
+ if (in_array)
{
- if (!strcmp(buf->scratch, "Tw") || !strcmp(buf->scratch, "Tc"))
- fz_warn(ctx, "ignoring keyword '%s' inside array", buf->scratch);
+ if (tok == PDF_TOK_CLOSE_ARRAY)
+ {
+ in_array = 0;
+ }
+ else if (tok == PDF_TOK_REAL)
+ {
+ pdf_gstate *gstate = csi->gstate + csi->gtop;
+ pdf_show_space(csi, -buf->f * gstate->size * 0.001f);
+ }
+ else if (tok == PDF_TOK_INT)
+ {
+ pdf_gstate *gstate = csi->gstate + csi->gtop;
+ pdf_show_space(csi, -buf->i * gstate->size * 0.001f);
+ }
+ else if (tok == PDF_TOK_STRING)
+ {
+ pdf_show_string(csi, (unsigned char *)buf->scratch, buf->len);
+ }
+ else if (tok == PDF_TOK_KEYWORD)
+ {
+ if (!strcmp(buf->scratch, "Tw") || !strcmp(buf->scratch, "Tc"))
+ fz_warn(ctx, "ignoring keyword '%s' inside array", buf->scratch);
+ else
+ fz_throw(ctx, "syntax error in array");
+ }
+ else if (tok == PDF_TOK_EOF)
+ break;
else
fz_throw(ctx, "syntax error in array");
}
- else if (tok == PDF_TOK_EOF)
- break;
- else
- fz_throw(ctx, "syntax error in array");
- }
-
- else switch (tok)
- {
- case PDF_TOK_ENDSTREAM:
- case PDF_TOK_EOF:
- tok = PDF_TOK_EOF;
- break;
- case PDF_TOK_OPEN_ARRAY:
- if (!csi->in_text)
+ else switch (tok)
{
- csi->obj = pdf_parse_array(csi->xref, file, buf);
- /* RJW: "cannot parse array" */
- }
- else
- {
- in_array = 1;
- }
- break;
+ case PDF_TOK_ENDSTREAM:
+ case PDF_TOK_EOF:
+ tok = PDF_TOK_EOF;
+ break;
- case PDF_TOK_OPEN_DICT:
- csi->obj = pdf_parse_dict(csi->xref, file, buf);
- /* RJW: "cannot parse dictionary" */
- break;
+ case PDF_TOK_OPEN_ARRAY:
+ if (!csi->in_text)
+ {
+ csi->obj = pdf_parse_array(csi->xref, file, buf);
+ /* RJW: "cannot parse array" */
+ }
+ else
+ {
+ in_array = 1;
+ }
+ break;
- case PDF_TOK_NAME:
- fz_strlcpy(csi->name, buf->scratch, sizeof(csi->name));
- break;
+ case PDF_TOK_OPEN_DICT:
+ csi->obj = pdf_parse_dict(csi->xref, file, buf);
+ /* RJW: "cannot parse dictionary" */
+ break;
- case PDF_TOK_INT:
- csi->stack[csi->top] = buf->i;
- csi->top ++;
- break;
+ case PDF_TOK_NAME:
+ fz_strlcpy(csi->name, buf->scratch, sizeof(csi->name));
+ break;
- case PDF_TOK_REAL:
- csi->stack[csi->top] = buf->f;
- csi->top ++;
- break;
+ case PDF_TOK_INT:
+ csi->stack[csi->top] = buf->i;
+ csi->top ++;
+ break;
- case PDF_TOK_STRING:
- if (buf->len <= sizeof(csi->string))
- {
- memcpy(csi->string, buf->scratch, buf->len);
- csi->string_len = buf->len;
- }
- else
- {
- csi->obj = pdf_new_string(ctx, buf->scratch, buf->len);
- }
- break;
+ case PDF_TOK_REAL:
+ csi->stack[csi->top] = buf->f;
+ csi->top ++;
+ break;
- case PDF_TOK_KEYWORD:
- pdf_run_keyword(csi, rdb, file, buf->scratch);
- /* RJW: "cannot run keyword" */
- pdf_clear_stack(csi);
- break;
+ case PDF_TOK_STRING:
+ if (buf->len <= sizeof(csi->string))
+ {
+ memcpy(csi->string, buf->scratch, buf->len);
+ csi->string_len = buf->len;
+ }
+ else
+ {
+ csi->obj = pdf_new_string(ctx, buf->scratch, buf->len);
+ }
+ break;
- default:
- fz_throw(ctx, "syntax error in content stream");
+ case PDF_TOK_KEYWORD:
+ if (pdf_run_keyword(csi, rdb, file, buf->scratch))
+ {
+ tok = PDF_TOK_EOF;
+ }
+ /* RJW: "cannot run keyword" */
+ pdf_clear_stack(csi);
+ break;
+
+ default:
+ fz_throw(ctx, "syntax error in content stream");
+ }
}
+ while (tok != PDF_TOK_EOF);
}
fz_catch(ctx)
{