diff --git a/bash-5.1/r_variables/src/lib.rs b/bash-5.1/r_variables/src/lib.rs index 667d637bc72e8d2bc03e3d2b4c1895586d4870d0..3023ddb385c43e9203aa1524161543a06a96efcc 100644 --- a/bash-5.1/r_variables/src/lib.rs +++ b/bash-5.1/r_variables/src/lib.rs @@ -3,8 +3,12 @@ use r_bash::*; use std::ffi::CStr; extern "C" { - fn xmalloc(_: size_t) -> *mut libc::c_void; - fn parse_and_execute( + fn xmalloc(_: size_t) -> *mut libc::c_void; + fn hash_create(_: libc::c_int) -> *mut HASH_TABLE; + static mut shell_start_time: time_t; + static mut shellstart: timeval; + fn absolute_program(_: *const libc::c_char) -> libc::c_int; + fn parse_and_execute( _: *mut libc::c_char, _: *const libc::c_char, _: libc::c_int, @@ -33,6 +37,66 @@ pub unsafe extern "C" fn bind_variable( while !vc.is_null() { if vc_isfuncenv!(vc) || vc_isbltnenv!(vc) { + v = hash_lookup(name, (*vc).table); + nvc = vc; + + if !v.is_null() && nameref_p!(v)!= 0 { + nv = find_variable_nameref_context(v, vc, &mut nvc); + if nv.is_null() { + nv = find_variable_last_nameref_context(v, vc, &mut nvc); + if !nv.is_null() && nameref_p!(nv) != 0 { + if nameref_cell!(nv).is_null() { + return bind_variable_internal( + (*nv).name, + value, + (*nvc).table, + 0 as libc::c_int, + flags, + ) + } else if valid_array_reference(nameref_cell!(nv), 0 as libc::c_int) + != 0 + { + return assign_array_element(nameref_cell!(nv), value, flags) + } else { + return bind_variable_internal( + nameref_cell!(nv), + value, + (*nvc).table, + 0 as libc::c_int, + flags, + ) + } + } else if nv == &mut nameref_maxloop_value as *mut SHELL_VAR { + internal_warning( + b"%s: circular name reference\0" as *const u8 + as *const libc::c_char, + (*v).name, + ); + return bind_global_variable((*v).name, value, flags); + } else { + v = nv; + } + } else if nv == &mut nameref_maxloop_value as *mut SHELL_VAR { + internal_warning( + + b"%s: circular name reference\0" as *const u8 + as *const libc::c_char, + (*v).name, + ); + return bind_global_variable((*v).name, value, flags); + } else { + v = nv; + } + } + if !v.is_null() { + return bind_variable_internal( + (*v).name, + value, + (*nvc).table, + 0 as libc::c_int, + flags, + ); + } } } @@ -44,3 +108,16 @@ pub struct saved_dollar_vars { pub count: libc::c_int, } +#[macro_export] +macro_rules! vc_isfuncenv { + ($vc:expr) => { + ((*$vc).flags & VC_FUNCENV as libc::c_int) != 0 + } +} + +#[macro_export] +macro_rules! vc_istempenv { + ($vc:expr) => { + ((*$vc).flags & VC_TEMPFLAGS as libc::c_int) == VC_TEMPFLAGS as libc::c_int + } +}