luaur_bytecode_cli/functions/
parse_args.rs1use alloc::string::String;
5use core::ffi::c_char;
6use std::ffi::CStr;
7
8use luaur_cli_lib::functions::set_luau_flags_flags_alt_b::set_luau_flags_c_char;
9
10use crate::functions::display_help::display_help;
11use crate::records::global_options::globalOptions;
12
13pub(crate) fn parse_args(argc: i32, argv: *mut *mut i8, summary_file: &mut String) -> bool {
14 for i in 1..argc {
15 let arg_ptr = unsafe { *argv.add(i as usize) };
16 let arg = unsafe { CStr::from_ptr(arg_ptr) };
17 let arg_str = arg.to_str().unwrap();
18
19 if arg_str == "-h" || arg_str == "--help" {
20 let argv0 = unsafe { CStr::from_ptr(*argv) };
21 display_help(argv0.to_str().unwrap());
22 } else if arg_str.starts_with("-O") {
23 let level_str = &arg_str[2..];
24 let level: i32 = level_str.parse().unwrap_or(0);
25 if level < 0 || level > 2 {
26 eprintln!("Error: Optimization level must be between 0 and 2 inclusive.");
27 return false;
28 }
29 unsafe {
31 globalOptions.optimization_level = level;
32 }
33 } else if arg_str.starts_with("-g") {
34 let level_str = &arg_str[2..];
35 let level: i32 = level_str.parse().unwrap_or(0);
36 if level < 0 || level > 2 {
37 eprintln!("Error: Debug level must be between 0 and 2 inclusive.");
38 return false;
39 }
40 unsafe {
42 globalOptions.debug_level = level;
43 }
44 } else if arg_str.starts_with("--summary-file=") {
45 let filename = &arg_str[15..];
46 if filename.is_empty() {
47 eprintln!("Error: filename missing for '--summary-file'.\n");
48 return false;
49 }
50 *summary_file = filename.to_string();
51 } else if arg_str.starts_with("--fflags=") {
52 unsafe {
54 set_luau_flags_c_char(arg_ptr.add(9) as *const c_char);
55 }
56 } else if arg_str.starts_with('-') {
57 eprintln!("Error: Unrecognized option '{}'.\n", arg_str);
58 let argv0 = unsafe { CStr::from_ptr(*argv) };
59 display_help(argv0.to_str().unwrap());
60 }
61 }
62
63 true
64}