/*
******************************************************************************
*
*   Copyright (C) 1999-2006, International Business Machines
*   Corporation and others.  All Rights Reserved.
*
******************************************************************************
*   file name:  utf_impl.c
*   encoding:   US-ASCII
*   tab size:   8 (not used)
*   indentation:4
*
*   created on: 1999sep13
*   created by: Markus W. Scherer
*
*   This file provides implementation functions for macros in the utfXX.h
*   that would otherwise be too long as macros.
*/

#include <stddef.h>

#include "src/lib/fxl/third_party/icu/icu_utf.h"

namespace fxl_icu {

/**
 * UTF8_ERROR_VALUE_1 and UTF8_ERROR_VALUE_2 are special error values for UTF-8,
 * which need 1 or 2 bytes in UTF-8:
 * \code
 * U+0015 = NAK = Negative Acknowledge, C0 control character
 * U+009f = highest C1 control character
 * \endcode
 *
 * These are used by UTF8_..._SAFE macros so that they can return an error value
 * that needs the same number of code units (bytes) as were seen by
 * a macro. They should be tested with UTF_IS_ERROR() or UTF_IS_VALID().
 *
 * @deprecated ICU 2.4. Obsolete, see utf_old.h.
 */
#define FXL_UTF8_ERROR_VALUE_1 0x15

/**
 * See documentation on UTF8_ERROR_VALUE_1 for details.
 *
 * @deprecated ICU 2.4. Obsolete, see utf_old.h.
 */
#define FXL_UTF8_ERROR_VALUE_2 0x9f

/**
 * Error value for all UTFs. This code point value will be set by macros with e>
 * checking if an error is detected.
 *
 * @deprecated ICU 2.4. Obsolete, see utf_old.h.
 */
#define FXL_UTF_ERROR_VALUE 0xffff

/*
 * This table could be replaced on many machines by
 * a few lines of assembler code using an
 * "index of first 0-bit from msb" instruction and
 * one or two more integer instructions.
 *
 * For example, on an i386, do something like
 * - MOV AL, leadByte
 * - NOT AL         (8-bit, leave b15..b8==0..0, reverse only b7..b0)
 * - MOV AH, 0
 * - BSR BX, AX     (16-bit)
 * - MOV AX, 6      (result)
 * - JZ finish      (ZF==1 if leadByte==0xff)
 * - SUB AX, BX (result)
 * -finish:
 * (BSR: Bit Scan Reverse, scans for a 1-bit, starting from the MSB)
 *
 * In Unicode, all UTF-8 byte sequences with more than 4 bytes are illegal;
 * lead bytes above 0xf4 are illegal.
 * We keep them in this table for skipping long ISO 10646-UTF-8 sequences.
 */
const uint8_t utf8_countTrailBytes[256] = {
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,

    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, /* illegal in Unicode */
    4, 4, 4, 4,                                                             /* illegal in Unicode */
    5, 5,                                                                   /* illegal in Unicode */
    0, 0 /* illegal bytes 0xfe and 0xff */
};

static const UChar32 utf8_minLegal[4] = {0, 0x80, 0x800, 0x10000};

static const UChar32 utf8_errorValue[6] = {FXL_UTF8_ERROR_VALUE_1,
                                           FXL_UTF8_ERROR_VALUE_2,
                                           FXL_UTF_ERROR_VALUE,
                                           0x10ffff,
                                           0x3ffffff,
                                           0x7fffffff};

/*
 * Handle the non-inline part of the U8_NEXT() macro and its obsolete sibling
 * UTF8_NEXT_CHAR_SAFE().
 *
 * The "strict" parameter controls the error behavior:
 * <0  "Safe" behavior of U8_NEXT(): All illegal byte sequences yield a negative
 *     code point result.
 *  0  Obsolete "safe" behavior of UTF8_NEXT_CHAR_SAFE(..., FALSE):
 *     All illegal byte sequences yield a positive code point such that this
 *     result code point would be encoded with the same number of bytes as
 *     the illegal sequence.
 * >0  Obsolete "strict" behavior of UTF8_NEXT_CHAR_SAFE(..., TRUE):
 *     Same as the obsolete "safe" behavior, but non-characters are also treated
 *     like illegal sequences.
 *
 * The special negative (<0) value -2 is used for lenient treatment of surrogate
 * code points as legal. Some implementations use this for roundtripping of
 * Unicode 16-bit strings that are not well-formed UTF-16, that is, they
 * contain unpaired surrogates.
 *
 * Note that a UBool is the same as an int8_t.
 */
UChar32 utf8_nextCharSafeBody(const uint8_t* s, size_t* pi, size_t length, UChar32 c,
                              UBool strict) {
  size_t i = *pi;
  uint8_t count = FXL_U8_COUNT_TRAIL_BYTES(c);
  if ((i) + count <= (length)) {
    uint8_t trail, illegal = 0;

    FXL_U8_MASK_LEAD_BYTE((c), count);
    /* count==0 for illegally leading trail bytes and the illegal bytes 0xfe and
     * 0xff */
    switch (count) {
      /* each branch falls through to the next one */
      case 5:
      case 4:
        /* count>=4 is always illegal: no more than 3 trail bytes in Unicode's
         * UTF-8 */
        illegal = 1;
        break;
      case 3:
        trail = s[(i)++];
        (c) = ((c) << 6) | (trail & 0x3f);
        if (c < 0x110) {
          illegal |= (trail & 0xc0) ^ 0x80;
        } else {
          /* code point>0x10ffff, outside Unicode */
          illegal = 1;
          break;
        }
      case 2:
        trail = s[(i)++];
        (c) = ((c) << 6) | (trail & 0x3f);
        illegal |= (trail & 0xc0) ^ 0x80;
      case 1:
        trail = s[(i)++];
        (c) = ((c) << 6) | (trail & 0x3f);
        illegal |= (trail & 0xc0) ^ 0x80;
        break;
      case 0:
        if (strict >= 0) {
          return FXL_UTF8_ERROR_VALUE_1;
        } else {
          return FXL_U_SENTINEL;
        }
        /* no default branch to optimize switch()  - all values are covered */
    }

    /*
     * All the error handling should return a value
     * that needs count bytes so that UTF8_GET_CHAR_SAFE() works right.
     *
     * Starting with Unicode 3.0.1, non-shortest forms are illegal.
     * Starting with Unicode 3.2, surrogate code points must not be
     * encoded in UTF-8, and there are no irregular sequences any more.
     *
     * U8_ macros (new in ICU 2.4) return negative values for error conditions.
     */

    /* correct sequence - all trail bytes have (b7..b6)==(10)? */
    /* illegal is also set if count>=4 */
    if (illegal || (c) < utf8_minLegal[count] || (FXL_U_IS_SURROGATE(c) && strict != -2)) {
      /* error handling */
      uint8_t errorCount = count;
      /* don't go beyond this sequence */
      i = *pi;
      while (count > 0 && FXL_U8_IS_TRAIL(s[i])) {
        ++(i);
        --count;
      }
      if (strict >= 0) {
        c = utf8_errorValue[errorCount - count];
      } else {
        c = FXL_U_SENTINEL;
      }
    } else if ((strict) > 0 && FXL_U_IS_UNICODE_NONCHAR(c)) {
      /* strict: forbid non-characters like U+fffe */
      c = utf8_errorValue[count];
    }
  } else /* too few bytes left */ {
    /* error handling */
    size_t i0 = i;
    /* don't just set (i)=(length) in case there is an illegal sequence */
    while ((i) < (length) && FXL_U8_IS_TRAIL(s[i])) {
      ++(i);
    }
    if (strict >= 0) {
      c = utf8_errorValue[i - i0];
    } else {
      c = FXL_U_SENTINEL;
    }
  }
  *pi = i;
  return c;
}

}  // namespace fxl_icu
