bscore_lib/
lib.rs

1#![doc(html_root_url = "https://docs.rs/bscore-lib/1.2.1")]
2//! bscore-lib bowling score library for C (written in Rust)
3//!
4
5// #![crate_type = "cdylib"]
6
7use std::slice;
8
9use bscore::bgame::getscore;
10
11/// bscore_s
12/// - src: char *
13/// - len: size_t of src string length
14/// - mode: bool
15/// - dst: char *
16/// - size: size_t of dst buffer length
17#[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/// test with [-- --nocapture] or [-- --show-output]
43#[cfg(test)]
44mod tests {
45  use bscore::bgame::bscore;
46
47  /// test score
48  #[test]
49  fn test_score() {
50    assert_eq!(bscore("xxxxxxxxxxxx", false).unwrap(), [300]);
51  }
52}