ICFP 2007 Contest: https://web.archive.org/web/20090301164728/https://save-endo.cs.uu.nl/

Basic disassembler, lets me see instructions by Green Zone offset

Changed files
+91 -2
disassembler
dna2rna
+1
disassembler/.dir-locals.el
···
+
((nil . ((default-directory . "~/repos/endo/disassembler/"))))
+14
disassembler/Cargo.lock
···
+
# This file is automatically @generated by Cargo.
+
# It is not intended for manual editing.
+
version = 4
+
+
[[package]]
+
name = "disassembler"
+
version = "0.1.0"
+
dependencies = [
+
"dna_parsing",
+
]
+
+
[[package]]
+
name = "dna_parsing"
+
version = "0.1.0"
+7
disassembler/Cargo.toml
···
+
[package]
+
name = "disassembler"
+
version = "0.1.0"
+
edition = "2024"
+
+
[dependencies]
+
dna_parsing = { path = "../dna_parsing" }
+69
disassembler/src/main.rs
···
+
use dna_parsing::base::Base;
+
use dna_parsing::parser::Parser;
+
use std::env;
+
use std::fs;
+
use std::io;
+
use std::io::Write;
+
+
fn main() {
+
let args: Vec<String> = env::args().collect();
+
if args.len() < 3 {
+
println!("Usage: {} <dna file> <offset>", args[0]);
+
return;
+
}
+
+
let Ok(dna) = fs::read_to_string(&args[1]) else {
+
println!("Failed to read dna file at {}", &args[1]);
+
return;
+
};
+
let Ok(offset): Result<usize, _> = args[2].parse() else {
+
println!("Failed to parse offset {}", &args[2]);
+
return;
+
};
+
+
let mut index = 0;
+
loop {
+
print!("> ");
+
let _ = io::stdout().flush();
+
let mut line = String::new();
+
if !io::stdin().read_line(&mut line).is_ok() {
+
println!("Failed to read response line");
+
return;
+
}
+
line = line.trim().to_string();
+
if !line.is_empty() {
+
let Ok(new_index): Result<usize, _> = line.parse() else {
+
println!("Failed to parse {}", line);
+
continue;
+
};
+
index = new_index;
+
}
+
+
let mut parser = Parser::new(
+
dna[index + offset..]
+
.chars()
+
.filter_map(|c| Base::from_char(c)),
+
);
+
let mut rna = Vec::new();
+
let Some(pattern) = parser.pattern(&mut rna) else {
+
println!("Failed to parse pattern");
+
continue;
+
};
+
let Some(template) = parser.template(&mut rna) else {
+
println!("Failed to parse template");
+
continue;
+
};
+
+
if !rna.is_empty() {
+
println!("RNA output:");
+
for r in rna.iter() {
+
let rna_str: String = r.iter().map(|b| b.to_char()).collect();
+
println!(" {}", rna_str);
+
}
+
println!();
+
}
+
println!("{} ; {} ;", pattern, template);
+
index += parser.index();
+
println!("Now at: {}", index);
+
}
+
}
-2
dna2rna/src/match_replace.rs
···
let template = parser.template(rna)?;
let index = parser.index();
-
println!("{} ; {} ;", &pattern, &template);
-
if let Some(matched) = do_match(&dna, index, pattern) {
let mut replace = DnaRef::new();
for t in template.into_iter() {