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

Compare changes

Choose any two refs to compare.

+1 -1
.gitignore
···
task/endo.dna
.tup/
-
out/
+
/out/
-13
Tupfile
···
-
RUSTC_FLAGS= --edition=2024 --crate-type bin --emit=link -C opt-level=3 -C embed-bitcode=no --check-cfg 'cfg (docsrs,test)' --check-cfg 'cfg(feature, values())' --out-dir out/bin -C strip=debuginfo -L dependency=out/bin
-
-
: dna2rna/src/*.rs |> rustc --crate-name dna2rna dna2rna/src/main.rs $(RUSTC_FLAGS) |> out/bin/dna2rna
-
: rna2bmp/src/*.rs |> rustc --crate-name rna2bmp rna2bmp/src/main.rs $(RUSTC_FLAGS) |> out/bin/rna2bmp
-
: asm2dna/src/*.rs |> rustc --crate-name asm2dna asm2dna/src/main.rs $(RUSTC_FLAGS) |> out/bin/asm2dna
-
-
: foreach asm/*.asm | out/bin/asm2dna |> ./out/bin/asm2dna %f out/dna/%B.dna |> out/dna/%B.dna
-
-
: foreach out/dna/*.dna | out/bin/dna2rna |> ./out/bin/dna2rna %f task/endo.dna out/rna/%B.rna |> out/rna/%B.rna
-
-
: foreach out/rna/*.rna | out/bin/rna2bmp |> ./out/bin/rna2bmp %f out/bmp/%B.bmp |> out/bmp/%B.bmp
-
-
: foreach out/bmp/*.bmp |> convert %f out/png/%B.png |> out/png/%B.png
+64
Tupfile.lua
···
+
function define_rust_rule(name, type, deps)
+
local inputs = {}
+
for _, input in ipairs(tup.glob(name .. "/src/*.rs")) do
+
table.insert(inputs, input)
+
end
+
+
local input_rs
+
local output
+
if type == "bin" then
+
input_rs = name .. "/src/main.rs"
+
output = "out/bin/" .. name
+
else
+
input_rs = name .. "/src/lib.rs"
+
output = "out/lib/lib" .. name .. ".rlib"
+
end
+
+
local externs = {}
+
for _, dep in ipairs(deps) do
+
local rlib = "out/lib/lib" .. dep .. ".rlib"
+
table.insert(inputs, rlib)
+
table.insert(externs, "--extern " .. dep .. "=" .. rlib)
+
end
+
+
local flags = "--edition=2024 -C opt-level=3 -C embed-bitcode=no -C strip=debuginfo --emit=link"
+
local command = "rustc --crate-name " .. name .. " --crate-type=" .. type .. " " .. input_rs .. " -o %o " .. table.concat(externs, " ") .. " " .. flags
+
tup.definerule{inputs = inputs, command = command, outputs = {output}}
+
end
+
+
define_rust_rule("dna_parsing", "lib", {})
+
define_rust_rule("dna2rna", "bin", {"dna_parsing"})
+
define_rust_rule("disassembler", "bin", {"dna_parsing"})
+
define_rust_rule("rna2bmp", "bin", {})
+
define_rust_rule("asm2dna", "bin", {})
+
+
local asm = tup.glob("asm/*.asm")
+
asm.extra_inputs = {"out/bin/asm2dna"}
+
tup.foreach_rule(
+
asm,
+
"./out/bin/asm2dna %f %o",
+
{"out/dna/%B.dna"}
+
)
+
+
local dna = tup.glob("out/dna/*.dna")
+
dna.extra_inputs = {"out/bin/dna2rna"}
+
tup.foreach_rule(
+
dna,
+
"./out/bin/dna2rna %f task/endo.dna %o",
+
{"out/rna/%B.rna"}
+
)
+
+
local rna = tup.glob("out/rna/*.rna")
+
rna.extra_inputs = {"out/bin/rna2bmp"}
+
tup.foreach_rule(
+
rna,
+
"./out/bin/rna2bmp %f %o",
+
{"out/bmp/%B.bmp"}
+
)
+
+
local bmp = tup.glob("out/bmp/*.bmp")
+
tup.foreach_rule(
+
bmp,
+
"convert %f %o",
+
{"out/png/%B.png"}
+
)
+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() {
+20
generate_crate_rule.py
···
+
import sys
+
+
# 'lib' or 'bin'
+
crate_type = sys.argv[1]
+
crate_name = sys.argv[2]
+
if crate_type == "bin":
+
input_rs = f"{crate_name}/src/main.rs"
+
outfile = f"out/bin/{crate_name}"
+
else:
+
input_rs = f"{crate_name}/src/lib.rs"
+
outfile = f"out/lib/lib{crate_name}.rlib"
+
+
dep_crates = sys.argv[3:]
+
dep_inputs = " ".join([f"out/lib/lib{dep}.rlib" for dep in dep_crates])
+
externs = " ".join([f"--extern {dep}=out/lib/lib{dep}.rlib" for dep in dep_crates])
+
+
flags = "--edition=2024 -C opt-level=3 -C embed-bitcode=no -C strip=debuginfo --emit=link"
+
+
inputs = f"{crate_name}/src/*.rs"
+
print(f": {crate_name}/src/*.rs {dep_inputs} |> rustc --crate-name {crate_name} --crate-type={crate_type} {input_rs} -o %o {externs} {flags} |> {outfile}")