diff --git a/bash-5.1/builtins_rust/common/src/lib.rs b/bash-5.1/builtins_rust/common/src/lib.rs index cc91ea975ea6d7d0c8ca150d37da8f8b03d62329..00df53dce14d9a50924f13e919d51f9632f712c5 100644 --- a/bash-5.1/builtins_rust/common/src/lib.rs +++ b/bash-5.1/builtins_rust/common/src/lib.rs @@ -543,12 +543,6 @@ macro_rules! QUIT { }; } -#[macro_export] -macro_rules! savestring { - ($x:expr) => { - strcpy(xmalloc(1 + strlen($x)) as *mut c_char,$x) as *mut c_char - } -} #[macro_export] macro_rules! FREE { @@ -1026,7 +1020,7 @@ pub extern "C" fn r_remember_args(mut list:*mut WordList,destructive:i32){ if !list.is_null(){ posparam_count = i; - *dollar_vars.as_mut_ptr().offset(posparam_count as isize) = savestring!((*(*list).word).word); + *dollar_vars.as_mut_ptr().offset(posparam_count as isize) = r_savestring((*(*list).word).word); list = (*list).next; } i += 1; @@ -1070,7 +1064,7 @@ pub extern "C" fn r_shift_args(mut times:i32){ if !rest_of_args.is_null(){ temp = rest_of_args; - *dollar_vars.as_mut_ptr().offset(9) = savestring!((*(*temp).word).word); + *dollar_vars.as_mut_ptr().offset(9) = r_savestring((*(*temp).word).word); rest_of_args = (*rest_of_args).next; (*temp).next = std::ptr::null_mut(); dispose_words(temp); @@ -1289,7 +1283,7 @@ pub extern "C" fn r_get_working_directory(for_whom:*mut c_char)->*mut c_char{ return std::ptr::null_mut(); } } - return savestring!(the_current_working_directory); + return r_savestring(the_current_working_directory); } } @@ -1297,7 +1291,7 @@ pub extern "C" fn r_get_working_directory(for_whom:*mut c_char)->*mut c_char{ pub extern "C" fn r_set_working_dierctory(name:*mut c_char){ unsafe{ FREE!(the_current_working_directory as *mut c_void); - the_current_working_directory = savestring!(name); + the_current_working_directory = r_savestring(name); } } @@ -1771,3 +1765,11 @@ pub extern "C" fn get_local_str()-> Vec{ let locales = vec![langid.into()]; return locales; } + +pub unsafe fn r_savestring(x:* const c_char)->* mut c_char +{ + let len = 1+libc::strlen(x); + let str1:* mut c_char=libc::malloc(len) as * mut c_char; + libc::memset(str1 as *mut libc::c_void, 0, len); + return libc::strcpy(str1 as *mut c_char ,x); +} diff --git a/bash-5.1/builtins_rust/complete/src/lib.rs b/bash-5.1/builtins_rust/complete/src/lib.rs index 5b8c1318e4aeb0d39999a09668ba18428f2e19ba..092c17145604ebdfd0f286d96718da9e08269309 100644 --- a/bash-5.1/builtins_rust/complete/src/lib.rs +++ b/bash-5.1/builtins_rust/complete/src/lib.rs @@ -2,8 +2,8 @@ extern crate libc; extern crate nix; use libc::{c_char, c_int, c_ulong, c_void}; -use std::{ffi::CString}; -use rcommon::{WordList, WordDesc, EX_USAGE, EXECUTION_SUCCESS, EXECUTION_FAILURE}; +use std::{ffi::CString, ffi::CStr}; +use rcommon::{WordList, WordDesc, EX_USAGE, EXECUTION_SUCCESS, EXECUTION_FAILURE, r_savestring} ; use rhelp::r_builtin_help; #[repr(u8)] @@ -218,30 +218,30 @@ impl CompactsArray { pub fn new()->CompactsArray { CompactsArray{ compactsArr:[ - _compacts{ actname:"alias\0".as_ptr() as *const c_char, actflag: CA_ALIAS!(),actopt: 'a' as c_int }, - _compacts{ actname:"arrayvar\0".as_ptr() as *const c_char, actflag: CA_ARRAYVAR!(),actopt: 0 as c_int }, - _compacts{ actname:"binding\0".as_ptr() as *const c_char, actflag: CA_BINDING!(),actopt: 0 as c_int }, - _compacts{ actname:"builtin\0".as_ptr() as *const c_char, actflag: CA_BUILTIN!(),actopt: 'b' as c_int }, - _compacts{ actname:"command\0".as_ptr() as *const c_char, actflag: CA_COMMAND!(),actopt: 'c' as c_int }, - _compacts{ actname:"directory\0".as_ptr() as *const c_char, actflag: CA_DIRECTORY!(),actopt: 'd' as c_int }, - _compacts{ actname:"disabled\0".as_ptr() as *const c_char, actflag: CA_DISABLED!(),actopt: 0 as c_int }, - _compacts{ actname:"enabled\0".as_ptr() as *const c_char, actflag: CA_ENABLED!(),actopt: 0 as c_int }, - _compacts{ actname:"export\0".as_ptr() as *const c_char, actflag: CA_EXPORT!(),actopt: 'e' as c_int }, - _compacts{ actname:"file\0".as_ptr() as *const c_char, actflag: CA_FILE!(),actopt: 'f' as c_int }, - _compacts{ actname:"function\0".as_ptr() as *const c_char, actflag: CA_FUNCTION!(),actopt: 0 as c_int }, - _compacts{ actname:"helptopic\0".as_ptr() as *const c_char, actflag: CA_HELPTOPIC!(),actopt: 0 as c_int }, - _compacts{ actname:"hostname\0".as_ptr() as *const c_char, actflag: CA_HOSTNAME!(),actopt: 0 as c_int }, - _compacts{ actname:"group\0".as_ptr() as *const c_char, actflag: CA_GROUP!(),actopt: 'g' as c_int }, - _compacts{ actname:"job\0".as_ptr() as *const c_char, actflag: CA_JOB!(),actopt: 'j' as c_int }, - _compacts{ actname:"keyword\0".as_ptr() as *const c_char, actflag: CA_KEYWORD!(),actopt: 'k' as c_int }, - _compacts{ actname:"running\0".as_ptr() as *const c_char, actflag: CA_RUNNING!(),actopt: 0 as c_int }, - _compacts{ actname:"service\0".as_ptr() as *const c_char, actflag: CA_SERVICE!(),actopt: 's' as c_int }, - _compacts{ actname:"setopt\0".as_ptr() as *const c_char, actflag: CA_SETOPT!(),actopt: 0 as c_int }, - _compacts{ actname:"shopt\0".as_ptr() as *const c_char, actflag: CA_SHOPT!(),actopt: 0 as c_int }, - _compacts{ actname:"signal\0".as_ptr() as *const c_char, actflag: CA_SIGNAL!(),actopt: 0 as c_int }, - _compacts{ actname:"stopped\0".as_ptr() as *const c_char, actflag: CA_STOPPED!(),actopt: 0 as c_int }, - _compacts{ actname:"user\0".as_ptr() as *const c_char, actflag: CA_USER!(),actopt: 'u' as c_int }, - _compacts{ actname:"variable\0".as_ptr() as *const c_char, actflag: CA_VARIABLE!(),actopt: 'v' as c_int }, + _compacts{ actname:b"alias\0".as_ptr() as *const c_char, actflag: CA_ALIAS!(),actopt: 'a' as c_int }, + _compacts{ actname:b"arrayvar\0".as_ptr() as *const c_char, actflag: CA_ARRAYVAR!(),actopt: 0 as c_int }, + _compacts{ actname:b"binding\0".as_ptr() as *const c_char, actflag: CA_BINDING!(),actopt: 0 as c_int }, + _compacts{ actname:b"builtin\0".as_ptr() as *const c_char, actflag: CA_BUILTIN!(),actopt: 'b' as c_int }, + _compacts{ actname:b"command\0".as_ptr() as *const c_char, actflag: CA_COMMAND!(),actopt: 'c' as c_int }, + _compacts{ actname:b"directory\0".as_ptr() as *const c_char, actflag: CA_DIRECTORY!(),actopt: 'd' as c_int }, + _compacts{ actname:b"disabled\0".as_ptr() as *const c_char, actflag: CA_DISABLED!(),actopt: 0 as c_int }, + _compacts{ actname:b"enabled\0".as_ptr() as *const c_char, actflag: CA_ENABLED!(),actopt: 0 as c_int }, + _compacts{ actname:b"export\0".as_ptr() as *const c_char, actflag: CA_EXPORT!(),actopt: 'e' as c_int }, + _compacts{ actname:b"file\0".as_ptr() as *const c_char, actflag: CA_FILE!(),actopt: 'f' as c_int }, + _compacts{ actname:b"function\0".as_ptr() as *const c_char, actflag: CA_FUNCTION!(),actopt: 0 as c_int }, + _compacts{ actname:b"helptopic\0".as_ptr() as *const c_char, actflag: CA_HELPTOPIC!(),actopt: 0 as c_int }, + _compacts{ actname:b"hostname\0".as_ptr() as *const c_char, actflag: CA_HOSTNAME!(),actopt: 0 as c_int }, + _compacts{ actname:b"group\0".as_ptr() as *const c_char, actflag: CA_GROUP!(),actopt: 'g' as c_int }, + _compacts{ actname:b"job\0".as_ptr() as *const c_char, actflag: CA_JOB!(),actopt: 'j' as c_int }, + _compacts{ actname:b"keyword\0".as_ptr() as *const c_char, actflag: CA_KEYWORD!(),actopt: 'k' as c_int }, + _compacts{ actname:b"running\0".as_ptr() as *const c_char, actflag: CA_RUNNING!(),actopt: 0 as c_int }, + _compacts{ actname:b"service\0".as_ptr() as *const c_char, actflag: CA_SERVICE!(),actopt: 's' as c_int }, + _compacts{ actname:b"setopt\0".as_ptr() as *const c_char, actflag: CA_SETOPT!(),actopt: 0 as c_int }, + _compacts{ actname:b"shopt\0".as_ptr() as *const c_char, actflag: CA_SHOPT!(),actopt: 0 as c_int }, + _compacts{ actname:b"signal\0".as_ptr() as *const c_char, actflag: CA_SIGNAL!(),actopt: 0 as c_int }, + _compacts{ actname:b"stopped\0".as_ptr() as *const c_char, actflag: CA_STOPPED!(),actopt: 0 as c_int }, + _compacts{ actname:b"user\0".as_ptr() as *const c_char, actflag: CA_USER!(),actopt: 'u' as c_int }, + _compacts{ actname:b"variable\0".as_ptr() as *const c_char, actflag: CA_VARIABLE!(),actopt: 'v' as c_int }, _compacts{ actname:std::ptr::null_mut(), actflag: 0,actopt: 0 as c_int }, ] } @@ -277,7 +277,6 @@ impl CompoptArray { } } - #[repr(C)] pub struct COMPSPEC { refcount:c_int, @@ -597,16 +596,10 @@ pub static mut Xarg:* mut c_char=std::ptr::null_mut(); pub static mut Farg:* mut c_char=std::ptr::null_mut(); pub static mut Carg:* mut c_char=std::ptr::null_mut(); -unsafe fn savestring(x:* const c_char)->* mut c_char -{ - let str1:* mut c_char=libc::malloc(1 + libc::strlen (x )) as * mut c_char; - return libc::strcpy(str1,x ); -} - unsafe fn STRDUP(x:* const c_char)->* mut c_char { if x !=std::ptr::null_mut() { - return savestring (x); + return r_savestring (x); } else { return std::ptr::null_mut(); } @@ -619,22 +612,22 @@ unsafe fn STREQ( a:* const c_char, b:* const c_char)->bool unsafe fn shell_break_chars()->* const c_char { - return "()<>;&| \t\n\0".as_ptr() as *const c_char; + return b"()<>;&| \t\n\0".as_ptr() as *const c_char; } unsafe fn EMPTYCMD()->* const c_char { - return "_EmptycmD_\0".as_ptr() as *const c_char; + return b"_EmptycmD_\0".as_ptr() as *const c_char; } unsafe fn DEFAULTCMD()->* const c_char { - return "_DefaultCmD_\0".as_ptr() as *const c_char; + return b"_DefaultCmD_\0".as_ptr() as *const c_char; } unsafe fn INITIALWORD()->* const c_char { - return "_InitialWorD_\0".as_ptr() as *const c_char; + return b"_InitialWorD_\0".as_ptr() as *const c_char; } unsafe fn RL_ISSTATE(x:c_ulong)->c_ulong @@ -649,6 +642,7 @@ pub extern "C" fn r_find_compact (name:* mut c_char)->i32 unsafe { let compacts:CompactsArray=CompactsArray::new(); while compacts.compactsArr[i as usize].actname != std::ptr::null_mut() { + let tmp = CStr::from_ptr(compacts.compactsArr[i as usize].actname); if STREQ (name, compacts.compactsArr[i as usize].actname) { return i; } @@ -675,7 +669,7 @@ pub extern "C" fn r_find_compopt (name:* mut c_char)->i32 } #[no_mangle] -pub extern "C" fn r_build_actions (list : *mut WordList, flagp:* mut _optflags, actp:* mut c_ulong, optp:* mut c_ulong)->i32 +pub extern "C" fn r_build_actions (mut list : *mut WordList, flagp:* mut _optflags, actp:* mut c_ulong, optp:* mut c_ulong)->i32 { let mut opt:i32; let mut ind:i32; @@ -818,9 +812,6 @@ pub extern "C" fn r_build_actions (list : *mut WordList, flagp:* mut _optflags, 'X'=>{ Xarg = list_optarg; } - 'X'=>{ - Xarg = list_optarg; - } _=>{ if opt == -99 { r_builtin_help(); @@ -834,6 +825,7 @@ pub extern "C" fn r_build_actions (list : *mut WordList, flagp:* mut _optflags, } *actp = acts; *optp = copts; + list = loptend.clone(); if opt_given !=0 { return EXECUTION_SUCCESS!(); } else { @@ -906,6 +898,7 @@ pub extern "C" fn r_complete_builtin (listt: *mut WordList)->i32 dispose_words (wl); return rval; } else if list == std::ptr::null_mut() { + //给了P,但没给参数,直接打印全部并退出 r_print_all_completions (); return EXECUTION_SUCCESS!(); } @@ -1025,6 +1018,7 @@ pub extern "C" fn r_print_arg (arg:* const c_char, flag:* const c_char, quote:i3 unsafe { if arg != std::ptr::null_mut() { if quote !=0 { + // 复制arg 增加单引号返给x x = sh_single_quote (arg as * mut c_char); } else { x= arg as * mut c_char; @@ -1184,10 +1178,11 @@ pub extern "C" fn r_compgen_builtin (listt:* mut WordList)->i32 list = loptend.clone(); + let wordtmp=CString::new("").unwrap(); if list !=std::ptr::null_mut() && (*list).word != std::ptr::null_mut() { word = (*((*list).word)).word; } else { - word=CString::new("").unwrap().as_ptr() as * mut c_char; + word = wordtmp.as_ptr() as * mut c_char; } if Farg != std::ptr::null_mut() { @@ -1219,7 +1214,8 @@ pub extern "C" fn r_compgen_builtin (listt:* mut WordList)->i32 old_ind = pcomp_ind; pcomp_line = std::ptr::null_mut(); pcomp_ind = 0; - sl = gen_compspec_completions (cs, CString::new("compgen").unwrap().as_ptr(), word, 0, 0, std::ptr::null_mut()); + let compgenStr=CString::new("compgen").unwrap(); + sl = gen_compspec_completions (cs, compgenStr.as_ptr(), word, 0, 0, std::ptr::null_mut()); pcomp_line = old_line; pcomp_ind = old_ind; @@ -1359,10 +1355,12 @@ pub extern "C" fn r_compopt_builtin (listt:* mut WordList)->i32 if cs == std::ptr::null_mut() { builtin_error (CString::new("%s: no completion specification").unwrap().as_ptr(), (*((*list).word)).word); ret = EXECUTION_FAILURE!(); + l = (*l).next; continue; } if opts_on == 0 && opts_off == 0 { r_print_compopts ((*((*list).word)).word, cs, 1); + l = (*l).next; continue; /* XXX -- fill in later */ } diff --git a/bash-5.1/builtins_rust/declare/src/lib.rs b/bash-5.1/builtins_rust/declare/src/lib.rs index 1e5159757fe39317f578da49a09568c85b98e710..8f171df46219022dd71353f3c21ed42eac9e5889 100644 --- a/bash-5.1/builtins_rust/declare/src/lib.rs +++ b/bash-5.1/builtins_rust/declare/src/lib.rs @@ -3,7 +3,7 @@ extern crate nix; use libc::{c_char, c_long, c_void}; use std::{ffi::CString}; -use rcommon::{WordList, WordDesc, EX_USAGE, EXECUTION_SUCCESS, EXECUTION_FAILURE}; +use rcommon::{WordList, WordDesc, EX_USAGE, EXECUTION_SUCCESS, EXECUTION_FAILURE, r_savestring}; use rhelp::r_builtin_help; use rsetattr::{show_name_attributes,set_or_show_attributes}; use std::ffi::CStr; @@ -571,12 +571,6 @@ unsafe fn DECLARE_OPTS()-> CString return CString::new("+acfgilnprtuxAFGI").unwrap(); } -unsafe fn savestring(x:* const c_char)->* mut c_char -{ - let str1:* mut c_char=libc::malloc(1 + libc::strlen (x )) as * mut c_char; - return libc::strcpy(str1,x ); -} - unsafe fn value_cell(var:*mut SHELL_VAR)->* mut c_char { return (*var).value; @@ -771,6 +765,7 @@ pub extern "C" fn r_declare_internal (mut list:* mut WordList, local_var:i32)->i return EXECUTION_SUCCESS!(); } } + let tmpValue = CString::new("").unwrap(); /* There are arguments left, so we are making variables. */ 'outter: while list !=std::ptr::null_mut() { /* declare [-aAfFirx] name [name ...] */ @@ -792,10 +787,11 @@ pub extern "C" fn r_declare_internal (mut list:* mut WordList, local_var:i32)->i let mut creating_array:i32; let mut array_subscript_assignment:i32; - name = savestring ((*(*list).word).word); + name = r_savestring ((*(*list).word).word); wflags = (*(*list).word).flags; assoc_noexpand = (assoc_expand_once !=0 && (wflags & (1 << 2)) !=0) as i32; + // 分出= if assoc_noexpand !=0 { offset = assignment (name, 2); } else { @@ -807,7 +803,9 @@ pub extern "C" fn r_declare_internal (mut list:* mut WordList, local_var:i32)->i if local_var !=0 && variable_context !=0 && STREQ (name, CString::new("-").unwrap().as_ptr()) { var = make_local_variable (CString::new("-").unwrap().as_ptr(), 0); - libc::free (value_cell (var) as * mut c_void); /* just in case */ + if value_cell(var) != std::ptr::null_mut() { + libc::free (value_cell (var) as * mut c_void); /* just in case */ + } value = get_current_options (); var_setvalue (var, value); VSETATTR (var, att_invisible!()); @@ -817,14 +815,14 @@ pub extern "C" fn r_declare_internal (mut list:* mut WordList, local_var:i32)->i } if offset !=0 { /* declare [-aAfFirx] name=value */ - *((name as usize + offset as usize) as * mut c_char) = '\0' as c_char; + *name.offset(offset as isize) = '\0' as c_char; value = (name as usize + (offset + 1) as usize) as * mut c_char; if *((name as usize + (offset - 1) as usize) as * mut c_char) == '+' as c_char { aflags |= ASS_APPEND!(); *((name as usize + (offset - 1) as usize) as * mut c_char) = '\0' as c_char; } } else { - value = CString::new("").unwrap().as_ptr() as * mut c_char; + value = tmpValue.as_ptr() as * mut c_char; } /* Do some lexical error checking on the LHS and RHS of the assignment @@ -926,7 +924,7 @@ pub extern "C" fn r_declare_internal (mut list:* mut WordList, local_var:i32)->i } else { newname = name; /* dealing with nameref attribute */ } - +// 至此,find_variable 返回var 没有被更新 /* Pass 1 as second argument to make_local_{assoc,array}_variable return an existing {array,assoc} variable to be flagged as an error below. */ @@ -1411,7 +1409,7 @@ pub extern "C" fn r_declare_internal (mut list:* mut WordList, local_var:i32)->i } else if simple_array_assign !=0 { /* let bind_{array,assoc}_variable take care of this. */ if assoc_p (var) !=0 { - bind_assoc_variable (var, name, savestring (CString::new("0").unwrap().as_ptr()), value, aflags|ASS_FORCE!()); + bind_assoc_variable (var, name, r_savestring (CString::new("0").unwrap().as_ptr()), value, aflags|ASS_FORCE!()); } else { bind_array_variable (name, 0, value, aflags|ASS_FORCE!()); } @@ -1457,14 +1455,14 @@ pub extern "C" fn r_declare_internal (mut list:* mut WordList, local_var:i32)->i variable is in the same table as the function local vars. */ if (flags_on & (att_exported!()|att_readonly!()) !=0 ) && tempvar_p (var) !=0 { let mut tv:* mut SHELL_VAR; - let tvalue:* mut c_char=std::ptr::null_mut(); + let mut tvalue:* mut c_char=std::ptr::null_mut(); tv = find_tempenv_variable ((*var).name); if tv != std::ptr::null_mut() { if var_isset(var) { - savestring (value_cell (var)); + tvalue = r_savestring (value_cell (var)); } else { - savestring (CString::new("").unwrap().as_ptr()); + tvalue = r_savestring (CString::new("").unwrap().as_ptr()); } tv = bind_variable ((*var).name, tvalue, 0); diff --git a/bash-5.1/builtins_rust/exec/src/lib.rs b/bash-5.1/builtins_rust/exec/src/lib.rs index c5954bbde0199a9df7279ccf5ab885342c385747..32a59f0a9011ebbb94308fbe41ee8ba3cb8a8afd 100644 --- a/bash-5.1/builtins_rust/exec/src/lib.rs +++ b/bash-5.1/builtins_rust/exec/src/lib.rs @@ -4,7 +4,7 @@ extern crate rcommon; use libc::{c_char,c_int, strlen, strcpy, size_t, c_void, free}; use std::ffi::{CString,CStr}; -use rcommon::{WordList, WordDesc, EX_USAGE, EXECUTION_SUCCESS, EXECUTION_FAILURE, EX_NOTFOUND, EX_NOEXEC, SUBSHELL_PAREN,r_builtin_usage}; +use rcommon::{WordList, WordDesc, EX_USAGE, EXECUTION_SUCCESS, EXECUTION_FAILURE, EX_NOTFOUND, EX_NOEXEC, SUBSHELL_PAREN,r_builtin_usage, r_savestring}; use nix::errno::errno; use rcommon::r_sh_restricted; use rhelp::r_builtin_help; @@ -49,12 +49,6 @@ pub const r_inputa_direction: r_instruction = 2; pub const r_input_direction: r_instruction = 1; pub const r_output_direction: r_instruction = 0; -#[macro_export] -macro_rules! savestring { - ($x:expr) => { - strcpy(xmalloc(1 + strlen($x)) as *mut c_char,$x) as *mut c_char - } -} #[macro_export] macro_rules! FREE { @@ -227,9 +221,9 @@ pub extern "C" fn r_exec_builtin(mut list:*mut WordList)->i32{ *args.offset(0) = r_mkdashname(argv0); } else { - *args.offset(0) = savestring!(argv0); + *args.offset(0) = r_savestring(argv0); } - exec_argv0 = savestring!(*args.offset(0)); + exec_argv0 = r_savestring(*args.offset(0)); } else if login != 0{ newname = r_mkdashname(*args.offset(0)); diff --git a/bash-5.1/builtins_rust/fc/src/lib.rs b/bash-5.1/builtins_rust/fc/src/lib.rs index aa0e6c0ee08a04abb93cb313801b1fcd931ce3a3..2d685a99ddc3cda01d4f256fd05d21da210e5ea1 100644 --- a/bash-5.1/builtins_rust/fc/src/lib.rs +++ b/bash-5.1/builtins_rust/fc/src/lib.rs @@ -4,7 +4,7 @@ extern crate nix; use libc::{c_char, c_long, c_void, c_int}; use nix::sys::termios::SpecialCharacterIndices; use std::{ffi::{CString,CStr}, i32, io::{Write, stdout}, ops::Add, string, u32}; -use rcommon::{WordList, WordDesc, EX_USAGE, EXECUTION_SUCCESS, EXECUTION_FAILURE,r_builtin_usage}; +use rcommon::{WordList, WordDesc, EX_USAGE, EXECUTION_SUCCESS, EXECUTION_FAILURE,r_builtin_usage,r_savestring}; use rhelp::r_builtin_help; #[repr(i8)] @@ -415,12 +415,6 @@ pub extern "C" fn r_fc_number(list:*mut WordList)->i32 } } -unsafe fn savestring(x:* mut c_char)->* mut c_char -{ - let str1:* mut c_char=libc::malloc(1 + libc::strlen (x as * const c_char)) as * mut c_char; - return libc::strcpy(str1,x as * const c_char); -} - unsafe fn REVERSE_LIST(list:* mut GENERIC_LIST)->* mut REPL { if list != std::ptr::null_mut() && (*list).next != std::ptr::null_mut(){ @@ -554,8 +548,8 @@ pub extern "C" fn r_fc_builtin (mut list:* mut WordList)->i32 *sep = char::from('\0') as c_char ; rl = libc::malloc ( std::mem::size_of::<& REPL>() ) as * mut REPL; (*rl).next = std::ptr::null_mut(); - (*rl).pat = savestring ((*(*list).word).word); - (*rl).rep = savestring (sep); + (*rl).pat = r_savestring ((*(*list).word).word); + (*rl).rep = r_savestring (sep); if rlist == std::ptr::null_mut(){ rlist = rl; @@ -919,7 +913,7 @@ pub extern "C" fn r_fc_gethist (command:* mut c_char, hlist:* mut * mut HIST_ENT i = r_fc_gethnum (command, hlist, mode); unsafe { if i >= 0 { - return savestring ((*(*((hlist as usize + (8*i) as usize) as * mut * mut HIST_ENTRY))).line ); + return r_savestring ((*(*((hlist as usize + (8*i) as usize) as * mut * mut HIST_ENTRY))).line ); } else { return std::ptr::null_mut(); } @@ -1067,7 +1061,7 @@ pub extern "C" fn r_fc_dosubs (command:* mut c_char, subs:* mut REPL)->* mut c_c let mut t:* mut c_char; let mut r:* mut REPL; unsafe { - new = savestring (command); + new = r_savestring (command); while subs !=std::ptr::null_mut() { r = subs; t = strsub (new, (*r).pat, (*r).rep, 1); diff --git a/bash-5.1/builtins_rust/printf/src/lib.rs b/bash-5.1/builtins_rust/printf/src/lib.rs index 1a91fa0071f281c9eeaf19cc60305ef3f84d235e..d3cc5dc3f3677983cdead9dce5d37655d2846757 100644 --- a/bash-5.1/builtins_rust/printf/src/lib.rs +++ b/bash-5.1/builtins_rust/printf/src/lib.rs @@ -2,7 +2,7 @@ use std::ffi::CStr; use std::{ffi::CString}; use libc::{size_t, c_int, c_uint, c_char, c_long, c_void, PT_NULL, c_ulong, strchr, }; -use rcommon::{r_builtin_usage,r_sh_invalidid,r_sh_wrerror,r_builtin_bind_variable,SHELL_VAR}; +use rcommon::{r_builtin_usage,r_sh_invalidid,r_sh_wrerror,r_builtin_bind_variable,SHELL_VAR, r_savestring}; include!(concat!("intercdep.rs")); @@ -52,12 +52,6 @@ static mut tw: c_long = 0; static mut garglist: *mut WordList = PT_NULL as *mut WordList; static mut orig_arglist: *mut WordList = PT_NULL as *mut WordList; -unsafe fn savestring(x:* mut c_char)->* mut c_char -{ - let str1:* mut c_char=libc::malloc(1 + libc::strlen (x as * const c_char)) as * mut c_char; - return libc::strcpy(str1,x as * const c_char); -} - #[no_mangle] pub extern "C" fn r_printf_builtin(mut list: *mut WordList) -> i32 { @@ -530,7 +524,7 @@ unsafe { let xp: *mut c_char; let p = getstr(); if !p.is_null() && *p == 0 { - xp = savestring(b"''\0".as_ptr() as *mut c_char); + xp = r_savestring(b"''\0".as_ptr() as *mut c_char); //xp = savestring(b"''\0".as_ptr() as *const c_char); } else if ansic_shouldquote(p) != 0 { xp = ansic_quote(p, 0, PT_NULL as *mut c_int); diff --git a/bash-5.1/builtins_rust/pushd/src/lib.rs b/bash-5.1/builtins_rust/pushd/src/lib.rs index 70fa17da261a20a3581f010648007619eed5785d..c8895b55969387a384c6e5b1c2dbb34efadc633b 100644 --- a/bash-5.1/builtins_rust/pushd/src/lib.rs +++ b/bash-5.1/builtins_rust/pushd/src/lib.rs @@ -4,7 +4,7 @@ extern crate nix; use libc::{c_char, c_long, c_void}; use std::{ffi::{CString,CStr}}; -use rcommon::{WordList, WordDesc, EX_USAGE, EXECUTION_SUCCESS, EXECUTION_FAILURE, EX_NOTFOUND, EX_NOEXEC, SUBSHELL_PAREN,r_builtin_usage}; +use rcommon::{WordList, WordDesc, EX_USAGE, EXECUTION_SUCCESS, EXECUTION_FAILURE, EX_NOTFOUND, EX_NOEXEC, SUBSHELL_PAREN,r_builtin_usage, r_savestring}; use rhelp::r_builtin_help; #[repr(u8)] enum command_type { cm_for, cm_case, cm_while, cm_if, cm_simple, cm_select, @@ -248,12 +248,6 @@ unsafe fn ISOPTION(s:* const c_char, c:c_char)->bool return *s == '-' as c_char && *(s.offset(1)) == c && *(s.offset(2)) == 0; } -unsafe fn savestring(x:* const c_char)->* mut c_char -{ - let str1:* mut c_char=libc::malloc(1 + libc::strlen (x )) as * mut c_char; - return libc::strcpy(str1,x ); -} - #[no_mangle] pub extern "C" fn r_pushd_builtin (listt:* mut WordList)->i32 { @@ -423,7 +417,7 @@ pub extern "C" fn r_pushd_builtin (listt:* mut WordList)->i32 if j == EXECUTION_SUCCESS!() { if (flags & NOCD!()) !=0 { - r_add_dirstack_element(savestring ((*((*list).word)).word)); + r_add_dirstack_element(r_savestring ((*((*list).word)).word)); } else { r_add_dirstack_element(current_directory); } @@ -621,7 +615,7 @@ pub extern "C" fn r_dirs_builtin (listt:* mut WordList)->i32 if index_flag == 0 || (index_flag == 1 && desired_index == 0) { temp = get_working_directory (CString::new("dirs").unwrap().as_ptr() as * mut c_char); if temp == std::ptr::null_mut() { - temp = savestring (CString::new("").unwrap().as_ptr() as * mut c_char); + temp = r_savestring (CString::new("").unwrap().as_ptr() as * mut c_char); } if (vflag & 2) !=0 { @@ -874,7 +868,7 @@ pub extern "C" fn r_set_dirstack_element (ind:libc::c_long, sign:i32, value:* mu return; } libc::free ((*((pushd_directory_list as usize + (i*8) as usize) as * mut * mut c_char)) as * mut c_void); - *((pushd_directory_list as usize + (i*8) as usize) as * mut * mut c_char) = savestring (value); + *((pushd_directory_list as usize + (i*8) as usize) as * mut * mut c_char) = r_savestring (value); } } diff --git a/bash-5.1/builtins_rust/set/src/lib.rs b/bash-5.1/builtins_rust/set/src/lib.rs index 10ec77b78ee762f2c38380491e9d693ba2357360..8e5851056d42358c601a0e054dfcf9bcbb6f0c36 100644 --- a/bash-5.1/builtins_rust/set/src/lib.rs +++ b/bash-5.1/builtins_rust/set/src/lib.rs @@ -6,7 +6,7 @@ use std::ffi::CString; use std::ptr; use std::mem; use std::io; -use rcommon::{WordList, WordDesc, EX_USAGE, EXECUTION_SUCCESS, EXECUTION_FAILURE, EX_NOTFOUND, EX_NOEXEC, SUBSHELL_PAREN,r_builtin_usage}; +use rcommon::{WordList, WordDesc, EX_USAGE, EXECUTION_SUCCESS, EXECUTION_FAILURE, EX_NOTFOUND, EX_NOEXEC, SUBSHELL_PAREN,r_builtin_usage, r_savestring}; use rhelp::r_builtin_help; #[macro_export] @@ -205,13 +205,6 @@ macro_rules! att_array{ } } -#[macro_export] -macro_rules! savestring { - ($x:expr) => { - libc::strcpy(xmalloc ((1+ strlen ($x)) as u64) as *mut libc::c_char, $x) - } -} - #[macro_export] macro_rules! value_cell { ($var:expr) => { @@ -1355,7 +1348,7 @@ unsafe fn initialize_shell_options (no_shellopts : i32) { temp = std::ptr::null_mut(); } else { - temp = savestring !(value_cell!(var)); + temp = r_savestring(value_cell!(var)); } if temp != std::ptr::null_mut() { @@ -1771,7 +1764,7 @@ pub extern "C" fn r_unset_builtin(mut list: *mut WordList) -> i32 { var = find_variable_last_nameref (name, 0); if var != std::ptr::null_mut() && nameref_p!(var) != 0 { if valid_array_reference (nameref_cell!(var), 0) != 0 { - tname = savestring!(nameref_cell!(var)); + tname = r_savestring(nameref_cell!(var)); var = array_variable_part (tname, 0, &mut t, &mut 0); if var != std::ptr::null_mut() { tem = unbind_array_element (var, t, vflags); /* XXX new third arg */ diff --git a/bash-5.1/builtins_rust/setattr/src/lib.rs b/bash-5.1/builtins_rust/setattr/src/lib.rs index 636f7627360736694b1752efce63dcba6ebd5826..fb491d1918ed9c6e2b3e347c0d269dd0fe91273c 100644 --- a/bash-5.1/builtins_rust/setattr/src/lib.rs +++ b/bash-5.1/builtins_rust/setattr/src/lib.rs @@ -164,8 +164,7 @@ unsafe { } list = (*list).next; } - } - else { + } else { let mut variable_list: *mut *mut SHELL_VAR; if (attribute & att_function) != 0 || functions_only { variable_list = all_shell_functions(); diff --git a/bash-5.1/builtins_rust/source/src/lib.rs b/bash-5.1/builtins_rust/source/src/lib.rs index ac2ebe11ff58e68174beeb42e517db0eb98cc1a2..2ec10a5ffc3e2020aec5c18fb5cc5ae297defde3 100644 --- a/bash-5.1/builtins_rust/source/src/lib.rs +++ b/bash-5.1/builtins_rust/source/src/lib.rs @@ -3,7 +3,7 @@ extern crate nix; use libc::{c_char, c_long, c_void}; use std::{ffi::CString}; -use rcommon::{WordList, WordDesc, EX_USAGE, EXECUTION_SUCCESS, EXECUTION_FAILURE, EX_NOTFOUND, EX_NOEXEC, SUBSHELL_PAREN,r_builtin_usage}; +use rcommon::{WordList, WordDesc, EX_USAGE, EXECUTION_SUCCESS, EXECUTION_FAILURE, EX_NOTFOUND, EX_NOEXEC, SUBSHELL_PAREN,r_builtin_usage, r_savestring}; use rhelp::r_builtin_help; #[repr(u8)] @@ -264,11 +264,6 @@ pub extern "C" fn r_maybe_pop_dollar_vars () } } -unsafe fn savestring(x:* mut c_char)->* mut c_char -{ - let str1:* mut c_char=libc::malloc(1 + libc::strlen (x as * const c_char)) as * mut c_char; - return libc::strcpy(str1,x as * const c_char); -} unsafe fn TRAP_STRING(s:i32)->* mut c_char { if signal_is_trapped (s) !=0 && signal_is_ignored (s) == 0 { @@ -312,9 +307,9 @@ pub extern "C" fn r_source_builtin (list:* mut WordList)->i32 filename = std::ptr::null_mut(); /* XXX -- should this be absolute_pathname? */ if posixly_correct !=0 && libc::strchr ((*(*llist).word).word, '/' as libc::c_int) != std::ptr::null_mut() { - filename = savestring ((*(*llist).word).word); + filename = r_savestring ((*(*llist).word).word); } else if absolute_pathname ((*(*llist).word).word) !=0 { - filename = savestring ((*(*llist).word).word); + filename = r_savestring ((*(*llist).word).word); } else if source_uses_path !=0 { filename = find_path_file ((*(*llist).word).word); } @@ -333,7 +328,7 @@ pub extern "C" fn r_source_builtin (list:* mut WordList)->i32 } return EXECUTION_FAILURE!(); } else { - filename = savestring ((*(*llist).word).word); + filename = r_savestring ((*(*llist).word).word); } } @@ -362,7 +357,7 @@ pub extern "C" fn r_source_builtin (list:* mut WordList)->i32 don't. */ debug_trap = TRAP_STRING (DEBUG_TRAP()); if debug_trap != std::ptr::null_mut() && function_trace_mode == 0 { - debug_trap = savestring (debug_trap); + debug_trap = r_savestring (debug_trap); let xf1:Functions=Functions{f_xfree :xfree}; add_unwind_protect (xf1, debug_trap); diff --git a/bash-5.1/builtins_rust/test/src/lib.rs b/bash-5.1/builtins_rust/test/src/lib.rs index 5b82ccb30122658ea9bc7f677917c391ee114c2a..fa3907670aacd06be5016b037f50e5c2b0b46ea8 100644 --- a/bash-5.1/builtins_rust/test/src/lib.rs +++ b/bash-5.1/builtins_rust/test/src/lib.rs @@ -1,4 +1,5 @@ use libc::{c_int, c_char, c_void}; +use std::ffi::{CStr, CString}; use rcommon::{r_make_builtin_argv,WordList}; include!(concat!("intercdep.rs")); use rhelp::r_builtin_help; @@ -18,6 +19,16 @@ unsafe { return EXECUTION_FAILURE; } let argv = r_make_builtin_argv(list, std::mem::transmute(&argc)); + /* + let mut i = 0; + let argv = r_make_builtin_argv(list, &argc as *const i32 as*mut i32); + while i<(argc) { + let tmp = CStr::from_ptr(argv as *mut c_char); + //println!("test argv={}", tmp.to_str().unwrap()); + libc::printf(CString::new("test:i=%d, argv=%s=\n").unwrap().as_ptr(), i , *argv.offset(i as isize) as *mut c_char); + i=i+1; + } + */ result = test_command(argc, argv); libc::free(argv as *mut c_void); } diff --git a/bash-5.1/dispose_cmd.c b/bash-5.1/dispose_cmd.c index c624605b5080a5ee144fe2747d72b7a3f5a59139..5b22835be43faae5267451d56cb5de538ecb119f 100644 --- a/bash-5.1/dispose_cmd.c +++ b/bash-5.1/dispose_cmd.c @@ -247,6 +247,7 @@ dispose_word (w) WORD_DESC *w; { FREE (w->word); + w->word=NULL; ocache_free (wdcache, WORD_DESC, w); } diff --git a/bash-5.1/expr.c b/bash-5.1/expr.c index bbff95e93121787fbfa785b859c3ab921332b7ae..dd6406c11a45b37d16949215d533a8b4cbe16bf2 100644 --- a/bash-5.1/expr.c +++ b/bash-5.1/expr.c @@ -1527,7 +1527,7 @@ evalerror (msg) from [0-9][a-z][A-Z]_@ (a = 10, z = 35, A = 36, Z = 61, @ = 62, _ = 63 -- you get the picture). */ -#define VALID_NUMCHAR(c) (ISALNUM(c) || ((c) == '_') || ((c) == '@')) +#define VALID_NUMCHAR(c) ( ((base==16)? ISXDIGIT(c) :((base==8)?ISOCTAL(c): DIGIT(c)) ) || ((c) == '_') || ((c) == '@')) static intmax_t strlong (num) @@ -1599,8 +1599,10 @@ strlong (num) val = (val * base) + c; } - else - break; + else { + *(s-1) = ' '; + } + //break; } return (val); diff --git a/bash-5.1/general.h b/bash-5.1/general.h index 7e4db8e6796691f2ae0aef1b98f8c97b5993d0ef..faa3b65b5c6fb324bbee1f740c03f0ecf72aeffb 100644 --- a/bash-5.1/general.h +++ b/bash-5.1/general.h @@ -169,7 +169,7 @@ typedef struct { /* More convenience definitions that possibly save system or libc calls. */ #define STRLEN(s) (((s) && (s)[0]) ? ((s)[1] ? ((s)[2] ? strlen(s) : 2) : 1) : 0) -#define FREE(s) do { if (s) free (s); } while (0) +#define FREE(s) do { if (s) free (s); s = NULL; } while (0) #define MEMBER(c, s) (((c) && c == (s)[0] && !(s)[1]) || (member(c, s))) /* A fairly hairy macro to check whether an allocated string has more room, diff --git a/bash-5.1/hashlib.c b/bash-5.1/hashlib.c index 4a7e8132bc551b8ac6d926debadb78c11da29f86..90b24d618c0c0719ab73fefac09e953e40b11003 100644 --- a/bash-5.1/hashlib.c +++ b/bash-5.1/hashlib.c @@ -152,6 +152,7 @@ hash_rehash (table, nsize) } free (old_bucket_array); + old_bucket_array = NULL; } static void @@ -397,6 +398,7 @@ hash_flush (table, free_data) free (item->data); free (item->key); free (item); + item = NULL; } table->bucket_array[i] = (BUCKET_CONTENTS *)NULL; } @@ -411,6 +413,7 @@ hash_dispose (table) { free (table->bucket_array); free (table); + table = NULL; } void @@ -526,6 +529,7 @@ main () { fprintf (stderr, "You have already added item `%s'\n", string); free (temp_string); + temp_string = NULL } else { diff --git a/bash-5.1/pcomplib.c b/bash-5.1/pcomplib.c index 075fce7374c802d3ab330e592b414c51a0b1d155..6cec7492a4c4f36f15f6457a8929e85917623cfb 100644 --- a/bash-5.1/pcomplib.c +++ b/bash-5.1/pcomplib.c @@ -85,6 +85,7 @@ compspec_dispose (cs) FREE (cs->filterpat); free (cs); + cs=NULL; } } diff --git a/bash-5.1/po/POTFILES.in b/bash-5.1/po/POTFILES.in index 2a8f369473848c8a381c21618e98adf2d6b1e1cd..94368f80487d0600076516ad8981abf0468f7de2 100644 --- a/bash-5.1/po/POTFILES.in +++ b/bash-5.1/po/POTFILES.in @@ -73,7 +73,6 @@ test.c trap.c variables.c version.c -version2.c xmalloc.c # Apparently gettext's defaults cannot handle files that exist outside of the diff --git a/bash-5.1/variables.c b/bash-5.1/variables.c index 73f157fb549ba5fa32e4967e6a2a34e9309b98ec..132bb0cc8db6394de9d462cf202a747c0ed2fc20 100644 --- a/bash-5.1/variables.c +++ b/bash-5.1/variables.c @@ -2393,7 +2393,6 @@ find_global_variable_noref (name) if (var == 0) return ((SHELL_VAR *)NULL); - return (var->dynamic_value ? (*(var->dynamic_value)) (var) : var); } @@ -2613,7 +2612,7 @@ make_local_variable (name, flags) { SHELL_VAR *new_var, *old_var, *old_ref; VAR_CONTEXT *vc; - int was_tmpvar; + int was_tmpvar = 0; char *old_value; /* We don't want to follow the nameref chain when making local variables; we @@ -2624,7 +2623,13 @@ make_local_variable (name, flags) /* local foo; local foo; is a no-op. */ old_var = find_variable (name); if (old_ref == 0 && old_var && local_p (old_var) && old_var->context == variable_context) + { + if (old_var->value) { + free(old_var->value); + old_var->value = NULL; + } return (old_var); + } /* local -n foo; local -n foo; is a no-op. */ if (old_ref && local_p (old_ref) && old_ref->context == variable_context) diff --git a/record.txt b/record.txt index 2ce6745701a789048d9ff0f2cbf4a5ffeb5dd740..eb954a199e3ddffd1f96bf99beafabe648dbef21 100644 --- a/record.txt +++ b/record.txt @@ -111,3 +111,4 @@ 110 111 112 +113