Skip to content

Commit

Permalink
[basm] Fix file saving in DSK rm etch4k.dsk ; cargo install --path=. …
Browse files Browse the repository at this point in the history
…&& basm ~/Perso/CPC/Sandbox/etchasketch/etch4k.asm && basm ~/Perso/CPC/Sandbox/etchasketch/etch4k.asm --backup!
  • Loading branch information
Krusty/Benediction committed Jan 5, 2024
1 parent 4a7c578 commit 62442bc
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 2 deletions.
12 changes: 11 additions & 1 deletion cpclib-basm/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,10 @@ pub fn assemble<'arg>(
assemble_options.set_case_sensitive(!matches.get_flag("CASE_INSENSITIVE"));
if matches.get_flag("OVERRIDE") {
assemble_options.set_save_behavior(cpclib_disc::amsdos::AmsdosAddBehavior::ReplaceAndEraseIfPresent);
} else {
} else if matches.get_flag("BACKUP") {
assemble_options.set_save_behavior(cpclib_disc::amsdos::AmsdosAddBehavior::BackupIfPresent);
}
else {
assemble_options.set_save_behavior(cpclib_disc::amsdos::AmsdosAddBehavior::FailIfPresent);
}

Expand Down Expand Up @@ -659,6 +662,13 @@ pub fn build_args_parser() -> clap::Command {
.long("override")
.action(ArgAction::SetTrue)
)
.arg(
Arg::new("BACKUP")
.help("Backup an existing file when saved on disc")
.long("backup")
.conflicts_with("OVERRIDE")
.action(ArgAction::SetTrue)
)
;

let cmd = if cfg!(feature = "xferlib") {
Expand Down
25 changes: 24 additions & 1 deletion cpclib-disc/src/amsdos.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1099,7 +1099,17 @@ impl<'dsk, 'mng: 'dsk, D: Disc> AmsdosManagerMut<'dsk, D> {
self.erase_file(filename, false)?;
},
AmsdosAddBehavior::BackupIfPresent => {
todo!("Rename the current file and remove other files with new name");
let mut backup_fname = filename.clone();
backup_fname.set_extension("BAK");

if self.entries_for(backup_fname).is_some() {
self.erase_file(backup_fname, true)?;
}
assert!(self.get_file(backup_fname).is_none());
self.rename(filename, backup_fname)?;
assert!(self.get_file(filename).is_none());
assert!(self.get_file(backup_fname).is_some());

},
AmsdosAddBehavior::ReplaceAndEraseIfPresent => {
self.erase_file(filename, true)?;
Expand Down Expand Up @@ -1237,6 +1247,19 @@ impl<'dsk, 'mng: 'dsk, D: Disc> AmsdosManagerMut<'dsk, D> {
Ok(())
}

pub fn rename(&mut self, source: AmsdosFileName, destination: AmsdosFileName) -> Result<(), AmsdosError> {
match self.entries_for(source) {
Some(entries) => {
entries.into_iter()
.for_each(|mut e| {
e.file_name = destination;
self.update_entry(&e);
});
Ok(())
},
None => Err(AmsdosError::FileDoesNotExist(format!("{:?}", source))),
}
}

pub fn catalog<'mngr: 'dsk>(&'dsk self) -> AmsdosEntries {
let nonmut: AmsdosManagerNonMut<'dsk, D> = self.into();
Expand Down

0 comments on commit 62442bc

Please sign in to comment.