OS_2 = xmalloc (sizeof *OS_2);
- /* Read data into the structure. */
+ /* Read data up to the end of `panose'. */
- wanted = SFNT_ENDOF (struct sfnt_OS_2_table, fs_last_char_index,
- uint16_t);
+ wanted = SFNT_ENDOF (struct sfnt_OS_2_table, panose,
+ unsigned char[10]);
rc = read (fd, OS_2, wanted);
if (rc == -1 || rc != wanted)
sfnt_swap16 (&OS_2->y_strikeout_size);
sfnt_swap16 (&OS_2->y_strikeout_position);
sfnt_swap16 (&OS_2->s_family_class);
+
+ /* Read fields between ul_unicode_range and fs_last_char_index. */
+ wanted = (SFNT_ENDOF (struct sfnt_OS_2_table, fs_last_char_index,
+ uint16_t)
+ - offsetof (struct sfnt_OS_2_table, ul_unicode_range));
+ rc = read (fd, &OS_2->ul_unicode_range, wanted);
+
+ if (rc == -1 || rc != wanted)
+ {
+ xfree (OS_2);
+ return NULL;
+ }
+
+ /* Swap the remainder and return the table. */
sfnt_swap32 (&OS_2->ul_unicode_range[0]);
sfnt_swap32 (&OS_2->ul_unicode_range[1]);
sfnt_swap32 (&OS_2->ul_unicode_range[2]);
/* Microsoft ``panose'' classification. */
unsigned char panose[10];
+ /* Alignment boundary! */
+
/* Unicode range specification. */
uint32_t ul_unicode_range[4];