@@ -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