All Downloads are FREE. Search and download functionalities are using the official Maven repository.

locales.NormalizerImpl.scala Maven / Gradle / Ivy

package java.text

import java.nio.CharBuffer
import java.nio.charset.Charset
import scala.scalanative.libc.stdlib
import scala.scalanative.unsafe._

import Normalizer._

private object NormalizerImpl {

  def normalize(src: CharSequence, form: Form): String =
    if (src == null || form == null)
      throw new NullPointerException
    else
      Zone { implicit z =>
        import Form._
        import utf8proc._

        val cstr = form match {
          case NFC  => utf8proc_NFC(charSeqToCString(src))
          case NFD  => utf8proc_NFD(charSeqToCString(src))
          case NFKC => utf8proc_NFKC(charSeqToCString(src))
          case NFKD => utf8proc_NFKD(charSeqToCString(src))
        }

        val normalized = fromCString(cstr) // TODO can be further optimized
        stdlib.free(cstr)
        normalized
      }

  private def charSeqToCString(cs: CharSequence)(implicit z: Zone): CString = cs match {
    case str: String => toCString(str)
    case str         =>
      import scalanative.unsigned._

      val encoder = Charset.defaultCharset().newEncoder()
      val cb      = CharBuffer.wrap(str)
      val bb      = encoder.encode(cb)

      val n    = bb.limit()
      val cstr = z.alloc((n + 1).toULong)

      var i = 0
      while (i < n) {
        !(cstr + i.toLong) = bb.get(i)
        i += 1
      }
      !(cstr + i.toLong) = 0.toByte

      cstr
  }

}

@link("utf8proc")
@extern
private object utf8proc {
  def utf8proc_NFD(str:  CString): CString = extern
  def utf8proc_NFC(str:  CString): CString = extern
  def utf8proc_NFKD(str: CString): CString = extern
  def utf8proc_NFKC(str: CString): CString = extern
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy