Skip to main content

astrors_fork/io/hdus/bintable/
mod.rs

1pub mod bintable;
2
3pub mod bintablehdu;
4pub mod buffer;
5
6pub mod utils;
7
8extern crate regex;
9use regex::Regex;
10
11pub fn get_first_letter(string : &str) -> &str {
12    let re = Regex::new(r"[A-Z]").unwrap();
13    if let Some(cap) = re.find(string) {
14        return &string[cap.range()];
15    }
16    ""
17}
18
19pub fn get_data_bytes_size(string : &str) -> usize {
20    let re = Regex::new(r"^(\d*)?").unwrap();
21    let size = if let Some(cap) = re.find(string) {
22        let number = &string[cap.range()];
23        if number.is_empty() {
24            1
25        } else {
26            number.parse::<usize>().unwrap()
27        }
28    }else{
29        1
30    };
31
32    size * byte_value_from_str(string)
33}
34
35pub fn byte_value_from_str(data_type : &str) -> usize {
36    match get_first_letter(data_type) {
37        "L" => 1,
38        "X" => 1,
39        "B" => 1,
40        "I" => 2,
41        "J" => 4,
42        "K" => 8,
43        "A" => 1,
44        "E" => 4,
45        "D" => 8,
46        "C" => 8,
47        "M" => 16,
48        "P" => 8,
49        "Q" => 16,
50        _ => panic!("Wrong data type"),
51    }
52}
53
54pub fn split_buffer(buffer_size: usize, n: u16, row_size: u16) -> Vec<(usize, usize)> {
55    let mut limits = Vec::new();
56    let mut start: usize = 0;
57    let mut end: usize;
58
59    let nbufs = buffer_size / n as usize;
60    for i in 0..n {
61        if n - 1 == i {
62            end = buffer_size;
63        } else {
64            if (start + nbufs) % row_size as usize != 0 {
65                end = start + nbufs + row_size as usize - (start + nbufs) % row_size as usize;
66            } else {
67                end = start + nbufs;
68            }
69        }
70        limits.push((start, end));
71        start = end;
72    }
73    limits
74}
75