From 1d4d5f0520cfc00d8fae2778161a059e6c4eca89 Mon Sep 17 00:00:00 2001 From: Greg Shuflin Date: Mon, 24 Jul 2023 00:50:34 -0700 Subject: [PATCH] Handle reading input in Rust --- src/lib.rs | 35 +++++++++++++++++++++++++++++++++-- src/nms.c | 2 ++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index bb270ae..f9f6086 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,14 +1,17 @@ mod args; mod color; -use color::Color; -use libc::{c_int, c_void}; +use libc::{c_char, c_int, c_uchar, c_void}; +use std::ffi::CString; use std::process; +use color::Color; + const VERSION: &str = "2.0.0"; extern "C" { fn nmseffect_set_clearscr(_: c_int) -> c_void; + fn nmseffect_exec(input: *const c_char, len: c_int) -> c_char; static mut foregroundColor: c_int; static mut maskBlank: c_int; static mut autoDecrypt: c_int; @@ -60,4 +63,32 @@ pub extern "C" fn rust_main() { autoDecrypt = 0; } } + + let output = get_input("Enter input: "); + if output.len() == 0 { + eprintln!("Input is empty"); //TODO use error_log()/error_print() abstraction + process::exit(1); + } + let output_cstring = CString::new(output).unwrap(); + let ptr = output_cstring.as_ptr(); + let len = output_cstring.as_bytes().len(); + let _r = unsafe { nmseffect_exec(ptr, len as i32) }; +} + +fn get_input(prompt: &str) -> String { + use std::io::{Read, Write}; + + let mut stdin = std::io::stdin(); + let mut stdout = std::io::stdout(); + let mut buf = String::new(); + + if atty::is(atty::Stream::Stdin) { + print!("{prompt}"); + stdout.flush().unwrap(); + stdin.read_line(&mut buf).unwrap(); + } else { + stdin.read_to_string(&mut buf).unwrap(); + } + + buf } diff --git a/src/nms.c b/src/nms.c index da1f872..320889f 100644 --- a/src/nms.c +++ b/src/nms.c @@ -20,6 +20,7 @@ extern void rust_main(); int main(int argc, char *argv[]) { rust_main(); + /* unsigned char *input = NULL; int r = input_get(&input, "Enter input: "); @@ -39,6 +40,7 @@ int main(int argc, char *argv[]) r = nmseffect_exec(input, r); free(input); + */ return EXIT_SUCCESS; }