#![allow(non_snake_case)]
#![allow(dead_code)]
use crate::ported::crt::{ColorElements, ColorScheme};
use crate::ported::linux::platform::Platform_getFileDescriptors;
use crate::ported::meter::Meter;
use crate::ported::richstring::{RichString, RichString_appendAscii, RichString_appendnAscii};
pub fn FileDescriptorMeter_updateValues(this: &mut Meter) {
this.values[0] = 0.0;
this.values[1] = 1.0;
let mut used = this.values[0];
let mut max = this.values[1];
Platform_getFileDescriptors(&mut used, &mut max);
this.values[0] = used;
this.values[1] = max;
this.curItems = 1;
if this.values[1] <= (1u32 << 16) as f64 {
this.total = this.values[1];
} else {
if this.total < 16.0 * this.values[0] {
this.total = (1u32 << 16) as f64;
while this.total < 16.0 * this.values[0] {
if this.total >= (1u32 << 30) as f64 {
break;
}
this.total *= 2.0;
}
}
if this.total > this.values[1] {
this.total = this.values[1];
}
if this.total > (1u32 << 30) as f64 {
this.total = (1u32 << 30) as f64;
}
}
if !(this.values[0] >= 0.0) {
this.txtBuffer = "unknown/unknown".to_string();
} else if !((1u32 << 30) as f64 >= this.values[1]) {
this.txtBuffer = format!("{:.0}/unlimited", this.values[0]);
} else {
this.txtBuffer = format!("{:.0}/{:.0}", this.values[0], this.values[1]);
}
}
pub fn FileDescriptorMeter_display(this: &Meter, out: &mut RichString) {
let scheme = ColorScheme::active();
if !(this.values[0] >= 0.0) {
RichString_appendAscii(out, ColorElements::METER_TEXT.packed(scheme), b"unknown");
return;
}
RichString_appendAscii(out, ColorElements::METER_TEXT.packed(scheme), b"used: ");
let buffer = format!("{:.0}", this.values[0]);
RichString_appendnAscii(
out,
ColorElements::FILE_DESCRIPTOR_USED.packed(scheme),
buffer.as_bytes(),
buffer.len(),
);
RichString_appendAscii(out, ColorElements::METER_TEXT.packed(scheme), b" max: ");
if !((1u32 << 30) as f64 >= this.values[1]) {
RichString_appendAscii(
out,
ColorElements::FILE_DESCRIPTOR_MAX.packed(scheme),
b"unlimited",
);
} else {
let buffer = format!("{:.0}", this.values[1]);
RichString_appendnAscii(
out,
ColorElements::FILE_DESCRIPTOR_MAX.packed(scheme),
buffer.as_bytes(),
buffer.len(),
);
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::ported::meter::BAR_METERMODE;
fn text(r: &RichString) -> String {
(0..r.chlen as usize).map(|i| r.chptr[i].chars).collect()
}
fn meter(values: Vec<f64>) -> Meter {
Meter {
host: core::ptr::null(),
values,
mode: BAR_METERMODE,
..Meter::empty()
}
}
#[test]
fn display_unknown_on_negative_used() {
let m = meter(vec![-1.0, 1024.0]);
let mut out = RichString::new();
FileDescriptorMeter_display(&m, &mut out);
assert_eq!(text(&out), "unknown");
}
#[test]
fn display_unknown_on_nan_used() {
let m = meter(vec![f64::NAN, 1024.0]);
let mut out = RichString::new();
FileDescriptorMeter_display(&m, &mut out);
assert_eq!(text(&out), "unknown");
}
#[test]
fn display_used_and_max() {
let m = meter(vec![512.0, 1024.0]);
let mut out = RichString::new();
FileDescriptorMeter_display(&m, &mut out);
assert_eq!(text(&out), "used: 512 max: 1024");
}
#[test]
fn display_unlimited_max() {
let m = meter(vec![512.0, 2.0 * (1u32 << 30) as f64]);
let mut out = RichString::new();
FileDescriptorMeter_display(&m, &mut out);
assert_eq!(text(&out), "used: 512 max: unlimited");
}
#[test]
fn display_max_exactly_1_30_is_not_unlimited() {
let m = meter(vec![0.0, (1u32 << 30) as f64]);
let mut out = RichString::new();
FileDescriptorMeter_display(&m, &mut out);
assert_eq!(text(&out), "used: 0 max: 1073741824");
}
}