From 3eec5764a267b8c2da1c022123b06bc1ade69c47 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Wed, 2 Aug 2023 16:26:56 -0400 Subject: [PATCH] Add support for reading/writing CFG files --- src/cfg.rs | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 3 +++ 2 files changed, 79 insertions(+) create mode 100644 src/cfg.rs diff --git a/src/cfg.rs b/src/cfg.rs new file mode 100644 index 0000000..02cfdb1 --- /dev/null +++ b/src/cfg.rs @@ -0,0 +1,76 @@ +use crate::gamedata::MemoryBuffer; +use std::collections::HashMap; +use std::io::{BufRead, BufReader, BufWriter, Cursor, Write}; +use crate::cfg; + +#[derive(Debug)] +pub struct CFGSetting { + pub keys: HashMap, +} + +#[derive(Debug)] +pub struct CFG { + pub categories: Vec, + pub settings: HashMap, +} + +impl CFG { + pub fn from_existing(buffer: &MemoryBuffer) -> Option { + let mut cfg = CFG { + categories: Vec::new(), + settings: HashMap::new() + }; + + let cursor = Cursor::new(buffer); + let reader = BufReader::new(cursor); + + let mut current_category: Option = None; + + for (_, line) in reader.lines().enumerate() { + // now parse the line! + + let unwrap = line.unwrap(); + println!("{}", unwrap); + if !unwrap.is_empty() { + if unwrap.contains('<') || unwrap.contains('>') { + let name = &unwrap[1..unwrap.len() - 1]; + println!("{}", name); + current_category = Some(String::from(name)); + cfg.categories.push(String::from(name)); + } else { + let parts = unwrap.split_once('\t').unwrap(); + if !cfg.settings.contains_key(¤t_category.clone().unwrap()) { + cfg.settings.insert(current_category.clone().unwrap(), cfg::CFGSetting{ keys: HashMap::new() }); + } + + cfg.settings.get_mut(¤t_category.clone().unwrap()).unwrap().keys.insert(parts.0.to_string(), parts.1.to_string()); + } + } + } + + Some(cfg) + } + + pub fn write_to_buffer(&self) -> Option { + let mut buffer = MemoryBuffer::new(); + + { + let cursor = Cursor::new(&mut buffer); + let mut writer = BufWriter::new(cursor); + + for category in &self.categories { + writer.write(format!("\n<{}>", category).as_ref()); + + if self.settings.contains_key(category) { + for key in &self.settings[category].keys { + writer.write(format!("\n{}\t{}", key.0, key.1).as_ref()); + } + } + + writer.write(b"\n"); + } + } + + Some(buffer) + } +} diff --git a/src/lib.rs b/src/lib.rs index 5e0ce74..d386efa 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -79,6 +79,9 @@ pub mod cmp; /// Reading character save datas files (DAT) pub mod chardat; +/// Reading config files (CFG) +pub mod cfg; + mod crc; mod sha1;