/* See LICENSE file for copyright and license details. */
#include "common.h"
int
libparsesfnt_parse_avar(
const char *data, size_t size,
struct libparsesfnt_avar *infop,
const struct libparsesfnt_tabdir_entry *tag)
{
return PARSE(LIBPARSESFNT_AVAR__, tag->offset, 0, 0, 0, 1, tag);
}
static uint16_t
avar_parse16(const char *data)
{
uint16_t b1 = (uint16_t)((const uint8_t *)data)[0];
uint16_t b2 = (uint16_t)((const uint8_t *)data)[1];
b1 = (uint16_t)(b1 << 8);
b2 = (uint16_t)(b2 << 0);
return (uint16_t)(b1 | b2);
}
int
libparsesfnt_parse_avar_entries(
const char *data, size_t size,
struct libparsesfnt_avar_entry *infop,
const struct libparsesfnt_tabdir_entry *tag,
size_t *offsetp, size_t count)
{
size_t offset = offsetp ? *offsetp : 0;
if (offset < 8) {
if (tag->length < 8) {
errno = EBFONT;
return -1;
}
offset = 8;
}
if ((size_t)tag->length < offset || size < (size_t)tag->length - offset) {
errno = EBFONT;
return -1;
}
while (count--) {
if (tag->length - offset < 2) {
errno = EBFONT;
return -1;
}
infop->pair_count = avar_parse16(&data[offset]);
offset += 2;
infop->libparsesfnt_subentry_location = offset;
memset(infop->__padding1, 0, sizeof(infop->__padding1));
if ((size_t)infop->pair_count > ((size_t)tag->length - offset) / 4) {
errno = EBFONT;
return -1;
}
infop++;
}
if (offsetp)
*offsetp = offset;
return 0;
}
int
libparsesfnt_parse_avar_subentries(
const char *data, size_t size,
struct libparsesfnt_avar_subentry *infop,
const struct libparsesfnt_avar_entry *entry,
size_t first, size_t count)
{
return PARSE(LIBPARSESFNT_AVAR_SUBENTRY__, entry->libparsesfnt_subentry_location, 0, 0, first, count, NULL);
}