support input strings longer than u16::MAX chars
This commit is contained in:
parent
b4968938d4
commit
7db27d0c2b
35
src/main.rs
35
src/main.rs
|
@ -13,7 +13,40 @@ fn main() {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn string_with_fromcodepoint(s: &str) -> String {
|
fn string_with_fromcodepoint(mut s: &str) -> String {
|
||||||
|
const ARG_LIMIT: usize = u16::MAX as usize - 3000; // without this 3000, it sometimes throws a call stack overflow error
|
||||||
|
|
||||||
|
if s.is_empty() {
|
||||||
|
return "[]+[]".to_owned();
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut out = String::new();
|
||||||
|
loop {
|
||||||
|
if s.is_empty() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
let split_point = if s.len() < ARG_LIMIT {
|
||||||
|
s.len()
|
||||||
|
} else {
|
||||||
|
let mut i = ARG_LIMIT;
|
||||||
|
loop {
|
||||||
|
if s.is_char_boundary(i) {
|
||||||
|
break i;
|
||||||
|
}
|
||||||
|
i -= 1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
out.push_str(&short_string_with_fromcodepoint(&s[..split_point]));
|
||||||
|
out.push('+');
|
||||||
|
s = &s[split_point..];
|
||||||
|
}
|
||||||
|
out.pop(); // remove the last `+`
|
||||||
|
out
|
||||||
|
}
|
||||||
|
|
||||||
|
fn short_string_with_fromcodepoint(s: &str) -> String {
|
||||||
let mut out = String::new();
|
let mut out = String::new();
|
||||||
out.push_str(&function_constructor());
|
out.push_str(&function_constructor());
|
||||||
out.push('(');
|
out.push('(');
|
||||||
|
|
Loading…
Reference in a new issue