diff options
Diffstat (limited to 'src/cos_parse.c')
-rw-r--r-- | src/cos_parse.c | 44 |
1 files changed, 27 insertions, 17 deletions
diff --git a/src/cos_parse.c b/src/cos_parse.c index de85b0c..21ba0d7 100644 --- a/src/cos_parse.c +++ b/src/cos_parse.c @@ -380,16 +380,16 @@ cos_decode_dictionary(struct nspdf_doc *doc, } /** - * decode a list + * parse a list */ static nspdferror -cos_decode_list(struct nspdf_doc *doc, - uint64_t *offset_out, - struct cos_object **cosobj_out) +cos_parse_list(struct nspdf_doc *doc, + uint64_t *offset_out, + struct cos_object **cosobj_out) { uint64_t offset; struct cos_object *cosobj; - struct cos_array_entry *entry; + struct cos_array *array; struct cos_object *value; nspdferror res; @@ -398,7 +398,7 @@ cos_decode_list(struct nspdf_doc *doc, /* sanity check first token is list open */ if (DOC_BYTE(doc, offset) != '[') { printf("not a [\n"); - return NSPDFERROR_SYNTAX; /* syntax error */ + return NSPDFERROR_SYNTAX; } offset++; @@ -409,13 +409,20 @@ cos_decode_list(struct nspdf_doc *doc, } //printf("found a list\n"); - + /* setup array object */ cosobj = calloc(1, sizeof(struct cos_object)); if (cosobj == NULL) { return NSPDFERROR_NOMEM; } cosobj->type = COS_TYPE_ARRAY; + array = calloc(1, sizeof(struct cos_array)); + if (array == NULL) { + cos_free_object(cosobj); + return NSPDFERROR_NOMEM; + } + cosobj->u.array = array; + while (DOC_BYTE(doc, offset) != ']') { res = cos_parse_object(doc, &offset, &value); @@ -425,17 +432,20 @@ cos_decode_list(struct nspdf_doc *doc, return res; } - /* add entry to array */ - entry = calloc(1, sizeof(struct cos_array_entry)); - if (entry == NULL) { - cos_free_object(cosobj); - return NSPDFERROR_NOMEM; + if (array->alloc < (array->length + 1)) { + struct cos_object **nvalues; + nvalues = realloc(array->values, + sizeof(struct cos_object *) * (array->alloc + 32)); + if (nvalues == NULL) { + cos_free_object(cosobj); + return NSPDFERROR_NOMEM; + } + array->values = nvalues; + array->alloc += 32; } - entry->value = value; - entry->next = cosobj->u.array; - - cosobj->u.array = entry; + *(array->values + array->length) = value; + array->length++; } offset++; /* skip closing ] */ @@ -996,7 +1006,7 @@ cos_parse_object(struct nspdf_doc *doc, break; case '[': - res = cos_decode_list(doc, &offset, &cosobj); + res = cos_parse_list(doc, &offset, &cosobj); break; case 't': |