Skip to content

Commit b6a0cf4

Browse files
committed
COMMON: implemented FOR char in str
1 parent c65a3a7 commit b6a0cf4

File tree

5 files changed

+45
-1
lines changed

5 files changed

+45
-1
lines changed

ChangeLog

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
2019-03-02 (0.12.15)
2+
COMMON: Implemented - FOR character IN string
3+
14
2019-03-02 (0.12.15)
25
ANDROID: In editor, hide status when scrolled
36

samples/distro-examples/tests/strings.bas

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,3 +181,11 @@ s= "a\c\e"
181181
if mid(s, 2, 1) != "\\" then throw s
182182
if mid(s, 4, 1) != "\\" then throw s
183183

184+
REM FOR character IN string
185+
s1 = "cats"
186+
s2 = ""
187+
for c in s1
188+
s2 += c
189+
next c
190+
if (s1 <> s2) then throw s2
191+

src/common/blib.c

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

src/common/var.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ typedef struct stknode_s {
107107
struct {
108108
var_t *var_ptr; /**< 'FOR' variable */
109109
var_t *arr_ptr; /**< FOR-IN array-variable */
110+
var_t *str_ptr; /**< FOR-IN string variable */
110111
bcip_t to_expr_ip; /**< IP of 'TO' expression */
111112
bcip_t step_expr_ip; /**< IP of 'STEP' expression (FOR-IN = current element) */
112113
bcip_t jump_ip; /**< code block IP */

src/platform/android/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ buildscript {
55
jcenter()
66
}
77
dependencies {
8-
classpath 'com.android.tools.build:gradle:3.3.1'
8+
classpath 'com.android.tools.build:gradle:3.3.2'
99
classpath "com.github.ben-manes:gradle-versions-plugin:0.20.0"
1010
}
1111
}

0 commit comments

Comments
 (0)