summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvipdfmx/src/pdfobj.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/dvipdfmx/src/pdfobj.c')
-rw-r--r--Build/source/texk/dvipdfmx/src/pdfobj.c166
1 files changed, 48 insertions, 118 deletions
diff --git a/Build/source/texk/dvipdfmx/src/pdfobj.c b/Build/source/texk/dvipdfmx/src/pdfobj.c
index c9862c6fbce..e25d481f7c5 100644
--- a/Build/source/texk/dvipdfmx/src/pdfobj.c
+++ b/Build/source/texk/dvipdfmx/src/pdfobj.c
@@ -1,4 +1,4 @@
-/* $Header: /home/cvsroot/dvipdfmx/src/pdfobj.c,v 1.59 2008/06/07 09:54:38 chofchof Exp $
+/* $Header: /home/cvsroot/dvipdfmx/src/pdfobj.c,v 1.63 2008/11/30 21:12:27 matthias Exp $
This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
@@ -583,7 +583,7 @@ void pdf_out_white (FILE *file)
#define INVALIDOBJ(o) ((o) == NULL || (o)->type <= 0 || (o)->type > PDF_INDIRECT)
-pdf_obj *
+static pdf_obj *
pdf_new_obj(int type)
{
pdf_obj *result;
@@ -627,6 +627,21 @@ pdf_label_obj (pdf_obj *object)
}
/*
+ * Transfer the label assigned to the object src to the object dst.
+ * The object dst must not yet have been labeled.
+ */
+void
+pdf_transfer_label (pdf_obj *dst, pdf_obj *src)
+{
+ ASSERT(dst && !dst->label && src);
+
+ dst->label = src->label;
+ dst->generation = src->generation;
+ src->label = 0;
+ src->generation = 0;
+}
+
+/*
* This doesn't really copy the object, but allows it to be used without
* fear that somebody else will free it.
*/
@@ -734,6 +749,7 @@ write_boolean (pdf_boolean *data, FILE *file)
}
}
+#if 0
void
pdf_set_boolean (pdf_obj *object, char value)
{
@@ -744,6 +760,7 @@ pdf_set_boolean (pdf_obj *object, char value)
data = object->data;
data->value = value;
}
+#endif
char
pdf_boolean_value (pdf_obj *object)
@@ -1063,6 +1080,7 @@ release_name (pdf_name *data)
RELEASE(data);
}
+#if 0
void
pdf_set_name (pdf_obj *object, const char *name)
{
@@ -1084,6 +1102,7 @@ pdf_set_name (pdf_obj *object, const char *name)
data->name = NULL;
}
}
+#endif
char *
pdf_name_value (pdf_obj *object)
@@ -1208,6 +1227,7 @@ pdf_add_array (pdf_obj *array, pdf_obj *object)
return;
}
+#if 0
void
pdf_put_array (pdf_obj *array, unsigned idx, pdf_obj *object)
{
@@ -1260,6 +1280,7 @@ pdf_shift_array (pdf_obj *array)
return result;
}
+#endif
/* Prepend an object to an array */
void
@@ -1281,6 +1302,7 @@ pdf_unshift_array (pdf_obj *array, pdf_obj *object)
data->size++;
}
+#if 0
pdf_obj *
pdf_pop_array (pdf_obj *array)
{
@@ -1299,6 +1321,7 @@ pdf_pop_array (pdf_obj *array)
return result;
}
+#endif
static void
@@ -1389,6 +1412,7 @@ pdf_add_dict (pdf_obj *dict, pdf_obj *key, pdf_obj *value)
return 0;
}
+#if 0
void
pdf_put_dict (pdf_obj *dict, const char *key, pdf_obj *value)
{
@@ -1431,6 +1455,7 @@ pdf_put_dict (pdf_obj *dict, const char *key, pdf_obj *value)
data->value = value;
}
}
+#endif
/* pdf_merge_dict makes a link for each item in dict2 before stealing it */
void
@@ -1867,6 +1892,7 @@ pdf_stream_uncompress (pdf_obj *src) {
return dst;
}
+#if 0
void
pdf_stream_set_flags (pdf_obj *stream, int flags)
{
@@ -1889,6 +1915,7 @@ pdf_stream_get_flags (pdf_obj *stream)
return data->_flags;
}
+#endif
static void
pdf_write_obj (pdf_obj *object, FILE *file)
@@ -2088,102 +2115,6 @@ pdf_release_obj (pdf_obj *object)
}
}
-/* Copy object data without changing object label. */
-void
-pdf_copy_object (pdf_obj *dst, pdf_obj *src)
-{
- if (!dst || !src)
- return;
-
- switch (dst->type) {
- case PDF_BOOLEAN: release_boolean(dst->data); break;
- case PDF_NULL: release_null(dst->data); break;
- case PDF_NUMBER: release_number(dst->data); break;
- case PDF_STRING: release_string(dst->data); break;
- case PDF_NAME: release_name(dst->data); break;
- case PDF_ARRAY: release_array(dst->data); break;
- case PDF_DICT: release_dict(dst->data); break;
- case PDF_STREAM: release_stream(dst->data); break;
- case PDF_INDIRECT: release_indirect(dst->data); break;
- }
-
- dst->type = src->type;
- switch (src->type) {
- case PDF_BOOLEAN:
- dst->data = NEW(1, pdf_boolean);
- pdf_set_boolean(dst, pdf_boolean_value(src));
- break;
- case PDF_NULL:
- dst->data = NULL;
- break;
- case PDF_NUMBER:
- dst->data = NEW(1, pdf_number);
- pdf_set_number(dst, pdf_number_value(src));
- break;
- case PDF_STRING:
- dst->data = NEW(1, pdf_string);
- pdf_set_string(dst,
- pdf_string_value(src),
- pdf_string_length(src));
- break;
- case PDF_NAME:
- dst->data = NEW(1, pdf_name);
- pdf_set_name(dst, pdf_name_value(src));
- break;
- case PDF_ARRAY:
- {
- pdf_array *data;
- unsigned long i;
-
- dst->data = data = NEW(1, pdf_array);
- data->size = 0;
- data->max = 0;
- data->values = NULL;
- for (i = 0; i < pdf_array_length(src); i++) {
- pdf_add_array(dst, pdf_link_obj(pdf_get_array(src, i)));
- }
- }
- break;
- case PDF_DICT:
- {
- pdf_dict *data;
-
- dst->data = data = NEW(1, pdf_dict);
- data->key = NULL;
- data->value = NULL;
- data->next = NULL;
- pdf_merge_dict(dst, src);
- }
- break;
- case PDF_STREAM:
- {
- pdf_stream *data;
-
- dst->data = data = NEW(1, pdf_stream);
- data->dict = pdf_new_dict();
- data->_flags = ((pdf_stream *)src->data)->_flags;
- data->stream_length = 0;
- data->max_length = 0;
-
- pdf_add_stream(dst, pdf_stream_dataptr(src), pdf_stream_length(src));
- pdf_merge_dict(data->dict, pdf_stream_dict(src));
- }
- break;
- case PDF_INDIRECT:
- {
- pdf_indirect *data;
-
- dst->data = data = NEW(1, pdf_indirect);
- data->pf = ((pdf_indirect *) (src->data))->pf;
- data->label = ((pdf_indirect *) (src->data))->label;
- data->generation = ((pdf_indirect *) (src->data))->generation;
- }
- break;
- }
-
- return;
-}
-
static int
backup_line (FILE *pdf_input_file)
{
@@ -2551,19 +2482,23 @@ pdf_get_object (pdf_file *pf, unsigned long obj_num, unsigned short obj_gen)
pdf_obj *
pdf_deref_obj (pdf_obj *obj)
{
+ int count = PDF_OBJ_MAX_DEPTH;
+
if (obj)
obj = pdf_link_obj(obj);
- while (PDF_OBJ_INDIRECTTYPE(obj)) {
+ while (PDF_OBJ_INDIRECTTYPE(obj) && --count) {
pdf_file *pf = OBJ_FILE(obj);
unsigned long obj_num = OBJ_NUM(obj);
unsigned short obj_gen = OBJ_GEN(obj);
- if (!pf)
- ERROR("Tried to deref a non-file object");
+ ASSERT(pf);
pdf_release_obj(obj);
- obj = pdf_get_object(pf, obj_num, obj_gen);
+ obj = pdf_get_object(pf, obj_num, obj_gen);
}
+ if (!count)
+ ERROR("Loop in object hierarchy detected. Broken PDF file?");
+
if (PDF_OBJ_NULLTYPE(obj)) {
pdf_release_obj(obj);
return NULL;
@@ -3014,6 +2949,8 @@ import_dict (pdf_obj *key, pdf_obj *value, void *pdata)
return 0;
}
+static pdf_obj loop_marker = { PDF_OBJ_INVALID, 0, 0, 0, 0, NULL };
+
static pdf_obj *
pdf_import_indirect (pdf_obj *object)
{
@@ -3031,15 +2968,16 @@ pdf_import_indirect (pdf_obj *object)
}
if ((ref = pf->xref_table[obj_num].indirect)) {
+ if (ref == &loop_marker)
+ ERROR("Loop in object hierarchy detected. Broken PDF file?");
return pdf_link_obj(ref);
} else {
pdf_obj *obj, *tmp;
obj = pdf_get_object(pf, obj_num, obj_gen);
- if (!obj) {
- WARN("Could not read object: %lu %u", obj_num, obj_gen);
- return NULL;
- }
+
+ /* We mark the reference to be able to detect loops */
+ pf->xref_table[obj_num].indirect = &loop_marker;
tmp = pdf_import_object(obj);
@@ -3125,25 +3063,17 @@ pdf_import_object (pdf_obj *object)
}
+/* returns 0 if indirect references point to the same object */
int
pdf_compare_reference (pdf_obj *ref1, pdf_obj *ref2)
{
pdf_indirect *data1, *data2;
- if (!PDF_OBJ_INDIRECTTYPE(ref1) ||
- !PDF_OBJ_INDIRECTTYPE(ref2)) {
- ERROR("Not indirect reference...");
- }
+ ASSERT(PDF_OBJ_INDIRECTTYPE(ref1) && PDF_OBJ_INDIRECTTYPE(ref2));
data1 = (pdf_indirect *) ref1->data;
data2 = (pdf_indirect *) ref2->data;
- if (data1->pf != data2->pf)
- return (int) (data1->pf - data2->pf);
- if (data1->label != data2->label)
- return (int) (data1->label - data2->label);
- if (data1->generation != data2->generation)
- return (int) (data1->generation - data2->generation);
-
- return 0;
+ return data1->pf != data2->pf || data1->label != data2->label
+ || data1->generation != data2->generation;
}