|
1 | 1 | #include "deserialize.h" |
2 | 2 |
|
| 3 | +#include <stdint.h> |
3 | 4 | #include <string.h> |
4 | 5 |
|
5 | 6 | #include "arena/arena.h" |
@@ -388,6 +389,14 @@ PdfError* pdf_deserialize_optional_field( |
388 | 389 | ); |
389 | 390 | } |
390 | 391 |
|
| 392 | +static void |
| 393 | +pdf_optional_field_none(void* field_ptr, PdfOptionalFieldData field_data) { |
| 394 | + RELEASE_ASSERT(field_ptr); |
| 395 | + |
| 396 | + void* discriminant_ptr = (char*)field_ptr + field_data.discriminant_offset; |
| 397 | + *(bool*)discriminant_ptr = false; |
| 398 | +} |
| 399 | + |
391 | 400 | PdfError* pdf_deserialize_object( |
392 | 401 | void* target, |
393 | 402 | const PdfObject* object, |
@@ -488,12 +497,19 @@ PdfError* pdf_deserialize_object( |
488 | 497 | break; |
489 | 498 | } |
490 | 499 |
|
491 | | - if (!found && field->info.kind != PDF_FIELD_KIND_OPTIONAL) { |
492 | | - return PDF_ERROR( |
493 | | - PDF_ERR_MISSING_DICT_KEY, |
494 | | - "Missing key `%s`", |
495 | | - field->key |
496 | | - ); |
| 500 | + if (!found) { |
| 501 | + if (field->info.kind == PDF_FIELD_KIND_OPTIONAL) { |
| 502 | + pdf_optional_field_none( |
| 503 | + (char*)target + field->offset, |
| 504 | + field->info.data.optional |
| 505 | + ); |
| 506 | + } else { |
| 507 | + return PDF_ERROR( |
| 508 | + PDF_ERR_MISSING_DICT_KEY, |
| 509 | + "Missing key `%s`", |
| 510 | + field->key |
| 511 | + ); |
| 512 | + } |
497 | 513 | } |
498 | 514 | } |
499 | 515 |
|
@@ -992,6 +1008,28 @@ TEST_FUNC(test_deserialize_inline_optional) { |
992 | 1008 | return TEST_RESULT_PASS; |
993 | 1009 | } |
994 | 1010 |
|
| 1011 | +TEST_FUNC(test_deserialize_inline_optional_none) { |
| 1012 | + Arena* arena = arena_new(1024); |
| 1013 | + const char* objects[] = {"<< >>"}; |
| 1014 | + |
| 1015 | + char* buffer = |
| 1016 | + pdf_construct_deserde_test_doc(objects, 1, "<< /Size 2 >>", arena); |
| 1017 | + |
| 1018 | + DESERIALIZER_TEST_HELPER(); |
| 1019 | + |
| 1020 | + TestDeserializeInlineOptional deserialized = {.inner.discriminant = true}; |
| 1021 | + TEST_PDF_REQUIRE(deserialize_test_inline_optional( |
| 1022 | + &object, |
| 1023 | + arena, |
| 1024 | + pdf_op_resolver_some(resolver), |
| 1025 | + &deserialized |
| 1026 | + )); |
| 1027 | + |
| 1028 | + TEST_ASSERT(!deserialized.inner.discriminant); |
| 1029 | + |
| 1030 | + return TEST_RESULT_PASS; |
| 1031 | +} |
| 1032 | + |
995 | 1033 | DESERIALIZABLE_ARRAY_TYPE(DeserializeTestStringArray) |
996 | 1034 | DESERIALIZABLE_ARRAY_TYPE(DeserializeTestIntegerArray) |
997 | 1035 |
|
|
0 commit comments