#ifndef HUSH_UTF8_H
#define HUSH_UTF8_H

/* Byte length of the UTF-8 codepoint starting at text[pos], clamped so it never runs past `len`. */
static inline int utf8_next_len(const char *text, int pos, int len) {
    unsigned char c = (unsigned char)text[pos];
    int n;
    if ((c & 0x80) == 0x00) n = 1;
    else if ((c & 0xE0) == 0xC0) n = 2;
    else if ((c & 0xF0) == 0xE0) n = 3;
    else if ((c & 0xF8) == 0xF0) n = 4;
    else n = 1;
    if (pos + n > len) n = len - pos;
    return n;
}

/* Byte offset of the start of the codepoint immediately before `pos`. */
static inline int utf8_prev_start(const char *text, int pos) {
    int p = pos - 1;
    while (p > 0 && ((unsigned char)text[p] & 0xC0) == 0x80) p--;
    return p;
}

#endif
