1
0

68 lines
1.7 KiB
Rust
Raw Normal View History

2025-01-08 23:02:08 -05:00
use std::io::{stdin, stdout, Write};
2024-12-17 07:10:47 -05:00
use std::ops::Range;
2025-01-08 23:02:08 -05:00
use crate::{
vm::{get_next_action, Register, ThreadData},
ConcreteValue, Value,
};
2024-12-17 03:22:44 -05:00
pub fn read_line(
2025-01-08 23:02:08 -05:00
data: &mut ThreadData,
2024-12-17 07:10:47 -05:00
destination: Option<u8>,
_argument_range: Range<u8>,
2025-01-08 23:02:08 -05:00
) -> bool {
2024-12-17 07:10:47 -05:00
let destination = destination.unwrap();
let mut buffer = String::new();
2025-01-08 23:02:08 -05:00
if stdin().read_line(&mut buffer).is_ok() {
let length = buffer.len();
2025-01-08 23:02:08 -05:00
buffer.truncate(length.saturating_sub(1));
2025-01-08 23:02:08 -05:00
let register = Register::Value(Value::Concrete(ConcreteValue::string(buffer)));
2024-12-17 07:10:47 -05:00
data.set_register(destination, register);
}
2024-12-17 07:10:47 -05:00
data.next_action = get_next_action(data);
2025-01-08 23:02:08 -05:00
false
}
2025-01-08 23:02:08 -05:00
pub fn write(data: &mut ThreadData, _destination: Option<u8>, argument_range: Range<u8>) -> bool {
let mut stdout = stdout();
2024-12-17 07:10:47 -05:00
for register_index in argument_range {
if let Some(value) = data.open_register_allow_empty_unchecked(register_index) {
let string = value.display(data);
2025-01-08 23:02:08 -05:00
let _ = stdout.write(string.as_bytes());
}
}
2025-01-08 23:02:08 -05:00
let _ = stdout.flush();
data.next_action = get_next_action(data);
2025-01-08 23:02:08 -05:00
false
}
pub fn write_line(
2025-01-08 23:02:08 -05:00
data: &mut ThreadData,
2024-12-17 07:10:47 -05:00
_destination: Option<u8>,
argument_range: Range<u8>,
2025-01-08 23:02:08 -05:00
) -> bool {
2024-12-17 07:10:47 -05:00
let mut stdout = stdout().lock();
2024-12-17 07:10:47 -05:00
for register_index in argument_range {
if let Some(value) = data.open_register_allow_empty_unchecked(register_index) {
let string = value.display(data);
2025-01-08 23:02:08 -05:00
let _ = stdout.write(string.as_bytes());
let _ = stdout.write(b"\n");
}
}
2025-01-08 23:02:08 -05:00
let _ = stdout.flush();
data.next_action = get_next_action(data);
2025-01-08 23:02:08 -05:00
false
}