tectonic_engine_bibtex 0.2.0

The `bibtex` program as a reusable crate.
Documentation
use crate::c_api::{cite::with_cites, xbuf::XBuf, ASCIICode};
use std::cell::RefCell;

pub const ENT_STR_SIZE: usize = 250;

pub struct EntryData {
    num_entry_ints: usize,
    num_entry_strs: usize,
    sort_key_num: usize,
    entry_ints: Option<XBuf<i32>>,
    entry_strs: Option<XBuf<ASCIICode>>,
}

impl EntryData {
    fn new() -> EntryData {
        EntryData {
            num_entry_ints: 0,
            num_entry_strs: 0,
            sort_key_num: 0,
            entry_ints: None,
            entry_strs: None,
        }
    }

    pub fn strs(&self, pos: usize) -> ASCIICode {
        self.entry_strs.as_ref().unwrap()[pos]
    }

    pub fn num_ent_strs(&self) -> usize {
        self.num_entry_strs
    }

    pub fn set_num_ent_strs(&mut self, val: usize) {
        self.num_entry_strs = val;
    }

    pub fn sort_key_num(&self) -> usize {
        self.sort_key_num
    }

    pub fn set_sort_key_num(&mut self, val: usize) {
        self.sort_key_num = val;
    }
}

thread_local! {
    pub static ENTRIES: RefCell<EntryData> = RefCell::new(EntryData::new());
}

pub fn reset() {
    ENTRIES.with(|entries| *entries.borrow_mut() = EntryData::new());
}

pub fn with_entries<T>(f: impl FnOnce(&EntryData) -> T) -> T {
    ENTRIES.with(|entries| f(&entries.borrow()))
}

pub fn with_entries_mut<T>(f: impl FnOnce(&mut EntryData) -> T) -> T {
    ENTRIES.with(|entries| f(&mut entries.borrow_mut()))
}

#[no_mangle]
pub extern "C" fn init_entry_ints() {
    with_entries_mut(|entries| {
        let num_cites = with_cites(|cites| cites.num_cites());
        entries.entry_ints = Some(XBuf::new((entries.num_entry_ints + 1) * (num_cites + 1)));
    })
}

#[no_mangle]
pub extern "C" fn init_entry_strs() {
    with_entries_mut(|entries| {
        let num_cites = with_cites(|cites| cites.num_cites());
        let mut new_buf =
            XBuf::new((entries.num_entry_strs + 1) * (num_cites + 1) * (ENT_STR_SIZE + 1));
        new_buf.fill(127);
        entries.entry_strs = Some(new_buf);
    })
}

#[no_mangle]
pub extern "C" fn num_ent_ints() -> usize {
    with_entries(|entries| entries.num_entry_ints)
}

#[no_mangle]
pub extern "C" fn set_num_ent_ints(val: usize) {
    with_entries_mut(|entries| entries.num_entry_ints = val)
}

#[no_mangle]
pub extern "C" fn num_ent_strs() -> usize {
    with_entries(|entries| entries.num_entry_strs)
}

#[no_mangle]
pub extern "C" fn set_num_ent_strs(val: usize) {
    with_entries_mut(|entries| entries.num_entry_strs = val)
}

#[no_mangle]
pub extern "C" fn entry_ints(pos: i32) -> i32 {
    with_entries(|entries| entries.entry_ints.as_ref().unwrap()[pos as usize])
}

#[no_mangle]
pub extern "C" fn set_entry_ints(pos: i32, val: i32) {
    with_entries_mut(|entries| entries.entry_ints.as_mut().unwrap()[pos as usize] = val)
}

#[no_mangle]
pub extern "C" fn entry_strs(pos: i32) -> ASCIICode {
    with_entries(|entries| entries.entry_strs.as_ref().unwrap()[pos as usize])
}

#[no_mangle]
pub extern "C" fn set_entry_strs(pos: i32, val: ASCIICode) {
    with_entries_mut(|entries| entries.entry_strs.as_mut().unwrap()[pos as usize] = val)
}