#ifndef SCRIPT_IDENTIFY_H_
#define SCRIPT_IDENTIFY_H_

#include <stdint.h>

#include <harfbuzz-shaper.h>

#if defined(_MSC_VER)
typedef size_t ssize_t;
#endif

static const uint32_t HB_InvalidCodePoint = 0xffffffffu;

// -----------------------------------------------------------------------------
// Return the next Unicode code point from a UTF-16 vector
//   chars: a pointer to @len words
//   iter: (input/output) an index into @chars. This is updated.
//   returns: HB_InvalidCodePoint on error and the code point otherwise.
// -----------------------------------------------------------------------------
uint32_t utf16_to_code_point(const uint16_t *chars, size_t len, ssize_t *iter);

// -----------------------------------------------------------------------------
// Like the above, except that the code points are traversed backwards. Thus,
// on the first call, |iter| should be |len| - 1.
// -----------------------------------------------------------------------------
uint32_t utf16_to_code_point(const uint16_t *chars, size_t len, ssize_t *iter);

// -----------------------------------------------------------------------------
// Return the script of the given code point
// -----------------------------------------------------------------------------
HB_Script code_point_to_script(uint32_t cp);

// -----------------------------------------------------------------------------
// Find the next script run in a UTF-16 string.
//
// A script run is a subvector of codepoints, all of which are in the same
// script. A run will never cut a surrogate pair in half at either end.
//
// num_code_points: (output, maybe NULL) the number of code points in the run
// output: (output) the @pos, @length and @script fields are set on success
// chars: the UTF-16 string
// len: the length of @chars, in words
// iter: (in/out) the current index into the string. This should be 0 for the
//   first call and is updated on exit.
//
// returns: non-zero if a script run was found and returned.
// -----------------------------------------------------------------------------
char hb_utf16_script_run_next(unsigned *num_code_points, HB_ScriptItem *output,
                              const uint16_t *chars, size_t len, ssize_t *iter);

// -----------------------------------------------------------------------------
// This is the same as above, except that the input is traversed backwards.
// Thus, on the first call, |iter| should be |len| - 1.
// -----------------------------------------------------------------------------
char hb_utf16_script_run_prev(unsigned *num_code_points, HB_ScriptItem *output,
                              const uint16_t *chars, size_t len, ssize_t *iter);

#endif
