use super::*;
use f2rust_std::*;
pub const LBCELL: i32 = -5;
pub const NPGRPH: i32 = 20;
pub const AVESIZ: i32 = 20;
pub const LNSIZE: i32 = 132;
const PBEG: i32 = 1;
const PNXT: i32 = 2;
const MAXLIN: i32 = (AVESIZ * NPGRPH);
struct SaveVars {
LINES: ActualCharArray,
BEGEND: StackArray2D<i32, 40>,
BUFFRD: i32,
CURRNT: i32,
N: i32,
RANGE: i32,
BACKUP: i32,
BSIZE: i32,
GETAT: i32,
GOTTEN: i32,
LAST: i32,
PUTAT: i32,
QUIT: i32,
START: i32,
FIRST: bool,
}
impl SaveInit for SaveVars {
fn new() -> Self {
let mut LINES = ActualCharArray::new(LNSIZE, 1..=MAXLIN);
let mut BEGEND = StackArray2D::<i32, 40>::new(1..=2, 1..=NPGRPH);
let mut BUFFRD: i32 = 0;
let mut CURRNT: i32 = 0;
let mut N: i32 = 0;
let mut RANGE: i32 = 0;
let mut BACKUP: i32 = 0;
let mut BSIZE: i32 = 0;
let mut GETAT: i32 = 0;
let mut GOTTEN: i32 = 0;
let mut LAST: i32 = 0;
let mut PUTAT: i32 = 0;
let mut QUIT: i32 = 0;
let mut START: i32 = 0;
let mut FIRST: bool = false;
BUFFRD = 0;
CURRNT = 1;
FIRST = true;
Self {
LINES,
BEGEND,
BUFFRD,
CURRNT,
N,
RANGE,
BACKUP,
BSIZE,
GETAT,
GOTTEN,
LAST,
PUTAT,
QUIT,
START,
FIRST,
}
}
}
fn PREV(N: i32, RANGE: i32) -> i32 {
((N - 1) + ((((RANGE - N) + 1) / RANGE) * RANGE))
}
fn NEXT(N: i32, RANGE: i32) -> i32 {
((N + 1) - ((N / RANGE) * RANGE))
}
pub fn PSTACK(DEPTH: i32, LINE: &[u8], BUFFER: CharArray) {
}
pub fn RSTBUF(ctx: &mut Context) {
let save = ctx.get_vars::<SaveVars>();
let save = &mut *save.borrow_mut();
if save.FIRST {
save.FIRST = false;
save.CURRNT = 1;
save.BUFFRD = 1;
save.BEGEND[[PBEG, save.CURRNT]] = 1;
save.BEGEND[[PNXT, save.CURRNT]] = 1;
for I in 1..=MAXLIN {
fstr::assign(save.LINES.get_mut(I), b" ");
}
} else {
save.BUFFRD = intrinsics::MIN0(&[(save.BUFFRD + 1), NPGRPH]);
save.LAST = save.CURRNT;
save.RANGE = NPGRPH;
save.CURRNT = NEXT(save.CURRNT, save.RANGE);
save.RANGE = MAXLIN;
save.BEGEND[[PBEG, save.CURRNT]] = NEXT(save.BEGEND[[PNXT, save.LAST]], save.RANGE);
save.BEGEND[[PNXT, save.CURRNT]] = save.BEGEND[[PBEG, save.CURRNT]];
}
}
pub fn PUTBUF(LINE: &[u8], ctx: &mut Context) {
let save = ctx.get_vars::<SaveVars>();
let save = &mut *save.borrow_mut();
if save.FIRST {
save.FIRST = false;
save.CURRNT = 1;
save.BUFFRD = 1;
save.BEGEND[[PBEG, save.CURRNT]] = 1;
save.BEGEND[[PNXT, save.CURRNT]] = 1;
for I in 1..=MAXLIN {
fstr::assign(save.LINES.get_mut(I), b" ");
}
}
save.RANGE = MAXLIN;
save.PUTAT = save.BEGEND[[PNXT, save.CURRNT]];
fstr::assign(save.LINES.get_mut(save.PUTAT), LINE);
save.BEGEND[[PNXT, save.CURRNT]] = NEXT(save.PUTAT, save.RANGE);
}
pub fn GETBUF(DEPTH: i32, BUFFER: CharArrayMut, ctx: &mut Context) -> f2rust_std::Result<()> {
let save = ctx.get_vars::<SaveVars>();
let save = &mut *save.borrow_mut();
let mut BUFFER = DummyCharArrayMut::new(BUFFER, None, LBCELL..);
save.BSIZE = spicelib::SIZEC(BUFFER.as_arg(), ctx)?;
spicelib::SSIZEC(save.BSIZE, BUFFER.as_arg_mut(), ctx)?;
save.BACKUP = intrinsics::MIN0(&[(DEPTH - 1), (save.BUFFRD - 1)]);
if (save.BACKUP < 0) {
return Ok(());
}
save.GETAT = save.CURRNT;
save.RANGE = NPGRPH;
for I in 1..=save.BACKUP {
save.GETAT = PREV(save.GETAT, save.RANGE);
}
save.START = save.BEGEND[[PBEG, save.GETAT]];
save.QUIT = save.BEGEND[[PNXT, save.GETAT]];
save.GOTTEN = 0;
save.RANGE = MAXLIN;
while ((save.START != save.QUIT) && (save.GOTTEN <= save.BSIZE)) {
save.GOTTEN = (save.GOTTEN + 1);
fstr::assign(BUFFER.get_mut(save.GOTTEN), save.LINES.get(save.START));
save.START = NEXT(save.START, save.RANGE);
}
spicelib::SCARDC(save.GOTTEN, BUFFER.as_arg_mut(), ctx)?;
Ok(())
}
pub fn GETBSZ(DEPTH: &mut i32, ctx: &mut Context) {
let save = ctx.get_vars::<SaveVars>();
let save = &mut *save.borrow_mut();
*DEPTH = save.BUFFRD;
}
pub fn DMPBUF(ctx: &mut Context) {
let save = ctx.get_vars::<SaveVars>();
let save = &mut *save.borrow_mut();
save.BUFFRD = intrinsics::MAX0(&[(save.BUFFRD - 1), 0]);
save.RANGE = NPGRPH;
save.CURRNT = PREV(save.CURRNT, save.RANGE);
}