astrors_fork/io/hdus/bintable/
mod.rs1pub 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