#[cfg(not(unix))]
compile_error!("YOM is available on UNIX-like systems only.");
use std::io;
use std::fs::File;
use std::io::{BufRead, BufReader};
mod builtins; mod externals; use std::process::exit;
fn main() {
let mut args = std::env::args_os();
args.next();
let path = match args.next() {
Some(p) => p,
None => return,
};
let f = File::open(&path).unwrap();
let mut reader = BufReader::new(f);
let mut line = String::new();
let stdout = io::stdout();
let mut lock = stdout.lock();
while reader.read_line(&mut line).unwrap() > 0 {
if line.starts_with("#") || line == "\n" || line == "" {
line.clear();
continue;
} else if line.starts_with("echo ") {
let str = line.strip_prefix("echo ").unwrap(); let str = str.strip_suffix("\n").unwrap_or(str); if str.starts_with('"') && str.ends_with('"') {
let str = str.strip_prefix('"').unwrap();
let str = str.strip_suffix('"').unwrap();
builtins::echo::echo(str, &mut lock); } else {
builtins::echo::echo(str, &mut lock); }
} else if line == "pwd\n" {
let _ = builtins::pwd::pwd(&mut lock);
} else if line.starts_with("cd ") {
let dir = line.strip_prefix("cd ").unwrap(); let dir = dir.strip_suffix("\n").unwrap_or(dir); if dir.starts_with('"') && dir.ends_with('"') {
let dir = dir.strip_prefix('"').unwrap(); let dir = dir.strip_suffix('"').unwrap(); let _ = builtins::cd::cd(dir); } else {
let _ = builtins::cd::cd(dir); }
} else if line == "exit\n" {
builtins::exit::exit(0);
} else if line.starts_with("exit ") {
let code: i32 = line.trim_start_matches("exit ").trim_end_matches("\n").parse().unwrap(); builtins::exit::exit(code);
} else if line.starts_with("/") {
externals::entry::waitfor(&line);
} else if line.starts_with("& ") {
let _ = externals::entry::background(&line);
} else if line.starts_with("exec ") {
externals::entry::exec(&line);
} else if line.starts_with("read") {
let prompt = line.strip_prefix("read ").unwrap(); let prompt = prompt.strip_suffix("\n").unwrap_or(prompt); if prompt.starts_with('"') && prompt.ends_with('"') {
let prompt = prompt.strip_prefix('"').unwrap(); let prompt = prompt.strip_suffix('"').unwrap(); let _ = builtins::read::read(prompt, &mut lock); } else {
let _ = builtins::read::read(prompt, &mut lock); }
} else {
exit(1);
}
line.clear();
}
exit(0);
}