///|
pub let brotli_transform_identity : Int = 0
///|
pub let brotli_transform_omit_last_9 : Int = 9
///|
pub let brotli_transform_uppercase_first : Int = 10
///|
pub let brotli_transform_uppercase_all : Int = 11
///|
pub let brotli_transform_omit_first_1 : Int = 12
///|
pub let brotli_transform_omit_first_9 : Int = 20
///|
pub let brotli_transform_shift_first : Int = 21
///|
pub let brotli_transform_shift_all : Int = 22
///|
pub fn brotli_transform_count() -> Int {
brotli_transform_triplets.length() / 3
}
///|
pub fn brotli_transform_string_offset(id : Int) -> Int raise FbrError {
if id < 0 || id >= brotli_transform_prefix_suffix_map.length() {
raise fbr_err(
BrotliInvalidTransform,
msg="Brotli transform string id out of range",
)
}
let offset = brotli_transform_prefix_suffix_map[id]
if offset < 0 || offset >= brotli_transform_prefix_suffix.length() {
raise fbr_err(
BrotliInvalidTransform,
msg="Brotli transform string out of range",
)
}
offset
}
///|
pub fn brotli_transform_string_length(id : Int) -> Int raise FbrError {
brotli_transform_prefix_suffix[brotli_transform_string_offset(id)].to_int()
}
///|
pub fn brotli_ascii_upper(byte : Byte) -> Byte {
let value = byte.to_int()
if value >= 97 && value <= 122 {
(value - 32).to_byte()
} else {
byte
}
}
///|
pub fn brotli_uppercase_first(
buf : FixedArray[Byte],
offset : Int,
length : Int,
) -> Unit {
if length <= 0 {
return
}
let first = buf[offset].to_int()
if first < 0xc0 {
buf[offset] = brotli_ascii_upper(buf[offset])
} else if first < 0xe0 && length >= 2 {
buf[offset + 1] = (buf[offset + 1].to_int() ^ 32).to_byte()
} else if length >= 3 {
buf[offset + 2] = (buf[offset + 2].to_int() ^ 5).to_byte()
}
}
///|
pub fn brotli_uppercase_all(
buf : FixedArray[Byte],
offset : Int,
length : Int,
) -> Unit {
let mut index = offset
let end = offset + length
while index < end {
let first = buf[index].to_int()
let step = if first < 0xc0 {
buf[index] = brotli_ascii_upper(buf[index])
1
} else if first < 0xe0 {
if index + 1 < end {
buf[index + 1] = (buf[index + 1].to_int() ^ 32).to_byte()
}
2
} else {
if index + 2 < end {
buf[index + 2] = (buf[index + 2].to_int() ^ 5).to_byte()
}
3
}
index += step
}
}
///|