/* See LICENSE file for copyright and license details. */
#ifndef UTIL_H
#define UTIL_H

#include <stddef.h>
#include <stdint.h>

#include "types.h"

#define LEN(x) (sizeof(x) / sizeof *(x))

struct property_spec {
	const char *enumname;
	const char *file;
	const char *ucdname;
	const char *ucdsubname;
};

struct properties {
	int_least64_t property;
};

struct properties_compressed {
	size_t *offset;
	struct properties *data;
	size_t datalen;
};

struct properties_major_minor {
	size_t *major;
	size_t *minor;
	size_t minorlen;
};

int hextocp(const char *, size_t, uint_least32_t *cp);
int parse_cp_list(const char *, uint_least32_t **, size_t *);

void parse_file_with_callback(const char *,
                              int (*callback)(const char *, char **, size_t,
                                              char *, void *),
                              void *payload);

void properties_compress(const struct properties *,
                         struct properties_compressed *comp);
double properties_get_major_minor(const struct properties_compressed *,
                                  struct properties_major_minor *);
void properties_print_lookup_table(const char *, const size_t *, size_t);
void properties_print_derived_lookup_table(
	char *, size_t *, size_t,
	int_least64_t (*get_value)(const struct properties *, size_t),
	const void *);

void properties_generate_break_property(
	const struct property_spec *, uint_least8_t,
	uint_least8_t (*fill_missing)(uint_least32_t),
	uint_least8_t (*handle_conflict)(uint_least32_t, uint_least8_t,
                                         uint_least8_t),
	void (*post_process)(struct properties *), const char *, const char *);

void break_test_list_parse(char *, struct break_test **, size_t *);
void break_test_list_print(const struct break_test *, size_t, const char *,
                           const char *);
void break_test_list_free(struct break_test *, size_t);

#endif /* UTIL_H */
