use super::*;
use f2rust_std::*;
const FTSIZE: i32 = 5000;
const RSVUNT: i32 = 2;
const SCRUNT: i32 = 1;
const UTSIZE: i32 = ((20 + SCRUNT) + RSVUNT);
const READ: i32 = 1;
const WRITE: i32 = 2;
const SCRTCH: i32 = 3;
const NEW: i32 = 4;
const NUMAMH: i32 = 4;
const BIGI3E: i32 = 1;
const LTLI3E: i32 = 2;
const VAXGFL: i32 = 3;
const VAXDFL: i32 = 4;
const NUMBFF: i32 = 4;
const STRSIZ: i32 = 8;
const STRLEN: i32 = ((STRSIZ + 1) * NUMBFF);
const DAF: i32 = 1;
const DAS: i32 = 2;
const NUMARC: i32 = 2;
const RECL: i32 = 1024;
const FILEN: i32 = 255;
const CBFSIZ: i32 = 1024;
pub fn F_DDHGTU(OK: &mut bool, ctx: &mut Context) -> f2rust_std::Result<()> {
let mut IOSTAT: i32 = 0;
let mut LUN: i32 = 0;
let mut UINDEX: i32 = 0;
let mut OPENED: bool = false;
let mut RESRVD: bool = false;
let mut NUT: i32 = 0;
let mut UTCST = StackArray::<i32, 23>::new(1..=UTSIZE);
let mut UTHAN = StackArray::<i32, 23>::new(1..=UTSIZE);
let mut UTLUN = StackArray::<i32, 23>::new(1..=UTSIZE);
let mut UTLCK = StackArray::<bool, 23>::new(1..=UTSIZE);
testutil::TOPEN(b"F_DDHGTU", ctx)?;
testutil::TCASE(b"Empty unit table insertion.", ctx)?;
UTCST[1] = 1;
UTHAN[1] = 1;
UTLCK[1] = true;
UTLUN[1] = 1;
NUT = 0;
UINDEX = -1;
spicelib::ZZDDHGTU(
UTCST.as_slice_mut(),
UTHAN.as_slice_mut(),
UTLCK.as_slice_mut(),
UTLUN.as_slice_mut(),
&mut NUT,
&mut UINDEX,
ctx,
)?;
testutil::CHCKXC(false, b" ", OK, ctx)?;
testutil::CHCKSI(b"UTCST(1)", UTCST[1], b"=", 0, 0, OK, ctx)?;
testutil::CHCKSI(b"UTHAN(1)", UTHAN[1], b"=", 0, 0, OK, ctx)?;
testutil::CHCKSL(b"UTLCK(1)", UTLCK[1], false, OK, ctx)?;
testutil::CHCKSI(b"UTLUN(1)", UTLUN[1], b">=", 0, 0, OK, ctx)?;
testutil::CHCKSI(b"NUT", NUT, b"=", 1, 0, OK, ctx)?;
testutil::CHCKSI(b"UINDEX", UINDEX, b"=", 1, 0, OK, ctx)?;
testutil::TCASE(b"Zero cost row exists in the unit table", ctx)?;
NUT = 10;
for I in 1..=10 {
UTCST[I] = (10 * I);
UTHAN[I] = I;
UTLCK[I] = false;
UTLUN[I] = I;
}
UTCST[5] = 0;
spicelib::GETLUN(&mut LUN, ctx)?;
spicelib::RESLUN(LUN, ctx);
UTLUN[5] = LUN;
UINDEX = -1;
spicelib::ZZDDHGTU(
UTCST.as_slice_mut(),
UTHAN.as_slice_mut(),
UTLCK.as_slice_mut(),
UTLUN.as_slice_mut(),
&mut NUT,
&mut UINDEX,
ctx,
)?;
testutil::CHCKXC(false, b" ", OK, ctx)?;
testutil::CHCKSI(b"UINDEX", UINDEX, b"=", 5, 0, OK, ctx)?;
testutil::CHCKSI(b"UTCST(UINDEX)", UTCST[UINDEX], b"=", 0, 0, OK, ctx)?;
testutil::CHCKSI(b"UTHAN(UINDEX)", UTHAN[UINDEX], b"=", 5, 0, OK, ctx)?;
testutil::CHCKSL(b"UTLCK(UINDEX)", UTLCK[UINDEX], false, OK, ctx)?;
testutil::CHCKSI(b"NUT", NUT, b"=", 10, 0, OK, ctx)?;
T_TSTRLN(LUN, &mut RESRVD, ctx)?;
testutil::CHCKXC(false, b" ", OK, ctx)?;
testutil::CHCKSL(b"RESRVD", RESRVD, false, OK, ctx)?;
spicelib::FRELUN(LUN, ctx);
testutil::TCASE(b"No zero cost rows, expand table case.", ctx)?;
NUT = 10;
for I in 1..=10 {
UTCST[I] = (10 * I);
UTHAN[I] = I;
UTLCK[I] = false;
UTLUN[I] = I;
}
UINDEX = -1;
UTCST[11] = -1;
UTHAN[11] = -1;
UTLCK[11] = true;
UTLUN[11] = -1;
spicelib::ZZDDHGTU(
UTCST.as_slice_mut(),
UTHAN.as_slice_mut(),
UTLCK.as_slice_mut(),
UTLUN.as_slice_mut(),
&mut NUT,
&mut UINDEX,
ctx,
)?;
testutil::CHCKXC(false, b" ", OK, ctx)?;
testutil::CHCKSI(b"UINDEX", UINDEX, b"=", 11, 0, OK, ctx)?;
testutil::CHCKSI(b"UTCST(UINDEX)", UTCST[UINDEX], b"=", 0, 0, OK, ctx)?;
testutil::CHCKSI(b"UTHAN(UINDEX)", UTHAN[UINDEX], b"=", 0, 0, OK, ctx)?;
testutil::CHCKSL(b"UTLCK(UINDEX)", UTLCK[UINDEX], false, OK, ctx)?;
testutil::CHCKSI(b"UTLUN(UINDEX)", UTLUN[UINDEX], b">=", 0, 0, OK, ctx)?;
testutil::CHCKSI(b"NUT", NUT, b"=", 11, 0, OK, ctx)?;
testutil::TCASE(b"Full table, no zero-cost rows.", ctx)?;
NUT = UTSIZE;
for I in 1..=UTSIZE {
UTCST[I] = (10 * I);
UTHAN[I] = I;
UTLCK[I] = false;
UTLUN[I] = I;
}
UINDEX = -1;
UTLCK[1] = true;
UTLCK[2] = true;
UTLCK[3] = true;
spicelib::GETLUN(&mut LUN, ctx)?;
testutil::CHCKXC(false, b" ", OK, ctx)?;
UTLUN[4] = LUN;
{
use f2rust_std::io;
let specs = io::OpenSpecs {
unit: Some(LUN),
access: Some(b"DIRECT"),
recl: Some(RECL),
status: Some(b"SCRATCH"),
..Default::default()
};
IOSTAT = io::capture_iostat(|| ctx.open(specs))?;
}
testutil::CHCKSI(b"IOSTAT", IOSTAT, b"=", 0, 0, OK, ctx)?;
spicelib::ZZDDHGTU(
UTCST.as_slice_mut(),
UTHAN.as_slice_mut(),
UTLCK.as_slice_mut(),
UTLUN.as_slice_mut(),
&mut NUT,
&mut UINDEX,
ctx,
)?;
testutil::CHCKXC(false, b" ", OK, ctx)?;
testutil::CHCKSI(b"UINDEX", UINDEX, b"=", 4, 0, OK, ctx)?;
{
use f2rust_std::io;
let specs = io::InquireSpecs {
unit: Some(LUN),
opened: Some(&mut OPENED),
..Default::default()
};
IOSTAT = io::capture_iostat(|| ctx.inquire(specs))?;
}
testutil::CHCKSI(b"IOSTAT", IOSTAT, b"=", 0, 0, OK, ctx)?;
testutil::CHCKSL(b"OPENED", OPENED, false, OK, ctx)?;
testutil::CHCKSI(b"UTCST(UINDEX)", UTCST[UINDEX], b"=", 0, 0, OK, ctx)?;
testutil::CHCKSI(b"UTHAN(UINDEX)", UTHAN[UINDEX], b"=", 0, 0, OK, ctx)?;
testutil::CHCKSI(b"UTLUN(UINDEX)", UTLUN[UINDEX], b"=", LUN, 0, OK, ctx)?;
testutil::CHCKSL(b"UTLCK(UINDEX)", UTLCK[UINDEX], false, OK, ctx)?;
testutil::CHCKSI(b"NUT", NUT, b"=", UTSIZE, 0, OK, ctx)?;
testutil::TCASE(b"Full table, monotonic decreasing cost, no zero.", ctx)?;
NUT = UTSIZE;
for I in 1..=UTSIZE {
UTCST[I] = (((UTSIZE + 1) - I) * 10);
UTHAN[I] = I;
UTLCK[I] = false;
UTLUN[I] = I;
}
UINDEX = -1;
UTLCK[(UTSIZE - 2)] = true;
UTLCK[(UTSIZE - 1)] = true;
UTLCK[UTSIZE] = true;
spicelib::GETLUN(&mut LUN, ctx)?;
testutil::CHCKXC(false, b" ", OK, ctx)?;
UTLUN[(UTSIZE - 3)] = LUN;
{
use f2rust_std::io;
let specs = io::OpenSpecs {
unit: Some(LUN),
access: Some(b"DIRECT"),
recl: Some(RECL),
status: Some(b"SCRATCH"),
..Default::default()
};
IOSTAT = io::capture_iostat(|| ctx.open(specs))?;
}
testutil::CHCKSI(b"IOSTAT", IOSTAT, b"=", 0, 0, OK, ctx)?;
spicelib::ZZDDHGTU(
UTCST.as_slice_mut(),
UTHAN.as_slice_mut(),
UTLCK.as_slice_mut(),
UTLUN.as_slice_mut(),
&mut NUT,
&mut UINDEX,
ctx,
)?;
testutil::CHCKXC(false, b" ", OK, ctx)?;
testutil::CHCKSI(b"UINDEX", UINDEX, b"=", (UTSIZE - 3), 0, OK, ctx)?;
{
use f2rust_std::io;
let specs = io::InquireSpecs {
unit: Some(LUN),
opened: Some(&mut OPENED),
..Default::default()
};
IOSTAT = io::capture_iostat(|| ctx.inquire(specs))?;
}
testutil::CHCKSI(b"IOSTAT", IOSTAT, b"=", 0, 0, OK, ctx)?;
testutil::CHCKSL(b"OPENED", OPENED, false, OK, ctx)?;
testutil::CHCKSI(b"UTCST(UINDEX)", UTCST[UINDEX], b"=", 0, 0, OK, ctx)?;
testutil::CHCKSI(b"UTHAN(UINDEX)", UTHAN[UINDEX], b"=", 0, 0, OK, ctx)?;
testutil::CHCKSI(b"UTLUN(UINDEX)", UTLUN[UINDEX], b"=", LUN, 0, OK, ctx)?;
testutil::CHCKSL(b"UTLCK(UINDEX)", UTLCK[UINDEX], false, OK, ctx)?;
testutil::CHCKSI(b"NUT", NUT, b"=", UTSIZE, 0, OK, ctx)?;
testutil::TCASE(b"Full table, all rows locked exception.", ctx)?;
NUT = UTSIZE;
for I in 1..=UTSIZE {
UTCST[I] = (10 * I);
UTHAN[I] = I;
UTLCK[I] = true;
UTLUN[I] = I;
}
UINDEX = -1;
spicelib::ZZDDHGTU(
UTCST.as_slice_mut(),
UTHAN.as_slice_mut(),
UTLCK.as_slice_mut(),
UTLUN.as_slice_mut(),
&mut NUT,
&mut UINDEX,
ctx,
)?;
testutil::CHCKXC(true, b"SPICE(BUG)", OK, ctx)?;
testutil::T_SUCCESS(OK, ctx);
Ok(())
}