@@ -1559,6 +1559,7 @@ void cmd_for_in(bcip_t true_ip, bcip_t false_ip, var_p_t var_p) {
15591559 node .x .vfor .var_ptr = var_p ;
15601560 node .x .vfor .to_expr_ip = prog_ip ;
15611561 node .x .vfor .flags = 0 ;
1562+ node .x .vfor .str_ptr = NULL ;
15621563
15631564 if (code_isvar ()) {
15641565 // array variable
@@ -1575,6 +1576,7 @@ void cmd_for_in(bcip_t true_ip, bcip_t false_ip, var_p_t var_p) {
15751576 switch (new_var -> type ) {
15761577 case V_MAP :
15771578 case V_ARRAY :
1579+ case V_STR :
15781580 break ;
15791581
15801582 default :
@@ -1605,6 +1607,13 @@ void cmd_for_in(bcip_t true_ip, bcip_t false_ip, var_p_t var_p) {
16051607 }
16061608 break ;
16071609
1610+ case V_STR :
1611+ var_elem_ptr = node .x .vfor .str_ptr = v_new ();
1612+ v_init_str (var_elem_ptr , 1 );
1613+ var_elem_ptr -> v .p .ptr [0 ] = array_p -> v .p .ptr [0 ];
1614+ var_elem_ptr -> v .p .ptr [1 ] = '\0' ;
1615+ break ;
1616+
16081617 default :
16091618 break ;
16101619 }
@@ -1797,6 +1806,20 @@ void cmd_until() {
17971806 v_free (& var );
17981807}
17991808
1809+ //
1810+ // FOR chr in str
1811+ //
1812+ var_t * cmd_next_for_in_str (stknode_t * node ) {
1813+ var_t * result = NULL ;
1814+ var_t * array_p = node -> x .vfor .arr_ptr ;
1815+ int index = ++ node -> x .vfor .step_expr_ip ;
1816+ if (index < v_strlen (array_p )) {
1817+ result = node -> x .vfor .str_ptr ;
1818+ result -> v .p .ptr [0 ] = array_p -> v .p .ptr [index ];
1819+ }
1820+ return result ;
1821+ }
1822+
18001823//
18011824// FOR [EACH] v1 IN v2
18021825//
@@ -1808,6 +1831,10 @@ void cmd_next_for_in(stknode_t *node, bcip_t next_ip) {
18081831 var_t * var_p = node -> x .vfor .var_ptr ;
18091832
18101833 switch (array_p -> type ) {
1834+ case V_STR :
1835+ var_elem_ptr = cmd_next_for_in_str (node );
1836+ break ;
1837+
18111838 case V_MAP :
18121839 var_elem_ptr = map_elem_key (array_p , ++ node -> x .vfor .step_expr_ip );
18131840 break ;
@@ -1834,6 +1861,11 @@ void cmd_next_for_in(stknode_t *node, bcip_t next_ip) {
18341861 v_free (node -> x .vfor .arr_ptr );
18351862 v_detach (node -> x .vfor .arr_ptr );
18361863 }
1864+ if (node -> x .vfor .str_ptr ) {
1865+ v_free (node -> x .vfor .str_ptr );
1866+ v_detach (node -> x .vfor .str_ptr );
1867+ node -> x .vfor .str_ptr = NULL ;
1868+ }
18371869 code_jump (next_ip );
18381870 }
18391871}
0 commit comments