From 4c041d13765e8112df05052981767f56ee1810c9 Mon Sep 17 00:00:00 2001 From: liutong Date: Tue, 27 Jun 2023 22:36:41 +0800 Subject: [PATCH] fixed readonly and export cannot jump loop --- bash-5.1/builtins_rust/builtin/src/lib.rs | 5 ++-- bash-5.1/builtins_rust/echo/src/lib.rs | 2 +- bash-5.1/builtins_rust/eval/src/lib.rs | 9 -------- bash-5.1/builtins_rust/help/src/lib.rs | 28 ++++++++++++++++------- bash-5.1/builtins_rust/read/src/lib.rs | 11 ++++----- bash-5.1/builtins_rust/setattr/src/lib.rs | 7 +++++- bash-5.1/builtins_rust/type/src/lib.rs | 11 +++++---- record.txt | 1 + 8 files changed, 41 insertions(+), 33 deletions(-) diff --git a/bash-5.1/builtins_rust/builtin/src/lib.rs b/bash-5.1/builtins_rust/builtin/src/lib.rs index 017a2a2e..3965d5b0 100644 --- a/bash-5.1/builtins_rust/builtin/src/lib.rs +++ b/bash-5.1/builtins_rust/builtin/src/lib.rs @@ -6,15 +6,14 @@ include!(concat!("intercdep.rs")); pub extern "C" fn r_builtin_builtin(mut list: *mut WordList) -> i32 { unsafe{ let mut function: Option:: = None; - let mut command: &CStr = CStr::from_ptr((*(*list).word).word as *mut c_char); if no_options(list) != 0 { return EX_USAGE; } list = loptend; - if list.is_null() { + if list == std::ptr::null_mut() { return EXECUTION_SUCCESS!(); } - + let mut command: &CStr = CStr::from_ptr((*(*list).word).word as *mut c_char); function = find_shell_builtin(command.as_ptr() as *mut c_char); if function.is_none() { sh_notbuiltin(command.as_ptr() as *mut c_char); diff --git a/bash-5.1/builtins_rust/echo/src/lib.rs b/bash-5.1/builtins_rust/echo/src/lib.rs index 79a74fe9..59056708 100644 --- a/bash-5.1/builtins_rust/echo/src/lib.rs +++ b/bash-5.1/builtins_rust/echo/src/lib.rs @@ -91,7 +91,7 @@ pub extern "C" fn r_echo_builtin(mut list:*mut WordList)->i32{ // if posixly_correct!=0 && xpg_echo!=0{ //xpg_echo=0,所以这个可能不用翻译 // } - if (*(*list).word).word != std::ptr::null_mut(){ + if !list.is_null() && (*list).word != std::ptr::null_mut() && (*(*list).word).word != std::ptr::null_mut(){ temp = (*(*list).word).word; } while !list.is_null() && *temp=='-' as c_char{ diff --git a/bash-5.1/builtins_rust/eval/src/lib.rs b/bash-5.1/builtins_rust/eval/src/lib.rs index 33fcbb94..a882f3ce 100644 --- a/bash-5.1/builtins_rust/eval/src/lib.rs +++ b/bash-5.1/builtins_rust/eval/src/lib.rs @@ -43,15 +43,6 @@ pub extern "C" fn r_eval_builtin(mut list:*mut WordList)->i32{ } - - - - - - - - - #[cfg(test)] mod tests { #[test] diff --git a/bash-5.1/builtins_rust/help/src/lib.rs b/bash-5.1/builtins_rust/help/src/lib.rs index 16bedff4..390f3a90 100644 --- a/bash-5.1/builtins_rust/help/src/lib.rs +++ b/bash-5.1/builtins_rust/help/src/lib.rs @@ -100,7 +100,7 @@ extern "C"{ #[no_mangle] pub extern "C" fn r_help_builtin(mut list:*mut WordList)->i32 { - + // let mut i:i32; let mut plen:usize; let mut match_found:i32; @@ -125,9 +125,9 @@ pub extern "C" fn r_help_builtin(mut list:*mut WordList)->i32 { let optu8:u8= i as u8; let optChar:char=char::from(optu8); match optChar{ - 'd'=> {dflag = 1; break;} - 'm'=> {mflag = 1; break;} - 's'=> {sflag = 1; break;} + 'd'=> {dflag = 1; } + 'm'=> {mflag = 1; } + 's'=> {sflag = 1; } _=>{ unsafe { if i == -99 { @@ -139,12 +139,23 @@ pub extern "C" fn r_help_builtin(mut list:*mut WordList)->i32 { } } } + unsafe{ + i = internal_getopt (list, c_str_dms.as_ptr() as * mut c_char); + } + } + if list == std::ptr::null_mut(){ + unsafe { + show_shell_version (0); + } + show_builtin_command_help (); + return EXECUTION_SUCCESS!(); } unsafe { - let pattern = glob_pattern_p ((*(*list).word).word); - if (pattern == 1){ + let mut pattern = 0; + pattern = glob_pattern_p ((*(*list).word).word); + if pattern == 1 { println!("Shell commands matching keyword, Shell commands matching keyword"); - if (*list).next !=std::ptr::null_mut() { + if list != std::ptr::null_mut() && (*list).next !=std::ptr::null_mut() { println!("Shell commands matching keywords"); } else { @@ -152,7 +163,8 @@ pub extern "C" fn r_help_builtin(mut list:*mut WordList)->i32 { } println!("{:?} ,",list); } - let mut loptendt=*list; + // let mut loptendt=*list; + let mut match_found = 0; let mut pattern:*mut c_char = 0 as *mut libc::c_char; while list !=std::ptr::null_mut() { diff --git a/bash-5.1/builtins_rust/read/src/lib.rs b/bash-5.1/builtins_rust/read/src/lib.rs index 946f8f9c..5ca4bd4c 100644 --- a/bash-5.1/builtins_rust/read/src/lib.rs +++ b/bash-5.1/builtins_rust/read/src/lib.rs @@ -159,11 +159,11 @@ unsafe { tmusec = uval as c_uint; } } - 'N' => { - ignore_delim = 1; - delim = -1; - } - 'n' => { + 'N' | 'n' => { + if opt_char == 'N' { + ignore_delim = 1; + delim = -1; + } nflag = 1; code = legal_number(list_optarg, &mut intval); if code == 0 || intval < 0 || intval != (intval as c_int) as c_long { @@ -193,7 +193,6 @@ unsafe { } _ => { - // builtin_usage(); r_builtin_usage (); return EX_USAGE; } diff --git a/bash-5.1/builtins_rust/setattr/src/lib.rs b/bash-5.1/builtins_rust/setattr/src/lib.rs index 3237cbeb..2d8def22 100644 --- a/bash-5.1/builtins_rust/setattr/src/lib.rs +++ b/bash-5.1/builtins_rust/setattr/src/lib.rs @@ -1,3 +1,5 @@ +use std::mem::size_of_val; + use libc::{c_int, c_uint, c_char, c_long, PT_NULL, c_void}; include!(concat!("intercdep.rs")); @@ -185,7 +187,8 @@ unsafe { if !variable_list.is_null() { let mut i = 0; loop { - var = (variable_list as usize + 8 * i) as *mut SHELL_VAR; + var = *((variable_list as usize + (8*i))as *mut *mut SHELL_VAR) as *mut SHELL_VAR; + if var.is_null() { break; } @@ -193,10 +196,12 @@ unsafe { if arrays_only != 0 && ((*var).attributes & att_array) != 0 { continue; } else if assoc_only != 0 && ((*var).attributes & assoc_only) != 0 { + i += 1; continue; } if ((*var).attributes & (att_invisible | att_exported)) == (att_invisible | att_exported) { + i += 1; continue; } diff --git a/bash-5.1/builtins_rust/type/src/lib.rs b/bash-5.1/builtins_rust/type/src/lib.rs index c2318bfd..ddf85bf6 100644 --- a/bash-5.1/builtins_rust/type/src/lib.rs +++ b/bash-5.1/builtins_rust/type/src/lib.rs @@ -362,7 +362,7 @@ extern "C" { fn sh_single_quote(quote: *const i8) -> *mut i8; fn find_reserved_word(word: *mut i8)->i32; fn find_function (name:* const i8)-> *mut SHELL_VAR; - fn named_function_string (name: *mut i8, cmd:* mut i8, i:i32)->* mut i8; + fn named_function_string (name: *mut i8, cmd:* mut COMMAND, i:i32)->* mut i8; fn find_shell_builtin(builtin: *mut i8) -> *mut i8; fn find_special_builtin(builtins: *mut i8) -> *mut sh_builtin_func_t; fn absolute_program(program:*const i8) -> i32; @@ -566,15 +566,16 @@ fn describe_command (command : *mut i8, dflags : i32) -> i32 { } } else if dflags & CDESC_SHORTDESC!() != 0 { - let result : *mut i8; + let mut result : *mut i8; unsafe { println!("{:?} is a function",CStr::from_ptr(command)); - result = named_function_string (command, unsafe{function_cell(func) as *mut i8}, FUNC_MULTILINE!()|FUNC_EXTERNAL!()); - println!("{:?}",CStr::from_ptr(result)); + result = named_function_string (command, function_cell(find_function (command)), FUNC_MULTILINE!()|FUNC_EXTERNAL!()); + println!("{:?}",CStr::from_ptr(result)); } } - else if dflags & CDESC_REUSABLE!() != 0{ + else if dflags & CDESC_REUSABLE!() != 0{ + unsafe { println!("{:?}",CStr::from_ptr(command)); } diff --git a/record.txt b/record.txt index dcb84cb0..192be4d9 100644 --- a/record.txt +++ b/record.txt @@ -31,3 +31,4 @@ 53 54 55 +56 -- Gitee