1#![doc(html_root_url = "https://docs.rs/bscore-lib/1.2.1")]
2use std::slice;
8
9use bscore::bgame::getscore;
10
11#[no_mangle]
18pub extern "C" fn bscore_s(src: *const u8, len: usize, mode: bool,
19 dst: *mut u8, size: *mut usize) -> i32 {
20 let sz = unsafe { slice::from_raw_parts_mut(size, 1) };
21 if dst != 0 as *mut u8 {
22 let d = unsafe { slice::from_raw_parts_mut(dst, sz[0]) };
23 if sz[0] > 0 { d[0] = 0u8; }
24 }
25 let s = unsafe { slice::from_raw_parts(src, len).to_vec() };
26 let s = String::from_utf8(s).expect("src should be utf8");
27 let mut scores = getscore(s.as_str(), mode).expect("score sequence");
28 let o = scores.f(true).to_string();
29 if dst == 0 as *mut u8 {
30 sz[0] = o.len() + 1;
31 return 0;
32 }
33 if o.len() > sz[0] - 1 { return -1; }
34 if dst != 0 as *mut u8 {
35 let d = unsafe { slice::from_raw_parts_mut(dst, sz[0]) };
36 for (i, c) in o.chars().enumerate() { d[i] = c as u8; }
37 d[o.len()] = 0u8;
38 }
39 0
40}
41
42#[cfg(test)]
44mod tests {
45 use bscore::bgame::bscore;
46
47 #[test]
49 fn test_score() {
50 assert_eq!(bscore("xxxxxxxxxxxx", false).unwrap(), [300]);
51 }
52}