summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2018-06-19 13:15:31 +0200
committerRobin Watts <robin.watts@artifex.com>2018-06-22 16:48:50 +0100
commitf7ace61076d0ab3c71e1d2bd70967ddb0b86f220 (patch)
tree8bd8b4fe4d7414685d162f66911e9951ea3dce16
parent148b0934370336fc8b260e8c3aef83daf4d80ba4 (diff)
downloadmupdf-f7ace61076d0ab3c71e1d2bd70967ddb0b86f220.tar.xz
Keep copy of decoded utf8 text string in pdf_obj.
Removes the need to alloc/free text strings in the API, allowing for simple functions like pdf_dict_get_text_string.
-rw-r--r--include/mupdf/pdf/annot.h8
-rw-r--r--include/mupdf/pdf/object.h11
-rw-r--r--include/mupdf/pdf/widget.h6
-rw-r--r--platform/gl/gl-annotate.c12
-rw-r--r--platform/java/mupdf_native.c5
-rw-r--r--platform/x11/jstest_main.c2
-rw-r--r--platform/x11/pdfapp.c9
-rw-r--r--platform/x11/pdfapp.h2
-rw-r--r--platform/x11/win_main.c2
-rw-r--r--platform/x11/x11_main.c2
-rw-r--r--source/pdf/pdf-annot.c12
-rw-r--r--source/pdf/pdf-appearance.c11
-rw-r--r--source/pdf/pdf-form.c21
-rw-r--r--source/pdf/pdf-link.c2
-rw-r--r--source/pdf/pdf-nametree.c10
-rw-r--r--source/pdf/pdf-object.c53
-rw-r--r--source/pdf/pdf-outline.c2
-rw-r--r--source/pdf/pdf-parse.c36
-rw-r--r--source/pdf/pdf-xref.c5
-rw-r--r--source/tools/murun.c40
20 files changed, 129 insertions, 122 deletions
diff --git a/include/mupdf/pdf/annot.h b/include/mupdf/pdf/annot.h
index e9b91da9..d616436c 100644
--- a/include/mupdf/pdf/annot.h
+++ b/include/mupdf/pdf/annot.h
@@ -220,9 +220,9 @@ void pdf_set_annot_vertex(fz_context *ctx, pdf_annot *annot, int i, fz_point p);
void pdf_set_text_annot_position(fz_context *ctx, pdf_annot *annot, fz_point pt);
/*
- pdf_copy_annot_contents: return a copy of the contents of an annotation.
+ pdf_get_annot_contents: return the contents of an annotation.
*/
-char *pdf_copy_annot_contents(fz_context *ctx, pdf_annot *annot);
+const char *pdf_get_annot_contents(fz_context *ctx, pdf_annot *annot);
/*
pdf_set_annot_contents: set the contents of an annotation.
@@ -230,9 +230,9 @@ char *pdf_copy_annot_contents(fz_context *ctx, pdf_annot *annot);
void pdf_set_annot_contents(fz_context *ctx, pdf_annot *annot, const char *text);
/*
- pdf_copy_annot_author: return a copy of the author of an annotation.
+ pdf_get_annot_author: return the author of an annotation.
*/
-char *pdf_copy_annot_author(fz_context *ctx, pdf_annot *annot);
+const char *pdf_get_annot_author(fz_context *ctx, pdf_annot *annot);
/*
pdf_set_annot_author: set the author of an annotation.
diff --git a/include/mupdf/pdf/object.h b/include/mupdf/pdf/object.h
index 4bb368ea..71a8d9d8 100644
--- a/include/mupdf/pdf/object.h
+++ b/include/mupdf/pdf/object.h
@@ -79,6 +79,8 @@ int pdf_to_int(fz_context *ctx, pdf_obj *obj);
int64_t pdf_to_int64(fz_context *ctx, pdf_obj *obj);
float pdf_to_real(fz_context *ctx, pdf_obj *obj);
const char *pdf_to_name(fz_context *ctx, pdf_obj *obj);
+const char *pdf_to_text_string(fz_context *ctx, pdf_obj *obj);
+const char *pdf_to_string(fz_context *ctx, pdf_obj *obj, size_t *sizep);
char *pdf_to_str_buf(fz_context *ctx, pdf_obj *obj);
int pdf_to_str_len(fz_context *ctx, pdf_obj *obj);
int pdf_to_num(fz_context *ctx, pdf_obj *obj);
@@ -135,6 +137,7 @@ int pdf_dict_get_int(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
float pdf_dict_get_real(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
const char *pdf_dict_get_name(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
const char *pdf_dict_get_string(fz_context *ctx, pdf_obj *dict, pdf_obj *key, size_t *sizep);
+const char *pdf_dict_get_text_string(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
void pdf_array_push_bool(fz_context *ctx, pdf_obj *array, int x);
void pdf_array_push_int(fz_context *ctx, pdf_obj *array, int64_t x);
@@ -148,6 +151,8 @@ pdf_obj *pdf_array_push_dict(fz_context *ctx, pdf_obj *array, int initial);
int pdf_array_get_bool(fz_context *ctx, pdf_obj *array, int index);
int pdf_array_get_int(fz_context *ctx, pdf_obj *array, int index);
float pdf_array_get_real(fz_context *ctx, pdf_obj *array, int index);
+const char *pdf_array_get_string(fz_context *ctx, pdf_obj *array, int index, size_t *sizep);
+const char *pdf_array_get_text_string(fz_context *ctx, pdf_obj *array, int index);
/*
Recurse through the object structure setting the node's parent_num to num.
@@ -168,10 +173,10 @@ int pdf_print_encrypted_obj(fz_context *ctx, fz_output *out, pdf_obj *obj, int t
void pdf_debug_obj(fz_context *ctx, pdf_obj *obj);
-char *pdf_to_utf8(fz_context *ctx, pdf_obj *src);
-char *pdf_load_stream_as_utf8(fz_context *ctx, pdf_obj *src);
+char *pdf_new_utf8_from_pdf_string(fz_context *ctx, const char *srcptr, size_t srclen);
+char *pdf_new_utf8_from_pdf_string_obj(fz_context *ctx, pdf_obj *src);
+char *pdf_new_utf8_from_pdf_stream_obj(fz_context *ctx, pdf_obj *src);
char *pdf_load_stream_or_string_as_utf8(fz_context *ctx, pdf_obj *src);
-pdf_obj *pdf_to_utf8_name(fz_context *ctx, pdf_obj *src);
fz_rect *pdf_to_rect(fz_context *ctx, pdf_obj *array, fz_rect *rect);
fz_matrix *pdf_to_matrix(fz_context *ctx, pdf_obj *array, fz_matrix *mat);
diff --git a/include/mupdf/pdf/widget.h b/include/mupdf/pdf/widget.h
index 5f2c38af..04c9f887 100644
--- a/include/mupdf/pdf/widget.h
+++ b/include/mupdf/pdf/widget.h
@@ -100,7 +100,7 @@ int pdf_text_widget_set_text(fz_context *ctx, pdf_document *doc, pdf_widget *tw,
is true, then the export values will be returned and not the list
values if there are export values present.
*/
-int pdf_choice_widget_options(fz_context *ctx, pdf_document *doc, pdf_widget *tw, int exportval, char *opts[]);
+int pdf_choice_widget_options(fz_context *ctx, pdf_document *doc, pdf_widget *tw, int exportval, const char *opts[]);
/*
pdf_choice_widget_is_multiselect: returns whether a list box or
@@ -115,13 +115,13 @@ int pdf_choice_widget_is_multiselect(fz_context *ctx, pdf_document *doc, pdf_wid
with NULL as the array to find out how big the array need to
be. The filled in elements should not be freed by the caller.
*/
-int pdf_choice_widget_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw, char *opts[]);
+int pdf_choice_widget_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw, const char *opts[]);
/*
pdf_widget_set_value: set the value of a choice widget. The
caller should pass the number of options selected and an
array of their names
*/
-void pdf_choice_widget_set_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw, int n, char *opts[]);
+void pdf_choice_widget_set_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw, int n, const char *opts[]);
#endif
diff --git a/platform/gl/gl-annotate.c b/platform/gl/gl-annotate.c
index 304f0f10..9d88dabc 100644
--- a/platform/gl/gl-annotate.c
+++ b/platform/gl/gl-annotate.c
@@ -314,10 +314,9 @@ static void do_annotate_author(void)
{
if (pdf_annot_has_author(ctx, selected_annot))
{
- char *author = pdf_copy_annot_author(ctx, selected_annot);
- if (author && strlen(author) > 0)
+ const char *author = pdf_get_annot_author(ctx, selected_annot);
+ if (strlen(author) > 0)
ui_label("Author: %s", author);
- fz_free(ctx, author);
}
}
@@ -344,14 +343,13 @@ static void do_annotate_contents(void)
{
static pdf_annot *last_annot = NULL;
static struct input input;
- char *contents;
+ const char *contents;
if (selected_annot != last_annot)
{
last_annot = selected_annot;
- contents = pdf_copy_annot_contents(ctx, selected_annot);
+ contents = pdf_get_annot_contents(ctx, selected_annot);
ui_input_init(&input, contents);
- fz_free(ctx, contents);
}
ui_label("Contents:");
@@ -387,7 +385,7 @@ static void do_widget_value()
}
else if (type == PDF_WIDGET_TYPE_COMBOBOX || type == PDF_WIDGET_TYPE_LISTBOX)
{
- char **options;
+ const char **options;
int n, choice;
ui_label("Value:");
n = pdf_choice_widget_options(ctx, selected_annot->page->doc, selected_annot, 0, NULL);
diff --git a/platform/java/mupdf_native.c b/platform/java/mupdf_native.c
index 74ba2d11..8e9e9f3f 100644
--- a/platform/java/mupdf_native.c
+++ b/platform/java/mupdf_native.c
@@ -8800,7 +8800,7 @@ FUN(PDFAnnotation_getContents)(JNIEnv *env, jobject self)
if (!ctx || !annot) return NULL;
fz_try(ctx)
- contents = pdf_copy_annot_contents(ctx, annot);
+ contents = pdf_get_annot_contents(ctx, annot);
fz_catch(ctx)
{
jni_rethrow(env, ctx);
@@ -8808,7 +8808,6 @@ FUN(PDFAnnotation_getContents)(JNIEnv *env, jobject self)
}
result = (*env)->NewStringUTF(env, contents);
- fz_free(ctx, contents);
return result;
}
@@ -8846,7 +8845,7 @@ FUN(PDFAnnotation_getAuthor)(JNIEnv *env, jobject self)
if (!ctx || !annot) return NULL;
fz_try(ctx)
- author = pdf_copy_annot_author(ctx, annot);
+ author = pdf_get_annot_author(ctx, annot);
fz_catch(ctx)
{
jni_rethrow(env, ctx);
diff --git a/platform/x11/jstest_main.c b/platform/x11/jstest_main.c
index 14577bd2..0c729b86 100644
--- a/platform/x11/jstest_main.c
+++ b/platform/x11/jstest_main.c
@@ -81,7 +81,7 @@ char *wintextinput(pdfapp_t *app, char *inittext, int retry)
return inittext;
}
-int winchoiceinput(pdfapp_t *app, int nopts, char *opts[], int *nvals, char *vals[])
+int winchoiceinput(pdfapp_t *app, int nopts, const char *opts[], int *nvals, const char *vals[])
{
return 0;
}
diff --git a/platform/x11/pdfapp.c b/platform/x11/pdfapp.c
index f011b5b0..1c5ae45d 100644
--- a/platform/x11/pdfapp.c
+++ b/platform/x11/pdfapp.c
@@ -1680,8 +1680,8 @@ void pdfapp_onmouse(pdfapp_t *app, int x, int y, int btn, int modifiers, int sta
{
int nopts;
int nvals;
- char **opts = NULL;
- char **vals = NULL;
+ const char **opts = NULL;
+ const char **vals = NULL;
fz_var(opts);
fz_var(vals);
@@ -1706,12 +1706,7 @@ void pdfapp_onmouse(pdfapp_t *app, int x, int y, int btn, int modifiers, int sta
}
fz_always(ctx)
{
- int i;
- for (i=0; i < nopts; ++i)
- fz_free(ctx, opts[i]);
fz_free(ctx, opts);
- for (i=0; i < nvals; ++i)
- fz_free(ctx, vals[i]);
fz_free(ctx, vals);
}
fz_catch(ctx)
diff --git a/platform/x11/pdfapp.h b/platform/x11/pdfapp.h
index 09d8f16a..b6c2127c 100644
--- a/platform/x11/pdfapp.h
+++ b/platform/x11/pdfapp.h
@@ -30,7 +30,7 @@ extern void winrepaint(pdfapp_t*);
extern void winrepaintsearch(pdfapp_t*);
extern char *winpassword(pdfapp_t*, char *filename);
extern char *wintextinput(pdfapp_t*, char *inittext, int retry);
-extern int winchoiceinput(pdfapp_t*, int nopts, char *opts[], int *nvals, char *vals[]);
+extern int winchoiceinput(pdfapp_t*, int nopts, const char *opts[], int *nvals, const char *vals[]);
extern void winopenuri(pdfapp_t*, char *s);
extern void wincursor(pdfapp_t*, int curs);
extern void windocopy(pdfapp_t*);
diff --git a/platform/x11/win_main.c b/platform/x11/win_main.c
index 877f8c73..dd406c42 100644
--- a/platform/x11/win_main.c
+++ b/platform/x11/win_main.c
@@ -450,7 +450,7 @@ char *wintextinput(pdfapp_t *app, char *inittext, int retry)
return NULL;
}
-int winchoiceinput(pdfapp_t *app, int nopts, char *opts[], int *nvals, char *vals[])
+int winchoiceinput(pdfapp_t *app, int nopts, const char *opts[], int *nvals, const char *vals[])
{
int code;
cd_nopts = nopts;
diff --git a/platform/x11/x11_main.c b/platform/x11/x11_main.c
index edbb9fa8..7e5942bf 100644
--- a/platform/x11/x11_main.c
+++ b/platform/x11/x11_main.c
@@ -184,7 +184,7 @@ char *wintextinput(pdfapp_t *app, char *inittext, int retry)
return NULL;
}
-int winchoiceinput(pdfapp_t *app, int nopts, char *opts[], int *nvals, char *vals[])
+int winchoiceinput(pdfapp_t *app, int nopts, const char *opts[], int *nvals, const char *vals[])
{
/* FIXME: temporary dummy implementation */
return 0;
diff --git a/source/pdf/pdf-annot.c b/source/pdf/pdf-annot.c
index ed6856de..ba92b7ef 100644
--- a/source/pdf/pdf-annot.c
+++ b/source/pdf/pdf-annot.c
@@ -392,10 +392,10 @@ pdf_set_annot_rect(fz_context *ctx, pdf_annot *annot, const fz_rect *rect)
pdf_dirty_annot(ctx, annot);
}
-char *
-pdf_copy_annot_contents(fz_context *ctx, pdf_annot *annot)
+const char *
+pdf_get_annot_contents(fz_context *ctx, pdf_annot *annot)
{
- return pdf_to_utf8(ctx, pdf_dict_get(ctx, annot->obj, PDF_NAME(Contents)));
+ return pdf_dict_get_text_string(ctx, annot->obj, PDF_NAME(Contents));
}
void
@@ -1397,11 +1397,11 @@ pdf_annot_has_author(fz_context *ctx, pdf_annot *annot)
return is_allowed_subtype(ctx, annot, PDF_NAME(T), markup_subtypes);
}
-char *
-pdf_copy_annot_author(fz_context *ctx, pdf_annot *annot)
+const char *
+pdf_get_annot_author(fz_context *ctx, pdf_annot *annot)
{
check_allowed_subtypes(ctx, annot, PDF_NAME(T), markup_subtypes);
- return pdf_to_utf8(ctx, pdf_dict_get(ctx, annot->obj, PDF_NAME(T)));
+ return pdf_dict_get_text_string(ctx, annot->obj, PDF_NAME(T));
}
void
diff --git a/source/pdf/pdf-appearance.c b/source/pdf/pdf-appearance.c
index c3e94baa..9753be92 100644
--- a/source/pdf/pdf-appearance.c
+++ b/source/pdf/pdf-appearance.c
@@ -906,11 +906,12 @@ pdf_write_free_text_appearance(fz_context *ctx, pdf_annot *annot, fz_buffer *buf
{
const char *font;
float size, color[3];
- char *text;
+ const char *text;
float w, h, t, b;
int q, r;
/* /Rotate is an undocumented annotation property supported by Adobe */
+ text = pdf_get_annot_contents(ctx, annot);
r = pdf_dict_get_int(ctx, annot->obj, PDF_NAME(Rotate));
q = pdf_annot_quadding(ctx, annot);
pdf_annot_default_appearance(ctx, annot, &font, &size, color);
@@ -933,13 +934,7 @@ pdf_write_free_text_appearance(fz_context *ctx, pdf_annot *annot, fz_buffer *buf
fz_append_printf(ctx, buf, "%g %g %g %g re\nS\n", b/2, b/2, w-b, h-b);
}
- text = pdf_copy_annot_contents(ctx, annot);
- fz_try(ctx)
- write_variable_text(ctx, annot, buf, res, text, font, size, color, q, w, h, b*2, 1);
- fz_always(ctx)
- fz_free(ctx, text);
- fz_catch(ctx)
- fz_rethrow(ctx);
+ write_variable_text(ctx, annot, buf, res, text, font, size, color, q, w, h, b*2, 1);
}
static void
diff --git a/source/pdf/pdf-form.c b/source/pdf/pdf-form.c
index 54cb1472..93b88e2c 100644
--- a/source/pdf/pdf-form.c
+++ b/source/pdf/pdf-form.c
@@ -1102,7 +1102,7 @@ int pdf_text_widget_set_text(fz_context *ctx, pdf_document *doc, pdf_widget *tw,
}
/* Get either the listed value or the export value. */
-int pdf_choice_widget_options(fz_context *ctx, pdf_document *doc, pdf_widget *tw, int exportval, char *opts[])
+int pdf_choice_widget_options(fz_context *ctx, pdf_document *doc, pdf_widget *tw, int exportval, const char *opts[])
{
pdf_annot *annot = (pdf_annot *)tw;
pdf_obj *optarr;
@@ -1122,11 +1122,11 @@ int pdf_choice_widget_options(fz_context *ctx, pdf_document *doc, pdf_widget *tw
/* If it is a two element array, the second item is the one that we want if we want the listing value. */
if (m == 2)
if (exportval)
- opts[i] = pdf_to_utf8(ctx, pdf_array_get(ctx, pdf_array_get(ctx, optarr, i), 0));
+ opts[i] = pdf_array_get_text_string(ctx, pdf_array_get(ctx, optarr, i), 0);
else
- opts[i] = pdf_to_utf8(ctx, pdf_array_get(ctx, pdf_array_get(ctx, optarr, i), 1));
+ opts[i] = pdf_array_get_text_string(ctx, pdf_array_get(ctx, optarr, i), 1);
else
- opts[i] = pdf_to_utf8(ctx, pdf_array_get(ctx, optarr, i));
+ opts[i] = pdf_array_get_text_string(ctx, optarr, i);
}
}
return n;
@@ -1148,7 +1148,7 @@ int pdf_choice_widget_is_multiselect(fz_context *ctx, pdf_document *doc, pdf_wid
}
}
-int pdf_choice_widget_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw, char *opts[])
+int pdf_choice_widget_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw, const char *opts[])
{
pdf_annot *annot = (pdf_annot *)tw;
pdf_obj *optarr;
@@ -1162,32 +1162,27 @@ int pdf_choice_widget_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw,
if (pdf_is_string(ctx, optarr))
{
if (opts)
- opts[0] = pdf_to_utf8(ctx, optarr);
-
+ opts[0] = pdf_to_text_string(ctx, optarr);
return 1;
}
else
{
n = pdf_array_len(ctx, optarr);
-
if (opts)
{
for (i = 0; i < n; i++)
{
pdf_obj *elem = pdf_array_get(ctx, optarr, i);
-
if (pdf_is_array(ctx, elem))
elem = pdf_array_get(ctx, elem, 1);
-
- opts[i] = pdf_to_utf8(ctx, elem);
+ opts[i] = pdf_to_text_string(ctx, elem);
}
}
-
return n;
}
}
-void pdf_choice_widget_set_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw, int n, char *opts[])
+void pdf_choice_widget_set_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw, int n, const char *opts[])
{
pdf_annot *annot = (pdf_annot *)tw;
pdf_obj *optarr = NULL, *opt;
diff --git a/source/pdf/pdf-link.c b/source/pdf/pdf-link.c
index 56c11973..e9f1c36f 100644
--- a/source/pdf/pdf-link.c
+++ b/source/pdf/pdf-link.c
@@ -134,7 +134,7 @@ pdf_parse_file_spec(fz_context *ctx, pdf_document *doc, pdf_obj *file_spec, pdf_
return NULL;
}
- path = pdf_to_utf8(ctx, filename);
+ path = fz_strdup(ctx, pdf_to_text_string(ctx, filename));
#ifdef _WIN32
if (!pdf_name_eq(ctx, pdf_dict_get(ctx, file_spec, PDF_NAME(FS)), PDF_NAME(URL)))
{
diff --git a/source/pdf/pdf-nametree.c b/source/pdf/pdf-nametree.c
index 30dd5974..4682024f 100644
--- a/source/pdf/pdf-nametree.c
+++ b/source/pdf/pdf-nametree.c
@@ -140,9 +140,13 @@ pdf_load_name_tree_imp(fz_context *ctx, pdf_obj *dict, pdf_document *doc, pdf_ob
pdf_obj *val = pdf_array_get(ctx, names, i + 1);
if (pdf_is_string(ctx, key))
{
- key = pdf_to_utf8_name(ctx, key);
- pdf_dict_put(ctx, dict, key, val);
- pdf_drop_obj(ctx, key);
+ key = pdf_new_name(ctx, pdf_to_text_string(ctx, key));
+ fz_try(ctx)
+ pdf_dict_put(ctx, dict, key, val);
+ fz_always(ctx)
+ pdf_drop_obj(ctx, key);
+ fz_catch(ctx)
+ fz_rethrow(ctx);
}
else if (pdf_is_name(ctx, key))
{
diff --git a/source/pdf/pdf-object.c b/source/pdf/pdf-object.c
index ec66376a..bc856644 100644
--- a/source/pdf/pdf-object.c
+++ b/source/pdf/pdf-object.c
@@ -59,6 +59,7 @@ typedef struct pdf_obj_num_s
typedef struct pdf_obj_string_s
{
pdf_obj super;
+ char *text; /* utf8 encoded text string */
unsigned int len;
char buf[1];
} pdf_obj_string;
@@ -141,6 +142,7 @@ pdf_new_string(fz_context *ctx, const char *str, size_t len)
obj->super.refs = 1;
obj->super.kind = PDF_STRING;
obj->super.flags = 0;
+ obj->text = NULL;
obj->len = l;
memcpy(obj->buf, str, len);
obj->buf[len] = '\0';
@@ -336,6 +338,32 @@ int pdf_to_str_len(fz_context *ctx, pdf_obj *obj)
return 0;
}
+const char *pdf_to_string(fz_context *ctx, pdf_obj *obj, size_t *sizep)
+{
+ RESOLVE(obj);
+ if (OBJ_IS_STRING(obj))
+ {
+ if (sizep)
+ *sizep = STRING(obj)->len;
+ return STRING(obj)->buf;
+ }
+ if (sizep)
+ *sizep = 0;
+ return "";
+}
+
+const char *pdf_to_text_string(fz_context *ctx, pdf_obj *obj)
+{
+ RESOLVE(obj);
+ if (OBJ_IS_STRING(obj))
+ {
+ if (!STRING(obj)->text)
+ STRING(obj)->text = pdf_new_utf8_from_pdf_string(ctx, STRING(obj)->buf, STRING(obj)->len);
+ return STRING(obj)->text;
+ }
+ return "";
+}
+
void pdf_set_int(fz_context *ctx, pdf_obj *obj, int64_t i)
{
if (OBJ_IS_INT(obj))
@@ -1669,6 +1697,11 @@ pdf_drop_obj(fz_context *ctx, pdf_obj *obj)
pdf_drop_array(ctx, obj);
else if (obj->kind == PDF_DICT)
pdf_drop_dict(ctx, obj);
+ else if (obj->kind == PDF_STRING)
+ {
+ fz_free(ctx, STRING(obj)->text);
+ fz_free(ctx, obj);
+ }
else
fz_free(ctx, obj);
}
@@ -2254,10 +2287,12 @@ const char *pdf_dict_get_name(fz_context *ctx, pdf_obj *dict, pdf_obj *key)
const char *pdf_dict_get_string(fz_context *ctx, pdf_obj *dict, pdf_obj *key, size_t *sizep)
{
- pdf_obj *val = pdf_dict_get(ctx, dict, key);
- if (sizep)
- *sizep = pdf_to_str_len(ctx, val);
- return pdf_to_str_buf(ctx, val);
+ return pdf_to_string(ctx, pdf_dict_get(ctx, dict, key), sizep);
+}
+
+const char *pdf_dict_get_text_string(fz_context *ctx, pdf_obj *dict, pdf_obj *key)
+{
+ return pdf_to_text_string(ctx, pdf_dict_get(ctx, dict, key));
}
int pdf_array_get_bool(fz_context *ctx, pdf_obj *array, int index)
@@ -2274,3 +2309,13 @@ float pdf_array_get_real(fz_context *ctx, pdf_obj *array, int index)
{
return pdf_to_real(ctx, pdf_array_get(ctx, array, index));
}
+
+const char *pdf_array_get_string(fz_context *ctx, pdf_obj *array, int index, size_t *sizep)
+{
+ return pdf_to_string(ctx, pdf_array_get(ctx, array, index), sizep);
+}
+
+const char *pdf_array_get_text_string(fz_context *ctx, pdf_obj *array, int index)
+{
+ return pdf_to_text_string(ctx, pdf_array_get(ctx, array, index));
+}
diff --git a/source/pdf/pdf-outline.c b/source/pdf/pdf-outline.c
index ea8ecbeb..b091cf4a 100644
--- a/source/pdf/pdf-outline.c
+++ b/source/pdf/pdf-outline.c
@@ -24,7 +24,7 @@ pdf_load_outline_imp(fz_context *ctx, pdf_document *doc, pdf_obj *dict)
obj = pdf_dict_get(ctx, dict, PDF_NAME(Title));
if (obj)
- node->title = pdf_to_utf8(ctx, obj);
+ node->title = fz_strdup(ctx, pdf_to_text_string(ctx, obj));
if ((obj = pdf_dict_get(ctx, dict, PDF_NAME(Dest))) != NULL)
node->uri = pdf_parse_link_dest(ctx, doc, obj);
diff --git a/source/pdf/pdf-parse.c b/source/pdf/pdf-parse.c
index f4075c5a..fb1cc595 100644
--- a/source/pdf/pdf-parse.c
+++ b/source/pdf/pdf-parse.c
@@ -80,9 +80,11 @@ skip_language_code_utf8(const unsigned char *s, size_t n, size_t i)
return 0;
}
+/* Convert Unicode/PdfDocEncoding string into utf-8 */
char *
-pdf_to_utf8_imp(fz_context *ctx, const unsigned char *srcptr, size_t srclen)
+pdf_new_utf8_from_pdf_string(fz_context *ctx, const char *ssrcptr, size_t srclen)
{
+ const unsigned char *srcptr = (const unsigned char*)ssrcptr;
char *dstptr, *dst;
size_t dstlen = 0;
int ucs;
@@ -168,30 +170,29 @@ pdf_to_utf8_imp(fz_context *ctx, const unsigned char *srcptr, size_t srclen)
return dst;
}
-/* Convert Unicode/PdfDocEncoding string into utf-8 */
+/* Convert text string object to UTF-8 */
char *
-pdf_to_utf8(fz_context *ctx, pdf_obj *src)
+pdf_new_utf8_from_pdf_string_obj(fz_context *ctx, pdf_obj *src)
{
- unsigned char *srcptr;
+ const char *srcptr;
size_t srclen;
- srcptr = (unsigned char *) pdf_to_str_buf(ctx, src);
- srclen = pdf_to_str_len(ctx, src);
- return pdf_to_utf8_imp(ctx, srcptr, srclen);
+ srcptr = pdf_to_string(ctx, src, &srclen);
+ return pdf_new_utf8_from_pdf_string(ctx, srcptr, srclen);
}
/* Load text stream and convert to UTF-8 */
char *
-pdf_load_stream_as_utf8(fz_context *ctx, pdf_obj *src)
+pdf_new_utf8_from_pdf_stream_obj(fz_context *ctx, pdf_obj *src)
{
fz_buffer *stmbuf;
- unsigned char *srcptr;
+ char *srcptr;
size_t srclen;
char *dst = NULL;
stmbuf = pdf_load_stream(ctx, src);
- srclen = fz_buffer_storage(ctx, stmbuf, &srcptr);
+ srclen = fz_buffer_storage(ctx, stmbuf, (unsigned char **)&srcptr);
fz_try(ctx)
- dst = pdf_to_utf8_imp(ctx, srcptr, srclen);
+ dst = pdf_new_utf8_from_pdf_string(ctx, srcptr, srclen);
fz_always(ctx)
fz_drop_buffer(ctx, stmbuf);
fz_catch(ctx)
@@ -204,17 +205,8 @@ char *
pdf_load_stream_or_string_as_utf8(fz_context *ctx, pdf_obj *src)
{
if (pdf_is_stream(ctx, src))
- return pdf_load_stream_as_utf8(ctx, src);
- return pdf_to_utf8(ctx, src);
-}
-
-pdf_obj *
-pdf_to_utf8_name(fz_context *ctx, pdf_obj *src)
-{
- char *buf = pdf_to_utf8(ctx, src);
- pdf_obj *dst = pdf_new_name(ctx, buf);
- fz_free(ctx, buf);
- return dst;
+ return pdf_new_utf8_from_pdf_stream_obj(ctx, src);
+ return pdf_new_utf8_from_pdf_string_obj(ctx, src);
}
static pdf_obj *
diff --git a/source/pdf/pdf-xref.c b/source/pdf/pdf-xref.c
index 9d32ea5e..d60eb089 100644
--- a/source/pdf/pdf-xref.c
+++ b/source/pdf/pdf-xref.c
@@ -2220,7 +2220,7 @@ pdf_lookup_metadata(fz_context *ctx, pdf_document *doc, const char *key, char *b
if (strstr(key, "info:") == key)
{
pdf_obj *info;
- char *s;
+ const char *s;
int n;
info = pdf_dict_get(ctx, pdf_trailer(ctx, doc), PDF_NAME(Info));
@@ -2231,9 +2231,8 @@ pdf_lookup_metadata(fz_context *ctx, pdf_document *doc, const char *key, char *b
if (!info)
return -1;
- s = pdf_to_utf8(ctx, info);
+ s = pdf_to_text_string(ctx, info);
n = (int)fz_strlcpy(buf, s, size);
- fz_free(ctx, s);
return n;
}
diff --git a/source/tools/murun.c b/source/tools/murun.c
index 3ed840fb..c74e4bbc 100644
--- a/source/tools/murun.c
+++ b/source/tools/murun.c
@@ -3837,19 +3837,14 @@ static void ffi_PDFObject_asString(js_State *J)
{
fz_context *ctx = js_getcontext(J);
pdf_obj *obj = js_touserdata(J, 0, "pdf_obj");
- char *string = NULL;
+ const char *string = NULL;
fz_try(ctx)
- string = pdf_to_utf8(ctx, obj);
+ string = pdf_to_text_string(ctx, obj);
fz_catch(ctx)
rethrow(J);
- if (js_try(J)) {
- fz_free(ctx, string);
- js_throw(J);
- }
js_pushstring(J, string);
- fz_free(ctx, string);
js_endtry(J);
}
@@ -3858,12 +3853,11 @@ static void ffi_PDFObject_asByteString(js_State *J)
fz_context *ctx = js_getcontext(J);
pdf_obj *obj = js_touserdata(J, 0, "pdf_obj");
const char *buf;
- int i, len = 0;
+ size_t i, len = 0;
- fz_try(ctx) {
- buf = pdf_to_str_buf(ctx, obj);
- len = pdf_to_str_len(ctx, obj);
- } fz_catch(ctx)
+ fz_try(ctx)
+ buf = pdf_to_string(ctx, obj, &len);
+ fz_catch(ctx)
rethrow(J);
js_newarray(J);
@@ -4076,21 +4070,14 @@ static void ffi_PDFAnnotation_getContents(js_State *J)
{
fz_context *ctx = js_getcontext(J);
pdf_annot *annot = js_touserdata(J, 0, "pdf_annot");
- char *contents = NULL;
+ const char *contents = NULL;
fz_try(ctx)
- contents = pdf_copy_annot_contents(ctx, annot);
+ contents = pdf_get_annot_contents(ctx, annot);
fz_catch(ctx)
rethrow(J);
- if (js_try(J)) {
- fz_free(ctx, contents);
- js_throw(J);
- }
js_pushstring(J, contents);
- js_endtry(J);
-
- fz_free(ctx, contents);
}
static void ffi_PDFAnnotation_setContents(js_State *J)
@@ -4375,21 +4362,14 @@ static void ffi_PDFAnnotation_getAuthor(js_State *J)
{
fz_context *ctx = js_getcontext(J);
pdf_annot *annot = js_touserdata(J, 0, "pdf_annot");
- char *author = NULL;
+ const char *author = NULL;
fz_try(ctx)
- author = pdf_copy_annot_author(ctx, annot);
+ author = pdf_get_annot_author(ctx, annot);
fz_catch(ctx)
rethrow(J);
- if (js_try(J)) {
- fz_free(ctx, author);
- js_throw(J);
- }
js_pushstring(J, author);
- js_endtry(J);
-
- fz_free(ctx, author);
}
static void ffi_PDFAnnotation_setAuthor(js_State *J)