use crate::seqstring::{global_bytes, global_string};
use crate::stack::{Stack, pop, push};
use crate::value::Value;
#[unsafe(no_mangle)]
pub unsafe extern "C" fn patch_seq_string_trim(stack: Stack) -> Stack {
assert!(!stack.is_null(), "string_trim: stack is empty");
let (stack, str_val) = unsafe { pop(stack) };
match str_val {
Value::String(s) => {
let trimmed = s.as_str_or_empty().trim();
unsafe { push(stack, Value::String(global_string(trimmed.to_owned()))) }
}
_ => panic!("string_trim: expected String on stack"),
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn patch_seq_string_to_upper(stack: Stack) -> Stack {
assert!(!stack.is_null(), "string_to_upper: stack is empty");
let (stack, str_val) = unsafe { pop(stack) };
match str_val {
Value::String(s) => {
let upper = s.as_str_or_empty().to_uppercase();
unsafe { push(stack, Value::String(global_string(upper))) }
}
_ => panic!("string_to_upper: expected String on stack"),
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn patch_seq_string_to_lower(stack: Stack) -> Stack {
assert!(!stack.is_null(), "string_to_lower: stack is empty");
let (stack, str_val) = unsafe { pop(stack) };
match str_val {
Value::String(s) => {
let lower = s.as_str_or_empty().to_lowercase();
unsafe { push(stack, Value::String(global_string(lower))) }
}
_ => panic!("string_to_lower: expected String on stack"),
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn patch_seq_string_chomp(stack: Stack) -> Stack {
assert!(!stack.is_null(), "string_chomp: stack is empty");
let (stack, str_val) = unsafe { pop(stack) };
match str_val {
Value::String(s) => {
let mut bytes = s.as_bytes().to_vec();
if bytes.last() == Some(&b'\n') {
bytes.pop();
if bytes.last() == Some(&b'\r') {
bytes.pop();
}
}
unsafe { push(stack, Value::String(global_bytes(bytes))) }
}
_ => panic!("string_chomp: expected String on stack"),
}
}