///|
fn Parser::flush_utf8(self : Parser) -> Unit {
  if self.utf8_remaining == 0 {
    return
  }
  self.utf8_remaining = 0
  self.report(
    "truncated_utf8",
    Error,
    "Incomplete UTF-8 sequence before a syntax boundary",
    self.utf8_span,
  )
  self.append_scalar(0xFFFD, self.utf8_span)
}

///|
fn Parser::emit_utf8(self : Parser, byte : Int, span : Span) -> Unit {
  if self.utf8_remaining > 0 {
    if byte < 128 || byte > 191 {
      self.flush_utf8()
      if !self.stopped {
        self.emit_utf8(byte, span)
      }
      return
    }
    self.utf8_value = self.utf8_value * 64 + byte - 128
    self.utf8_span = { start: self.utf8_span.start, end: span.end, }
    self.utf8_remaining -= 1
    if self.utf8_remaining == 0 {
      let value = self.utf8_value
      if value < self.utf8_minimum ||
        value > 0x10FFFF ||
        (value >= 0xD800 && value <= 0xDFFF) {
        self.report(
          "invalid_utf8",
          Error,
          "UTF-8 sequence encodes an invalid scalar",
          self.utf8_span,
        )
        self.append_scalar(0xFFFD, self.utf8_span)
      } else {
        self.append_scalar(value, self.utf8_span)
      }
    }
    return
  }
  if byte < 128 {
    if byte != 0 {
      self.append_scalar(byte, span)
    } else {
      self.report("nul_text", Warning, "NUL in text was omitted", span)
    }
  } else if byte >= 194 && byte <= 223 {
    self.utf8_remaining = 1
    self.utf8_value = byte - 192
    self.utf8_minimum = 128
    self.utf8_span = span
  } else if byte >= 224 && byte <= 239 {
    self.utf8_remaining = 2
    self.utf8_value = byte - 224
    self.utf8_minimum = 2048
    self.utf8_span = span
  } else if byte >= 240 && byte <= 244 {
    self.utf8_remaining = 3
    self.utf8_value = byte - 240
    self.utf8_minimum = 65536
    self.utf8_span = span
  } else {
    self.report("invalid_utf8", Error, "Invalid UTF-8 leading byte", span)
    self.append_scalar(0xFFFD, span)
  }
}