summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVincent Sanders <vince@kyllikki.org>2017-07-14 23:36:05 +0100
committerVincent Sanders <vince@kyllikki.org>2017-07-14 23:36:05 +0100
commit286bf6db27789424b07f2d6f0479f0a0527e91a4 (patch)
treef072835b88e682ea7d711de6563ac564b0d46e98 /src
parent7220b02603cfd33775e56da19fe9f5fb1da08aa0 (diff)
downloadlibnspdf-286bf6db27789424b07f2d6f0479f0a0527e91a4.tar.gz
libnspdf-286bf6db27789424b07f2d6f0479f0a0527e91a4.tar.bz2
arrays work
Diffstat (limited to 'src')
-rw-r--r--src/xref.c82
1 files changed, 80 insertions, 2 deletions
diff --git a/src/xref.c b/src/xref.c
index e1f3a9d..76ed194 100644
--- a/src/xref.c
+++ b/src/xref.c
@@ -123,6 +123,14 @@ struct cos_dictionary_entry {
struct cos_object *value;
};
+struct cos_array_entry {
+ /** next value in array */
+ struct cos_array_entry *next;
+
+ /** value */
+ struct cos_object *value;
+};
+
struct cos_reference {
/** id of indirect object */
@@ -156,6 +164,9 @@ struct cos_object {
/* dictionary */
struct cos_dictionary_entry *dictionary;
+ /* array */
+ struct cos_array_entry *array;
+
/** reference */
struct cos_reference *reference;
@@ -470,6 +481,24 @@ int cos_decode_hex_string(struct pdf_doc *doc,
uint64_t *offset_out,
struct cos_object **cosobj_out)
{
+ uint64_t offset;
+ struct cos_object *cosobj;
+ uint8_t c;
+ uint8_t byte;
+
+ offset = *offset_out;
+
+ c = DOC_BYTE(doc, offset++);
+ if (c != '<') {
+ return -1; /* syntax error */
+ }
+ doc_skip_ws(doc, &offset);
+
+ while (c != '>') {
+ c = DOC_BYTE(doc, offset++);
+ doc_skip_ws(doc, &offset);
+ }
+
return -1;
}
@@ -551,7 +580,56 @@ int cos_decode_list(struct pdf_doc *doc,
uint64_t *offset_out,
struct cos_object **cosobj_out)
{
- return -1;
+ uint64_t offset;
+ struct cos_object *cosobj;
+ struct cos_array_entry *entry;
+ struct cos_object *value;
+ int res;
+
+ offset = *offset_out;
+
+ if (DOC_BYTE(doc, offset) != '[') {
+ return -1; /* syntax error */
+ }
+ offset++;
+ doc_skip_ws(doc, &offset);
+
+ printf("found a list\n");
+
+ cosobj = calloc(1, sizeof(struct cos_object));
+ if (cosobj == NULL) {
+ return -1; /* memory error */
+ }
+ cosobj->type = COS_TYPE_ARRAY;
+
+ while (DOC_BYTE(doc, offset) != ']') {
+
+ res = cos_decode_object(doc, &offset, &value);
+ if (res != 0) {
+ /* todo free up any array entries already created */
+ return res;
+ }
+
+ /* add array entry */
+ entry = calloc(1, sizeof(struct cos_array_entry));
+ if (entry == NULL) {
+ /* todo free up any array entries already created */
+ return -1; /* memory error */
+ }
+
+ entry->value = value;
+ entry->next = cosobj->u.array;
+
+ cosobj->u.array = entry;
+
+ }
+ offset++; /* skip closing ] */
+ doc_skip_ws(doc, &offset);
+
+ *cosobj_out = cosobj;
+ *offset_out = offset;
+
+ return 0;
}
#define NAME_MAX_LENGTH 127
@@ -750,7 +828,7 @@ int cos_attempt_decode_reference(struct pdf_doc *doc,
offset = *offset_out;
- res = cos_decode_object(doc, &offset, &cosobj);
+ res = cos_decode_number(doc, &offset, &cosobj);
if (res != 0) {
return 0; /* no error if object could not be decoded */
}