seq_runtime/string_ops/
basic.rs1use crate::seqstring::global_string;
4use crate::stack::{Stack, pop, push};
5use crate::value::Value;
6
7#[unsafe(no_mangle)]
10pub unsafe extern "C" fn patch_seq_string_empty(stack: Stack) -> Stack {
11 assert!(!stack.is_null(), "string_empty: stack is empty");
12
13 let (stack, value) = unsafe { pop(stack) };
14
15 match value {
16 Value::String(s) => {
17 let is_empty = s.as_str().is_empty();
18 unsafe { push(stack, Value::Bool(is_empty)) }
19 }
20 _ => panic!("string_empty: expected String on stack"),
21 }
22}
23
24#[unsafe(no_mangle)]
31pub unsafe extern "C" fn patch_seq_string_concat(stack: Stack) -> Stack {
32 assert!(!stack.is_null(), "string_concat: stack is empty");
33
34 let (stack, str2_val) = unsafe { pop(stack) };
35 assert!(!stack.is_null(), "string_concat: need two strings");
36 let (stack, str1_val) = unsafe { pop(stack) };
37
38 match (str1_val, str2_val) {
39 (Value::String(s1), Value::String(s2)) => {
40 let result = format!("{}{}", s1.as_str(), s2.as_str());
41 unsafe { push(stack, Value::String(global_string(result))) }
42 }
43 _ => panic!("string_concat: expected two strings on stack"),
44 }
45}
46
47#[unsafe(no_mangle)]
57pub unsafe extern "C" fn patch_seq_string_length(stack: Stack) -> Stack {
58 assert!(!stack.is_null(), "string_length: stack is empty");
59
60 let (stack, str_val) = unsafe { pop(stack) };
61
62 match str_val {
63 Value::String(s) => {
64 let len = s.as_str().chars().count() as i64;
65 unsafe { push(stack, Value::Int(len)) }
66 }
67 _ => panic!("string_length: expected String on stack"),
68 }
69}
70
71#[unsafe(no_mangle)]
80pub unsafe extern "C" fn patch_seq_string_byte_length(stack: Stack) -> Stack {
81 assert!(!stack.is_null(), "string_byte_length: stack is empty");
82
83 let (stack, str_val) = unsafe { pop(stack) };
84
85 match str_val {
86 Value::String(s) => {
87 let len = s.as_str().len() as i64;
88 unsafe { push(stack, Value::Int(len)) }
89 }
90 _ => panic!("string_byte_length: expected String on stack"),
91 }
92}
93
94#[unsafe(no_mangle)]
104pub unsafe extern "C" fn patch_seq_string_equal(stack: Stack) -> Stack {
105 assert!(!stack.is_null(), "string_equal: stack is empty");
106
107 let (stack, str2_val) = unsafe { pop(stack) };
108 assert!(!stack.is_null(), "string_equal: need two strings");
109 let (stack, str1_val) = unsafe { pop(stack) };
110
111 match (str1_val, str2_val) {
112 (Value::String(s1), Value::String(s2)) => {
113 let equal = s1.as_str() == s2.as_str();
114 unsafe { push(stack, Value::Bool(equal)) }
115 }
116 _ => panic!("string_equal: expected two strings on stack"),
117 }
118}