diff --git a/src/child.rs b/src/child.rs index 078b23cb..660143bc 100644 --- a/src/child.rs +++ b/src/child.rs @@ -38,7 +38,7 @@ pub fn wait_pipeline(core: &mut ShellCore, pids: Vec>, show_time(core); } set_foreground(core); - let _ = core.db.set_layer_array("PIPESTATUS", pipestatus.iter().map(|e|e.to_string()).collect(), 0); + let _ = core.db.set_array("PIPESTATUS", pipestatus.iter().map(|e|e.to_string()).collect(), None); if core.options.query("pipefail") { pipestatus.retain(|e| *e != 0); diff --git a/src/core.rs b/src/core.rs index a892e0e4..8c2b1cc4 100644 --- a/src/core.rs +++ b/src/core.rs @@ -124,7 +124,7 @@ impl ShellCore { let _ = self.db.set_param("MACHTYPE", &machtype); let _ = self.db.set_param("HOSTTYPE", &t_arch); let _ = self.db.set_param("OSTYPE", &t_os); - let _ = self.db.set_array("BASH_VERSINFO", versinfo); + let _ = self.db.set_array("BASH_VERSINFO", versinfo, None); } pub fn flip_exit_status(&mut self) { diff --git a/src/core/builtins/error b/src/core/builtins/error new file mode 100644 index 00000000..f30682bd --- /dev/null +++ b/src/core/builtins/error @@ -0,0 +1,3 @@ +../../../test/test_builtins.bash +../../../test/test_builtins.bash +../../../test/test_builtins.bash diff --git a/src/core/builtins/parameter.rs b/src/core/builtins/parameter.rs index b9c39ad4..baf5d408 100644 --- a/src/core/builtins/parameter.rs +++ b/src/core/builtins/parameter.rs @@ -50,7 +50,7 @@ fn set_local_array(arg: &str, core: &mut ShellCore, layer: usize) -> Result<(), let mut feeder = Feeder::new(arg); if feeder.scanner_name(core) == feeder.len() { // name only let name = feeder.consume(feeder.len()); - return core.db.set_layer_array(&name, vec![], layer); + return core.db.set_array(&name, vec![], Some(layer)); } let mut sub = match Substitution::parse(&mut feeder, core) { @@ -111,7 +111,7 @@ pub fn declare(core: &mut ShellCore, args: &mut Vec) -> i32 { if ! utils::is_name(&name, core) { return 1; //TODO: error message } - if let Err(e) = core.db.set_array(&name, vec![]) { + if let Err(e) = core.db.set_array(&name, vec![], None) { error::print(&e, core); return 1; } diff --git a/src/core/database.rs b/src/core/database.rs index 89dec77d..478002ac 100644 --- a/src/core/database.rs +++ b/src/core/database.rs @@ -197,12 +197,6 @@ impl DataBase { self.params[0].insert( key.to_string(), Box::new(SpecialData::from(f)) ); } - pub fn set_layer_array(&mut self, name: &str, v: Vec, layer: usize) -> Result<(), String> { - self.write_check(name)?; - self.params[layer].insert( name.to_string(), Box::new(ArrayData::from(v))); - Ok(()) - } - pub fn set_layer_assoc(&mut self, name: &str, layer: usize) -> Result<(), String> { self.write_check(name)?; self.params[layer].insert(name.to_string(), Box::new(AssocData::default())); @@ -215,7 +209,7 @@ impl DataBase { match self.params[layer].get_mut(name) { Some(d) => d.set_as_array(&pos.to_string(), val), None => { - self.set_layer_array(name, vec![], layer)?; + setter::array(self, name, vec![], layer)?; self.set_layer_array_elem(name, val, layer, pos) }, } @@ -240,9 +234,13 @@ impl DataBase { self.set_layer_assoc_elem(name, key, val, layer) } - pub fn set_array(&mut self, name: &str, v: Vec) -> Result<(), String> { - let layer = self.solve_layer(name); - self.set_layer_array(name, v, layer) + pub fn set_array(&mut self, name: &str, v: Vec, layer: Option) -> Result<(), String> { + let layer = match layer { + Some(n) => n, + None => self.solve_layer(name), + }; + + setter::array(self, name, v, layer) } pub fn set_assoc(&mut self, name: &str) -> Result<(), String> { diff --git a/src/core/database/setter.rs b/src/core/database/setter.rs index 877e607a..22759bef 100644 --- a/src/core/database/setter.rs +++ b/src/core/database/setter.rs @@ -2,8 +2,9 @@ //SPDXLicense-Identifier: BSD-3-Clause use crate::core::DataBase; -use std::{env, process}; +use crate::core::database::ArrayData; use crate::utils::{random, clock}; +use std::{env, process}; use super::getter; pub fn initialize(data: &mut DataBase) { @@ -23,7 +24,7 @@ pub fn initialize(data: &mut DataBase) { getter::special_variable(data, "SECONDS"); - data.set_array("FUNCNAME", vec![]).unwrap(); + data.set_array("FUNCNAME", vec![], None).unwrap(); } pub fn flag(db: &mut DataBase, name: &str, flag: char) { @@ -35,3 +36,8 @@ pub fn flag(db: &mut DataBase, name: &str, flag: char) { } } +pub fn array(db: &mut DataBase, name: &str, v: Vec, layer: usize) -> Result<(), String> { + db.write_check(name)?; + db.params[layer].insert( name.to_string(), Box::new(ArrayData::from(v))); + Ok(()) +} diff --git a/src/elements/command/function_def.rs b/src/elements/command/function_def.rs index 164f150e..9ebf5b97 100644 --- a/src/elements/command/function_def.rs +++ b/src/elements/command/function_def.rs @@ -56,7 +56,7 @@ impl FunctionDefinition { core: &mut ShellCore) -> Option { let mut array = core.db.get_array_all("FUNCNAME"); array.insert(0, args[0].clone()); - let _ = core.db.set_array("FUNCNAME", array); + let _ = core.db.set_array("FUNCNAME", array, None); let len = core.db.position_parameters.len(); args[0] = core.db.position_parameters[len-1][0].clone(); @@ -76,7 +76,7 @@ impl FunctionDefinition { //core.db.set_param("#", &number); let mut array = core.db.get_array_all("FUNCNAME"); array.remove(0); - let _ = core.db.set_array("FUNCNAME", array); + let _ = core.db.set_array("FUNCNAME", array, None); return pid; } diff --git a/src/elements/substitution.rs b/src/elements/substitution.rs index 40d00bc6..a57fd42e 100644 --- a/src/elements/substitution.rs +++ b/src/elements/substitution.rs @@ -83,7 +83,7 @@ impl Substitution { } match (&self.evaluated_array, index) { - (Some(a), None) => core.db.set_layer_array(&self.name, a.clone(), layer), + (Some(a), None) => core.db.set_array(&self.name, a.clone(), Some(layer)), _ => Err("evaluation error 2".to_string()), } } @@ -99,7 +99,7 @@ impl Substitution { } match &self.evaluated_array { - Some(data) => core.db.set_layer_array(&self.name, data.to_vec(), layer), + Some(data) => core.db.set_array(&self.name, data.to_vec(), Some(layer)), _ => Err("evaluation error 3".to_string()), } } diff --git a/src/feeder/terminal/completion.rs b/src/feeder/terminal/completion.rs index d849bf50..7e7f8a91 100644 --- a/src/feeder/terminal/completion.rs +++ b/src/feeder/terminal/completion.rs @@ -50,7 +50,7 @@ fn is_dir(s: &str, core: &mut ShellCore) -> bool { impl Terminal { pub fn completion(&mut self, core: &mut ShellCore, tab_num: usize) { self.escape_at_completion = true; - let _ = core.db.set_array("COMPREPLY", vec![]); + let _ = core.db.set_array("COMPREPLY", vec![], None); self.set_completion_info(core); if ! Self::set_custom_compreply(core).is_ok() @@ -121,7 +121,7 @@ impl Terminal { } let tmp: Vec = list.iter().map(|p| p.replacen(&tilde_path, &tilde_prefix, 1)).collect(); - core.db.set_array("COMPREPLY", tmp) + core.db.set_array("COMPREPLY", tmp, None) } fn make_default_compreply(&mut self, core: &mut ShellCore, args: &mut Vec, @@ -328,7 +328,7 @@ impl Terminal { words_all = words_all[from..].to_vec(); words_left = words_left[from..].to_vec(); - let _ = core.db.set_array("COMP_WORDS", words_all); + let _ = core.db.set_array("COMP_WORDS", words_all, None); let mut num = words_left.len(); match left_string.chars().last() { diff --git a/test/ok b/test/ok index 1bd62e29..dca1e47d 100644 --- a/test/ok +++ b/test/ok @@ -6,6 +6,6 @@ ./test_builtins.bash ./test_others.bash ./test_calculation.bash -./test_parameters.bash ./test_compound.bash +./test_parameters.bash ./test_job.bash