#[repr(C)]
struct FfiResult {
error: i32,
count: usize,
}
unsafe extern "C" {
fn simdutf__validate_utf8(buf: *const u8, len: usize) -> bool;
fn simdutf__validate_utf8_with_errors(
buf: *const u8,
len: usize,
) -> FfiResult;
fn simdutf__validate_ascii(buf: *const u8, len: usize) -> bool;
fn simdutf__validate_ascii_with_errors(
buf: *const u8,
len: usize,
) -> FfiResult;
fn simdutf__validate_utf16le(buf: *const u16, len: usize) -> bool;
fn simdutf__validate_utf16le_with_errors(
buf: *const u16,
len: usize,
) -> FfiResult;
fn simdutf__validate_utf16be(buf: *const u16, len: usize) -> bool;
fn simdutf__validate_utf16be_with_errors(
buf: *const u16,
len: usize,
) -> FfiResult;
fn simdutf__validate_utf32(buf: *const u32, len: usize) -> bool;
fn simdutf__validate_utf32_with_errors(
buf: *const u32,
len: usize,
) -> FfiResult;
fn simdutf__convert_utf8_to_utf16le(
input: *const u8,
length: usize,
output: *mut u16,
) -> usize;
fn simdutf__convert_utf8_to_utf16le_with_errors(
input: *const u8,
length: usize,
output: *mut u16,
) -> FfiResult;
fn simdutf__convert_valid_utf8_to_utf16le(
input: *const u8,
length: usize,
output: *mut u16,
) -> usize;
fn simdutf__convert_utf16le_to_utf8(
input: *const u16,
length: usize,
output: *mut u8,
) -> usize;
fn simdutf__convert_utf16le_to_utf8_with_errors(
input: *const u16,
length: usize,
output: *mut u8,
) -> FfiResult;
fn simdutf__convert_valid_utf16le_to_utf8(
input: *const u16,
length: usize,
output: *mut u8,
) -> usize;
fn simdutf__convert_utf8_to_utf16be(
input: *const u8,
length: usize,
output: *mut u16,
) -> usize;
fn simdutf__convert_utf16be_to_utf8(
input: *const u16,
length: usize,
output: *mut u8,
) -> usize;
fn simdutf__convert_utf8_to_latin1(
input: *const u8,
length: usize,
output: *mut u8,
) -> usize;
fn simdutf__convert_utf8_to_latin1_with_errors(
input: *const u8,
length: usize,
output: *mut u8,
) -> FfiResult;
fn simdutf__convert_valid_utf8_to_latin1(
input: *const u8,
length: usize,
output: *mut u8,
) -> usize;
fn simdutf__convert_latin1_to_utf8(
input: *const u8,
length: usize,
output: *mut u8,
) -> usize;
fn simdutf__convert_latin1_to_utf16le(
input: *const u8,
length: usize,
output: *mut u16,
) -> usize;
fn simdutf__convert_utf16le_to_latin1(
input: *const u16,
length: usize,
output: *mut u8,
) -> usize;
fn simdutf__convert_utf8_to_utf32(
input: *const u8,
length: usize,
output: *mut u32,
) -> usize;
fn simdutf__convert_utf32_to_utf8(
input: *const u32,
length: usize,
output: *mut u8,
) -> usize;
fn simdutf__utf8_length_from_utf16le(
input: *const u16,
length: usize,
) -> usize;
fn simdutf__utf8_length_from_utf16be(
input: *const u16,
length: usize,
) -> usize;
fn simdutf__utf16_length_from_utf8(input: *const u8, length: usize) -> usize;
fn simdutf__utf8_length_from_latin1(input: *const u8, length: usize)
-> usize;
fn simdutf__latin1_length_from_utf8(input: *const u8, length: usize)
-> usize;
fn simdutf__utf32_length_from_utf8(input: *const u8, length: usize) -> usize;
fn simdutf__utf8_length_from_utf32(input: *const u32, length: usize)
-> usize;
fn simdutf__utf16_length_from_utf32(
input: *const u32,
length: usize,
) -> usize;
fn simdutf__utf32_length_from_utf16le(
input: *const u16,
length: usize,
) -> usize;
fn simdutf__count_utf8(input: *const u8, length: usize) -> usize;
fn simdutf__count_utf16le(input: *const u16, length: usize) -> usize;
fn simdutf__count_utf16be(input: *const u16, length: usize) -> usize;
fn simdutf__detect_encodings(input: *const u8, length: usize) -> i32;
fn simdutf__maximal_binary_length_from_base64(
input: *const u8,
length: usize,
) -> usize;
fn simdutf__base64_to_binary(
input: *const u8,
length: usize,
output: *mut u8,
options: u64,
last_chunk_options: u64,
) -> FfiResult;
fn simdutf__base64_length_from_binary(length: usize, options: u64) -> usize;
fn simdutf__binary_to_base64(
input: *const u8,
length: usize,
output: *mut u8,
options: u64,
) -> usize;
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(i32)]
pub enum ErrorCode {
Success = 0,
HeaderBits = 1,
TooShort = 2,
TooLong = 3,
Overlong = 4,
TooLarge = 5,
Surrogate = 6,
InvalidBase64Character = 7,
Base64InputRemainder = 8,
Base64ExtraBits = 9,
OutputBufferTooSmall = 10,
Other = 11,
}
impl ErrorCode {
fn from_i32(v: i32) -> Self {
match v {
0 => Self::Success,
1 => Self::HeaderBits,
2 => Self::TooShort,
3 => Self::TooLong,
4 => Self::Overlong,
5 => Self::TooLarge,
6 => Self::Surrogate,
7 => Self::InvalidBase64Character,
8 => Self::Base64InputRemainder,
9 => Self::Base64ExtraBits,
10 => Self::OutputBufferTooSmall,
_ => Self::Other,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct SimdUtfResult {
pub error: ErrorCode,
pub count: usize,
}
impl SimdUtfResult {
fn from_ffi(r: FfiResult) -> Self {
Self {
error: ErrorCode::from_i32(r.error),
count: r.count,
}
}
#[inline]
pub fn is_ok(&self) -> bool {
self.error == ErrorCode::Success
}
}
pub mod encoding {
pub const UTF8: i32 = 1;
pub const UTF16_LE: i32 = 2;
pub const UTF16_BE: i32 = 4;
pub const UTF32_LE: i32 = 8;
pub const UTF32_BE: i32 = 16;
pub const LATIN1: i32 = 32;
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u64)]
pub enum Base64Options {
Default = 0,
Url = 1,
DefaultNoPadding = 2,
UrlWithPadding = 3,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u64)]
pub enum LastChunkHandling {
Loose = 0,
Strict = 1,
StopBeforePartial = 2,
OnlyFullChunks = 3,
}
#[inline]
pub fn validate_utf8(input: &[u8]) -> bool {
unsafe { simdutf__validate_utf8(input.as_ptr(), input.len()) }
}
#[inline]
pub fn validate_utf8_with_errors(input: &[u8]) -> SimdUtfResult {
SimdUtfResult::from_ffi(unsafe {
simdutf__validate_utf8_with_errors(input.as_ptr(), input.len())
})
}
#[inline]
pub fn validate_ascii(input: &[u8]) -> bool {
unsafe { simdutf__validate_ascii(input.as_ptr(), input.len()) }
}
#[inline]
pub fn validate_ascii_with_errors(input: &[u8]) -> SimdUtfResult {
SimdUtfResult::from_ffi(unsafe {
simdutf__validate_ascii_with_errors(input.as_ptr(), input.len())
})
}
#[inline]
pub fn validate_utf16le(input: &[u16]) -> bool {
unsafe { simdutf__validate_utf16le(input.as_ptr(), input.len()) }
}
#[inline]
pub fn validate_utf16le_with_errors(input: &[u16]) -> SimdUtfResult {
SimdUtfResult::from_ffi(unsafe {
simdutf__validate_utf16le_with_errors(input.as_ptr(), input.len())
})
}
#[inline]
pub fn validate_utf16be(input: &[u16]) -> bool {
unsafe { simdutf__validate_utf16be(input.as_ptr(), input.len()) }
}
#[inline]
pub fn validate_utf16be_with_errors(input: &[u16]) -> SimdUtfResult {
SimdUtfResult::from_ffi(unsafe {
simdutf__validate_utf16be_with_errors(input.as_ptr(), input.len())
})
}
#[inline]
pub fn validate_utf32(input: &[u32]) -> bool {
unsafe { simdutf__validate_utf32(input.as_ptr(), input.len()) }
}
#[inline]
pub fn validate_utf32_with_errors(input: &[u32]) -> SimdUtfResult {
SimdUtfResult::from_ffi(unsafe {
simdutf__validate_utf32_with_errors(input.as_ptr(), input.len())
})
}
#[inline]
pub unsafe fn convert_utf8_to_utf16le(
input: &[u8],
output: &mut [u16],
) -> usize {
unsafe {
simdutf__convert_utf8_to_utf16le(
input.as_ptr(),
input.len(),
output.as_mut_ptr(),
)
}
}
#[inline]
pub unsafe fn convert_utf8_to_utf16le_with_errors(
input: &[u8],
output: &mut [u16],
) -> SimdUtfResult {
SimdUtfResult::from_ffi(unsafe {
simdutf__convert_utf8_to_utf16le_with_errors(
input.as_ptr(),
input.len(),
output.as_mut_ptr(),
)
})
}
#[inline]
pub unsafe fn convert_valid_utf8_to_utf16le(
input: &[u8],
output: &mut [u16],
) -> usize {
unsafe {
simdutf__convert_valid_utf8_to_utf16le(
input.as_ptr(),
input.len(),
output.as_mut_ptr(),
)
}
}
#[inline]
pub unsafe fn convert_utf16le_to_utf8(
input: &[u16],
output: &mut [u8],
) -> usize {
unsafe {
simdutf__convert_utf16le_to_utf8(
input.as_ptr(),
input.len(),
output.as_mut_ptr(),
)
}
}
#[inline]
pub unsafe fn convert_utf16le_to_utf8_with_errors(
input: &[u16],
output: &mut [u8],
) -> SimdUtfResult {
SimdUtfResult::from_ffi(unsafe {
simdutf__convert_utf16le_to_utf8_with_errors(
input.as_ptr(),
input.len(),
output.as_mut_ptr(),
)
})
}
#[inline]
pub unsafe fn convert_valid_utf16le_to_utf8(
input: &[u16],
output: &mut [u8],
) -> usize {
unsafe {
simdutf__convert_valid_utf16le_to_utf8(
input.as_ptr(),
input.len(),
output.as_mut_ptr(),
)
}
}
#[inline]
pub unsafe fn convert_utf8_to_utf16be(
input: &[u8],
output: &mut [u16],
) -> usize {
unsafe {
simdutf__convert_utf8_to_utf16be(
input.as_ptr(),
input.len(),
output.as_mut_ptr(),
)
}
}
#[inline]
pub unsafe fn convert_utf16be_to_utf8(
input: &[u16],
output: &mut [u8],
) -> usize {
unsafe {
simdutf__convert_utf16be_to_utf8(
input.as_ptr(),
input.len(),
output.as_mut_ptr(),
)
}
}
#[inline]
pub unsafe fn convert_utf8_to_latin1(input: &[u8], output: &mut [u8]) -> usize {
unsafe {
simdutf__convert_utf8_to_latin1(
input.as_ptr(),
input.len(),
output.as_mut_ptr(),
)
}
}
#[inline]
pub unsafe fn convert_utf8_to_latin1_with_errors(
input: &[u8],
output: &mut [u8],
) -> SimdUtfResult {
SimdUtfResult::from_ffi(unsafe {
simdutf__convert_utf8_to_latin1_with_errors(
input.as_ptr(),
input.len(),
output.as_mut_ptr(),
)
})
}
#[inline]
pub unsafe fn convert_valid_utf8_to_latin1(
input: &[u8],
output: &mut [u8],
) -> usize {
unsafe {
simdutf__convert_valid_utf8_to_latin1(
input.as_ptr(),
input.len(),
output.as_mut_ptr(),
)
}
}
#[inline]
pub unsafe fn convert_latin1_to_utf8(input: &[u8], output: &mut [u8]) -> usize {
unsafe {
simdutf__convert_latin1_to_utf8(
input.as_ptr(),
input.len(),
output.as_mut_ptr(),
)
}
}
#[inline]
pub unsafe fn convert_latin1_to_utf16le(
input: &[u8],
output: &mut [u16],
) -> usize {
unsafe {
simdutf__convert_latin1_to_utf16le(
input.as_ptr(),
input.len(),
output.as_mut_ptr(),
)
}
}
#[inline]
pub unsafe fn convert_utf16le_to_latin1(
input: &[u16],
output: &mut [u8],
) -> usize {
unsafe {
simdutf__convert_utf16le_to_latin1(
input.as_ptr(),
input.len(),
output.as_mut_ptr(),
)
}
}
#[inline]
pub unsafe fn convert_utf8_to_utf32(input: &[u8], output: &mut [u32]) -> usize {
unsafe {
simdutf__convert_utf8_to_utf32(
input.as_ptr(),
input.len(),
output.as_mut_ptr(),
)
}
}
#[inline]
pub unsafe fn convert_utf32_to_utf8(input: &[u32], output: &mut [u8]) -> usize {
unsafe {
simdutf__convert_utf32_to_utf8(
input.as_ptr(),
input.len(),
output.as_mut_ptr(),
)
}
}
#[inline]
pub fn utf8_length_from_utf16le(input: &[u16]) -> usize {
unsafe { simdutf__utf8_length_from_utf16le(input.as_ptr(), input.len()) }
}
#[inline]
pub fn utf8_length_from_utf16be(input: &[u16]) -> usize {
unsafe { simdutf__utf8_length_from_utf16be(input.as_ptr(), input.len()) }
}
#[inline]
pub fn utf16_length_from_utf8(input: &[u8]) -> usize {
unsafe { simdutf__utf16_length_from_utf8(input.as_ptr(), input.len()) }
}
#[inline]
pub fn utf8_length_from_latin1(input: &[u8]) -> usize {
unsafe { simdutf__utf8_length_from_latin1(input.as_ptr(), input.len()) }
}
#[inline]
pub fn latin1_length_from_utf8(input: &[u8]) -> usize {
unsafe { simdutf__latin1_length_from_utf8(input.as_ptr(), input.len()) }
}
#[inline]
pub fn utf32_length_from_utf8(input: &[u8]) -> usize {
unsafe { simdutf__utf32_length_from_utf8(input.as_ptr(), input.len()) }
}
#[inline]
pub fn utf8_length_from_utf32(input: &[u32]) -> usize {
unsafe { simdutf__utf8_length_from_utf32(input.as_ptr(), input.len()) }
}
#[inline]
pub fn utf16_length_from_utf32(input: &[u32]) -> usize {
unsafe { simdutf__utf16_length_from_utf32(input.as_ptr(), input.len()) }
}
#[inline]
pub fn utf32_length_from_utf16le(input: &[u16]) -> usize {
unsafe { simdutf__utf32_length_from_utf16le(input.as_ptr(), input.len()) }
}
#[inline]
pub fn count_utf8(input: &[u8]) -> usize {
unsafe { simdutf__count_utf8(input.as_ptr(), input.len()) }
}
#[inline]
pub fn count_utf16le(input: &[u16]) -> usize {
unsafe { simdutf__count_utf16le(input.as_ptr(), input.len()) }
}
#[inline]
pub fn count_utf16be(input: &[u16]) -> usize {
unsafe { simdutf__count_utf16be(input.as_ptr(), input.len()) }
}
#[inline]
pub fn detect_encodings(input: &[u8]) -> i32 {
unsafe { simdutf__detect_encodings(input.as_ptr(), input.len()) }
}
#[inline]
pub fn maximal_binary_length_from_base64(input: &[u8]) -> usize {
unsafe {
simdutf__maximal_binary_length_from_base64(input.as_ptr(), input.len())
}
}
#[inline]
pub unsafe fn base64_to_binary(
input: &[u8],
output: &mut [u8],
options: Base64Options,
last_chunk: LastChunkHandling,
) -> SimdUtfResult {
SimdUtfResult::from_ffi(unsafe {
simdutf__base64_to_binary(
input.as_ptr(),
input.len(),
output.as_mut_ptr(),
options as u64,
last_chunk as u64,
)
})
}
#[inline]
pub fn base64_length_from_binary(
length: usize,
options: Base64Options,
) -> usize {
unsafe { simdutf__base64_length_from_binary(length, options as u64) }
}
#[inline]
pub unsafe fn binary_to_base64(
input: &[u8],
output: &mut [u8],
options: Base64Options,
) -> usize {
unsafe {
simdutf__binary_to_base64(
input.as_ptr(),
input.len(),
output.as_mut_ptr(),
options as u64,
)
}
}