Skip to content

Commit 0739200

Browse files
committed
add index get from HashVar vecs
var <name_vec> int vec lx/rv/var <name> >> [lx/rv/var stuff/<number>] var <name_vec> str vec string/lxstring/var <name> >> [lx/rv/var something/<number>]
1 parent a37a03b commit 0739200

File tree

1 file changed

+77
-0
lines changed

1 file changed

+77
-0
lines changed

src/funcs/var.rs

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,32 @@ pub fn var(
6767
errors::args_error(b, l);
6868
}
6969
// var <name_vec> str vec string/lxstring/var <name> >> [2]
70+
if cmd[4] == "string" || cmd[4] == "lxstring" || cmd[4] == "var" {
71+
72+
let mut var_vec: Vec<String> = vec![];
73+
match hash_vars.hash_str_vec.get(cmd[1]) {
74+
Some(value) => var_vec = value.to_vec(),
75+
_ => errors::var_error(cmd[7].trim(), b, l),
76+
}
77+
78+
let lits: Vec<&str> = statement.split(">>").collect();
79+
let data_vec = lits[1].trim();
80+
let slice = &data_vec[1..data_vec.len() - 1];
81+
let index: usize = ret_index(slice.trim(), vars, hash_vars, b, l);
82+
if index >= var_vec.len() {
83+
errors::invalid_index(b, l, index);
84+
}
85+
86+
if cmd[4] == "string" {
87+
vars.string = var_vec[index].clone();
88+
} else if cmd[4] == "lxstring" {
89+
vars.lxstring = var_vec[index].clone();
90+
} else if cmd[4] == "var" {
91+
hash_vars.hash_str.insert(cmd[5].to_string(), var_vec[index].clone());
92+
}
93+
} else {
94+
errors::args_error(b, l);
95+
}
7096
}
7197
} else {
7298
let lits: Vec<&str> = statement.split(">>").collect();
@@ -126,6 +152,32 @@ pub fn var(
126152
errors::args_error(b, l);
127153
}
128154
// var <name_vec> int vec lx/rv/var <name> >> [2]
155+
if cmd[4] == "lx" || cmd[4] == "rv" || cmd[4] == "var" {
156+
157+
let mut var_vec: Vec<f64> = vec![];
158+
match hash_vars.hash_int_vec.get(cmd[1]) {
159+
Some(value) => var_vec = value.to_vec(),
160+
_ => errors::var_error(cmd[7].trim(), b, l),
161+
}
162+
163+
let lits: Vec<&str> = statement.split(">>").collect();
164+
let data_vec = lits[1].trim();
165+
let slice = &data_vec[1..data_vec.len() - 1];
166+
let index: usize = ret_index(slice.trim(), vars, hash_vars, b, l);
167+
if index >= var_vec.len() {
168+
errors::invalid_index(b, l, index);
169+
}
170+
171+
if cmd[4] == "lx" {
172+
vars.lx = var_vec[index].clone();
173+
} else if cmd[4] == "rv" {
174+
vars.rv = var_vec[index].clone();
175+
} else if cmd[4] == "var" {
176+
hash_vars.hash_int.insert(cmd[5].to_string(), var_vec[index].clone());
177+
}
178+
} else {
179+
errors::args_error(b, l);
180+
}
129181
}
130182
} else {
131183
let lits: Vec<&str> = statement.split(">>").collect();
@@ -247,3 +299,28 @@ pub fn movefn(cmd: Vec<&str>, vars: &mut Vars, hash_vars: &mut HashVars, b: usiz
247299
errors::args_error(b, l);
248300
}
249301
}
302+
303+
fn ret_index(str_idx: &str, vars: &mut Vars, hash_vars: &mut HashVars, b: usize, l: u32) -> usize {
304+
if str_idx.trim().len() == 1 {
305+
if str_idx == "lx" || str_idx == "rv" {
306+
if str_idx == "lx" {
307+
let index: usize = errors::parse_usize(vars.lx.to_string().trim(), b, l);
308+
return index;
309+
} else {
310+
let index: usize = errors::parse_usize(vars.rv.to_string().trim(), b, l);
311+
return index;
312+
}
313+
} else {
314+
let index: usize = errors::parse_usize(str_idx, b, l);
315+
return index;
316+
}
317+
} else {
318+
let mut index_n: usize = 0;
319+
let str_idx_vec: Vec<&str> = str_idx.split(" ").collect();
320+
match hash_vars.hash_int.get(str_idx_vec[1].to_string().trim()) {
321+
Some(&value) => index_n = errors::parse_usize(value.to_string().trim(), b, l),
322+
_ => errors::var_error(str_idx_vec[1].trim(), b, l),
323+
}
324+
return index_n;
325+
}
326+
}

0 commit comments

Comments
 (0)