summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvipdfm-x/src/pdfnames.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/dvipdfm-x/src/pdfnames.c')
-rw-r--r--Build/source/texk/dvipdfm-x/src/pdfnames.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/Build/source/texk/dvipdfm-x/src/pdfnames.c b/Build/source/texk/dvipdfm-x/src/pdfnames.c
index 864910b3411..4f587d283bc 100644
--- a/Build/source/texk/dvipdfm-x/src/pdfnames.c
+++ b/Build/source/texk/dvipdfm-x/src/pdfnames.c
@@ -73,6 +73,39 @@ printable_key (const char *key, int keylen)
return (char *) pkey;
}
+#ifdef XETEX
+static void
+flush_objects (struct ht_table *ht_tab)
+{
+ struct ht_iter iter;
+
+ if (ht_set_iter(ht_tab, &iter) >= 0) {
+ do {
+ char *key;
+ int keylen;
+ struct obj_data *value;
+
+ key = ht_iter_getkey(&iter, &keylen);
+ value = ht_iter_getval(&iter);
+ if (value->reserve) {
+ WARN("Unresolved object reference \"%s\" found!!!",
+ printable_key(key, keylen));
+ }
+ if (value->object) {
+ pdf_release_obj(value->object);
+ }
+ if (value->object_ref) {
+ pdf_release_obj(value->object_ref);
+ }
+ value->object = NULL;
+ value->object_ref = NULL;
+ value->reserve = 0;
+ } while (ht_iter_next(&iter) >= 0);
+ ht_clear_iter(&iter);
+ }
+}
+#endif
+
static void CDECL
hval_free (void *hval)
{
@@ -101,6 +134,7 @@ pdf_new_name_tree (void)
return names;
}
+#ifndef XETEX
static void
check_objects_defined (struct ht_table *ht_tab)
{
@@ -124,6 +158,7 @@ check_objects_defined (struct ht_table *ht_tab)
ht_clear_iter(&iter);
}
}
+#endif
void
pdf_delete_name_tree (struct ht_table **names)
@@ -172,6 +207,45 @@ pdf_names_add_object (struct ht_table *names,
return 0;
}
+#ifdef XETEX
+int
+pdf_names_add_reference (struct ht_table *names,
+ const void *key, int keylen, pdf_obj *object_ref)
+{
+ struct obj_data *value;
+
+ ASSERT(names);
+
+ if (!PDF_OBJ_INDIRECTTYPE(object_ref)) {
+ WARN("Invalid type: @%s is not reference...",
+ printable_key(key, keylen));
+ return -1;
+ }
+
+ value = ht_lookup_table(names, key, keylen);
+ if (!value) {
+ value = NEW(1, struct obj_data);
+ value->object = NULL;
+ value->object_ref = object_ref;
+ value->reserve = 0;
+ ht_append_table(names, key, keylen, value);
+ } else {
+ if (value->object || value->object_ref) {
+ WARN("Object reference \"%s\" is in use.",
+ printable_key(key, keylen));
+ WARN("Please close it before redefining.");
+ return -1;
+ } else {
+ value->object = NULL;
+ value->object_ref = object_ref;
+ }
+ value->reserve = 0;
+ }
+
+ return 0;
+}
+#endif
+
/*
* The following routine returns copies, not the original object.
*/