Added user configuration to utility module

This commit is contained in:
François Autin 2023-04-19 16:39:39 +02:00
parent 35b2949243
commit 74a0960ec3
3 changed files with 149 additions and 1 deletions

40
burritos.cfg Executable file
View File

@ -0,0 +1,40 @@
##################################################
# BurritOS configuration file
##################################################
NumPhysPages = 400
UserStackSize = 4096
MaxFileNameSize = 256
NumDirEntries = 30
NumPortLoc = 32009
NumPortDist = 32010
ProcessorFrequency = 100
SectorSize = 128
PageSize = 128
MaxVirtPages = 200000
# String values
###############
# WARNING: Copying can be very slow
# because the system transferts data
# by 10 byte chunks. The transfer file
# can be set by changing the transfersize
# constant in fstest.rs.
TargetMachineName = localhost
FileToCopy = test/halt /halt
FileToCopy = test/hello /hello
FileToCopy = test/sort /sort
FileToCopy = test/shell /shell
# Boolean values
################
UseACIA = None
PrintStat = 1
FormatDisk = 1
ListDir = 1
PrintFileSyst = 0
ProgramToRun = /sort

107
src/utility/cfg.rs Normal file
View File

@ -0,0 +1,107 @@
//! Functions for burritos.cfg configuration file parsing.
//! Needed to set-up machine and system constants without
//! recompiling.
use std::{
fs::File,
path::Path,
collections::HashMap,
io::{
BufReader,
BufRead,
Error
}
};
/// Aliases the rather long HashMap<MachineSettingKey, i32> type
/// to a rather simpler to understand Settings.
pub type Settings = HashMap<MachineSettingKey, i32>;
/// Keys for the Settings HashMap, represented as enums for
/// maintainability.
#[derive(Eq, Hash, PartialEq, Debug)]
pub enum MachineSettingKey {
/// Number of physical pages.
NumPhysPages,
/// Stack size.
UserStackSize,
/// Maximum size of a file name
MaxFileNameSize,
/// Number of directory entries
NumDirEntries,
/// Processor Frequency
ProcessorFrequency,
/// Disk sector size
SectorSize,
/// Memory page size
PageSize,
/// Maximum number of Virtual Pages
MaxVirtPages,
/// In case of unknown key in configuration file.
Unknown
}
/// Allows for converting string slices to correspoding MachineSettingKey
/// enum value.
impl From<&str> for MachineSettingKey {
fn from(s: &str) -> Self {
match s {
"NumPhysPages" => MachineSettingKey::NumPhysPages,
"UserStackSize" => MachineSettingKey::UserStackSize,
"MaxFileNameSize" => MachineSettingKey::MaxFileNameSize,
"NumDirEntries" => MachineSettingKey::NumDirEntries,
"ProcessorFrequency" => MachineSettingKey::ProcessorFrequency,
"SectorSize" => MachineSettingKey::SectorSize,
"PageSize" => MachineSettingKey::PageSize,
"MaxVirtPages" => MachineSettingKey::MaxVirtPages,
_ => MachineSettingKey::Unknown
}
}
}
/// Tries to return a HashMap containing the user defined burritos configuration
/// in the burritos.cfg file.
///
/// If the file is not found, the function will return an io error.
///
/// If the configuration is invalid, the function may return a HashMap with missing or
/// non-sensical settings.
/// It is up to the caller to determine whether or not default values should be placed
/// instead of halting the program.
pub fn read_settings() -> Result<Settings, Error> {
// Opening file
let file = {
let file_path = "./burritos.cfg";
let file_path = Path::new(file_path);
match File::open(file_path) {
Ok(opened_file) => opened_file,
Err(error_message) => Err(error_message)?
}
};
let file_reader = BufReader::new(file);
let filtered_setting_strings = filter_garbage(file_reader);
let mut settings_map = Settings::new();
// Reading settings
for line in filtered_setting_strings {
let mut split_line = line.split_whitespace();
let key = split_line.next().unwrap_or("_");
split_line.next(); // Skipping '=' character
let setting = split_line.next().unwrap_or("_");
settings_map = update_settings_map(settings_map, key, setting);
}
Ok(settings_map)
}
fn filter_garbage<R: std::io::Read>(reader: BufReader<R>) -> Vec<String> {
reader.lines()
.map(|l| l.unwrap())
.filter(|l| !l.is_empty() && !l.starts_with("#"))
.collect()
}
fn update_settings_map(mut settings_map: Settings, key: &str, setting: &str) -> Settings {
let key = MachineSettingKey::from(key);
let setting = i32::from_str_radix(setting, 10).unwrap_or(0);
settings_map.insert(key, setting);
settings_map
}

View File

@ -1,2 +1,3 @@
pub mod list; pub mod list;
pub mod objaddr; pub mod objaddr;
pub mod cfg;