astrors-fork 0.1.10

(FORK) Astronomical package to deal with FITS (compressed also) and WCS, still in development.
Documentation
pub mod bintable;

pub mod bintablehdu;
pub mod buffer;

pub mod utils;

extern crate regex;
use regex::Regex;

pub fn get_first_letter(string : &str) -> &str {
    let re = Regex::new(r"[A-Z]").unwrap();
    if let Some(cap) = re.find(string) {
        return &string[cap.range()];
    }
    ""
}

pub fn get_data_bytes_size(string : &str) -> usize {
    let re = Regex::new(r"^(\d*)?").unwrap();
    let size = if let Some(cap) = re.find(string) {
        let number = &string[cap.range()];
        if number.is_empty() {
            1
        } else {
            number.parse::<usize>().unwrap()
        }
    }else{
        1
    };

    size * byte_value_from_str(string)
}

pub fn byte_value_from_str(data_type : &str) -> usize {
    match get_first_letter(data_type) {
        "L" => 1,
        "X" => 1,
        "B" => 1,
        "I" => 2,
        "J" => 4,
        "K" => 8,
        "A" => 1,
        "E" => 4,
        "D" => 8,
        "C" => 8,
        "M" => 16,
        "P" => 8,
        "Q" => 16,
        _ => panic!("Wrong data type"),
    }
}

pub fn split_buffer(buffer_size: usize, n: u16, row_size: u16) -> Vec<(usize, usize)> {
    let mut limits = Vec::new();
    let mut start: usize = 0;
    let mut end: usize;

    let nbufs = buffer_size / n as usize;
    for i in 0..n {
        if n - 1 == i {
            end = buffer_size;
        } else {
            if (start + nbufs) % row_size as usize != 0 {
                end = start + nbufs + row_size as usize - (start + nbufs) % row_size as usize;
            } else {
                end = start + nbufs;
            }
        }
        limits.push((start, end));
        start = end;
    }
    limits
}