diff options
| author | Thomas Voss <mail@thomasvoss.com> | 2026-02-24 11:08:42 +0100 |
|---|---|---|
| committer | Thomas Voss <mail@thomasvoss.com> | 2026-02-24 11:08:42 +0100 |
| commit | 7d42170c8625de0fe44b98f47e8b9a603a9de794 (patch) | |
| tree | 86623e0e0809d23ee3dd861ad7006ff21672e455 /oryxc/src/main.rs | |
Genesis commit
Diffstat (limited to 'oryxc/src/main.rs')
| -rw-r--r-- | oryxc/src/main.rs | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/oryxc/src/main.rs b/oryxc/src/main.rs new file mode 100644 index 0000000..298093d --- /dev/null +++ b/oryxc/src/main.rs @@ -0,0 +1,95 @@ +#![allow(unsafe_op_in_unsafe_fn)] + +mod compiler; +mod errors; +mod lexer; +mod parser; +mod size; +mod unicode; + +use std::ffi::OsString; +use std::{ + env, + fs, + process, + thread, +}; + +use lexopt; + +#[derive(Clone, Copy, Default)] +pub struct Flags { + pub debug_lexer: bool, + pub debug_parser: bool, + pub help: bool, + pub threads: usize, +} + +impl Flags { + fn parse() -> Result<(Flags, Vec<OsString>), lexopt::Error> { + use lexopt::prelude::*; + + let mut rest = Vec::with_capacity(env::args().len()); + let mut flags = Flags::default(); + let mut parser = lexopt::Parser::from_env(); + + while let Some(arg) = parser.next()? { + match arg { + Short('h') | Long("help") => flags.help = true, + Short('l') | Long("debug-lexer") => flags.debug_lexer = true, + Short('p') | Long("debug-parser") => flags.debug_parser = true, + Short('t') | Long("threads") => { + flags.threads = parser.value()?.parse()?; + if flags.threads == 0 { + err!("thread count must be greater than 0"); + } + }, + Value(v) => rest.push(v), + _ => return Err(arg.unexpected()), + } + } + + if flags.threads == 0 { + flags.threads = thread::available_parallelism().map_or_else( + |e| { + warn!(e, "failed to get thread count"); + 1 + }, + |x| x.get(), + ); + } + + return Ok((flags, rest)); + } +} + +fn usage() { + eprintln!( + concat!("Usage: {0} [-lp] [-t threads]\n", " {0} -h"), + errors::progname().display() + ); +} + +fn main() { + let (flags, rest) = match Flags::parse() { + Ok(v) => v, + Err(e) => { + warn!(e); + usage(); + process::exit(1); + }, + }; + + if flags.help { + usage(); + process::exit(0); + } + + compiler::start(rest, flags); + // let tokbuf = lexer::tokenize(Some(file), s.as_str()); + // let (ast, extra_data) = parser::parse(&tokbuf); + + // if flags.debug_lexer { + // tokbuf.tokens.iter().for_each(|t| println!("{t:?}")); + // } +} |