Skip to content

Commit e956c0d

Browse files
committed
COMMON: added ref var type
1 parent b1f7266 commit e956c0d

File tree

19 files changed

+223
-136
lines changed

19 files changed

+223
-136
lines changed

ChangeLog

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
2014-08-30
2+
Added reference variable type
3+
Fixed HASH var handling with parenthesis
4+
15
2014-08-22
26
Fix HASH var crash
37
Fix HASH var handling of mixed types

configure.ac

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ dnl This program is distributed under the terms of the GPL v2.0
77
dnl Download the GNU Public License (GPL) from www.gnu.org
88
dnl
99

10-
AC_INIT([smallbasic], [0.11.13])
10+
AC_INIT([smallbasic], [0.11.14])
1111
AC_CONFIG_SRCDIR([configure.ac])
1212

1313
AC_CANONICAL_TARGET

debian/changelog

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
smallbasic (0.11.14) unstable; urgency=low
2+
* Added reference variable type
3+
4+
-- Chris Warren-Smith <cwarrensmith@gmail.com> Sat, 30 August 2014 09:45:25 +1000
5+
16
smallbasic (0.11.13) unstable; urgency=low
27
* Fixed UDS handling
38

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
cat= cat
2+
dog= dog
3+
3= 3
4+
1= 1
5+
a=b a=b
6+
a<>b a<>b
7+
[NAME=kitchen]
8+
[NAME=hall]
9+
[NAME=Kitchen,FRIDGE=empty]
10+
[NAME=toilet,OCCUPIED=-1]
11+
[NAME=Kitchen,FRIDGE=empty]
12+
[NAME=hall]
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
' reference variable tests
2+
3+
a = "cat"
4+
b = @a
5+
6+
print "cat=", b
7+
a = "dog"
8+
print "dog=", b
9+
print "3=", len(b)
10+
print "1=", not empty(b)
11+
print "a=b", iFF(a==b, "a=b", "a<>b")
12+
13+
b = "goodbye a"
14+
print "a<>b", iFF(a==b, "a=b", "a<>b")
15+
16+
dim rooms
17+
sub addRoom(byref room)
18+
rooms << @room
19+
end
20+
21+
dim kitchen,hall,toilet
22+
kitchen.name= "kitchen"
23+
hall.name = "hall"
24+
toilet.name ="toilet"
25+
26+
addRoom(kitchen)
27+
addRoom(hall)
28+
29+
print rooms(0)
30+
print rooms(1)
31+
32+
kitchen.name = "Kitchen"
33+
kitchen.fridge = "empty"
34+
print rooms(0)
35+
36+
insert rooms, 0, @toilet
37+
toilet.occupied = true
38+
39+
print rooms(0)
40+
print rooms(1)
41+
print rooms(2)
42+

samples/distro-examples/tests/uds.bas

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,4 +82,9 @@ if (my_pet.color != "black") then
8282
? "error assigning structure 11"
8383
fi
8484

85+
my_pet.x = 10
86+
if ((my_pet.x + 1) < 10) then
87+
? "wrong !"
88+
fi
89+
8590
? "end of test"

src/common/blib.c

Lines changed: 65 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ void cmd_let(int allowConst) {
3636
return;
3737
}
3838

39-
if (prog_source[prog_ip] == kwTYPE_CMPOPR &&
39+
if (prog_source[prog_ip] == kwTYPE_CMPOPR &&
4040
prog_source[prog_ip + 1] == '=') {
4141
code_skipopr();
4242
}
@@ -173,12 +173,11 @@ void cmd_redim() {
173173
* A << x1 [, x2, ...]
174174
*/
175175
void cmd_ladd() {
176-
var_t *var_p, *elem_p, *arg_p;
177-
178-
var_p = code_getvarptr();
176+
var_t *var_p = code_getvarptr();
179177
if (prog_error) {
180178
return;
181179
}
180+
182181
if (code_peek() == kwTYPE_CMPOPR && prog_source[prog_ip + 1] == '=') {
183182
// compatible with LET, operator format
184183
code_skipopr();
@@ -190,30 +189,37 @@ void cmd_ladd() {
190189
return;
191190
}
192191

193-
// data
194-
arg_p = v_new();
192+
// for each argument to append
193+
var_t *arg_p = v_new();
195194
do {
196-
// get parameter on arg_p
195+
// get the value to append
197196
v_free(arg_p);
198197

198+
int byref = 0;
199199
if (code_peek() == kwBYREF) {
200200
code_skipnext();
201-
v_eval_ref(var_p);
201+
byref = 1;
202202
} else {
203203
eval(arg_p);
204-
if (prog_error) {
205-
break;
206-
}
207-
208-
// append data
209-
if (var_p->type != V_ARRAY) {
210-
v_toarray1(var_p, 1);
211-
elem_p = (var_t *) var_p->v.a.ptr;
212-
} else {
213-
v_resize_array(var_p, var_p->v.a.size + 1);
214-
elem_p = (var_t *) (var_p->v.a.ptr + (sizeof(var_t) * (var_p->v.a.size - 1)));
215-
}
216-
204+
}
205+
if (prog_error) {
206+
break;
207+
}
208+
209+
// find the array element
210+
var_t *elem_p;
211+
if (var_p->type != V_ARRAY) {
212+
v_toarray1(var_p, 1);
213+
elem_p = (var_t *)var_p->v.a.ptr;
214+
} else {
215+
v_resize_array(var_p, var_p->v.a.size + 1);
216+
elem_p = (var_t *)(var_p->v.a.ptr + (sizeof(var_t) * (var_p->v.a.size - 1)));
217+
}
218+
219+
// set the value onto the element
220+
if (byref) {
221+
v_eval_ref(elem_p);
222+
} else {
217223
v_set(elem_p, arg_p);
218224
}
219225

@@ -226,7 +232,6 @@ void cmd_ladd() {
226232
break;
227233
}
228234
}
229-
230235
} while (1);
231236

232237
// cleanup
@@ -238,23 +243,22 @@ void cmd_ladd() {
238243
* INSERT A, index, v1 [, vN]
239244
*/
240245
void cmd_lins() {
241-
var_t *var_p, *elem_p, *arg_p;
242-
int idx, ladd, i;
243-
244-
var_p = code_getvarptr();
246+
var_t *var_p = code_getvarptr();
245247
if (prog_error) {
246248
return;
247249
}
248250
par_getcomma();
249251
if (prog_error) {
250252
return;
251253
}
254+
252255
// convert to array
253256
if (var_p->type != V_ARRAY) {
254257
v_toarray1(var_p, 0);
255258
}
259+
256260
// get 'index'
257-
idx = par_getint();
261+
int idx = par_getint();
258262
if (prog_error) {
259263
return;
260264
}
@@ -264,42 +268,59 @@ void cmd_lins() {
264268
if (prog_error) {
265269
return;
266270
}
267-
// if ( (idx > var_p->v.a.size) || (idx < 0) ) {
268-
// err_out_of_range();
269-
// return;
270-
// }
271271

272-
ladd = 0;
272+
int ladd = 0;
273273
if (idx >= var_p->v.a.size) {
274-
ladd = 1; // append
274+
// append
275+
ladd = 1;
275276
idx = var_p->v.a.size;
276277
} else if (idx <= 0) {
277-
idx = 0; // insert at top
278+
// insert at top
279+
idx = 0;
278280
}
279-
// data
280-
arg_p = v_new();
281+
282+
// for each argument to insert
283+
var_t *arg_p = v_new();
281284
do {
282-
// get parameter on arg_p
285+
// get the value to append
283286
v_free(arg_p);
284-
eval(arg_p);
287+
288+
int byref = 0;
289+
if (code_peek() == kwBYREF) {
290+
code_skipnext();
291+
byref = 1;
292+
} else {
293+
eval(arg_p);
294+
}
285295
if (prog_error) {
286296
break;
287297
}
298+
288299
// resize +1
289300
v_resize_array(var_p, var_p->v.a.size + 1);
290301

291-
if (ladd) { // append
292-
elem_p = (var_t *) (var_p->v.a.ptr + (sizeof(var_t) * (var_p->v.a.size - 1)));
302+
// find the array element
303+
var_t *elem_p;
304+
if (ladd) {
305+
// append
306+
elem_p = (var_t *)(var_p->v.a.ptr + (sizeof(var_t) * (var_p->v.a.size - 1)));
293307
} else {
294308
// move all form idx one down
309+
int i;
295310
for (i = var_p->v.a.size - 1; i > idx; i--) {
296311
// A(i) = A(i-1)
297-
v_set((var_t *) (var_p->v.a.ptr + (sizeof(var_t) * i)),
298-
(var_t *) (var_p->v.a.ptr + (sizeof(var_t) * (i - 1))));
312+
v_set((var_t *)(var_p->v.a.ptr + (sizeof(var_t) * i)),
313+
(var_t *)(var_p->v.a.ptr + (sizeof(var_t) * (i - 1))));
299314
}
300-
elem_p = (var_t *) (var_p->v.a.ptr + (sizeof(var_t) * idx));
315+
elem_p = (var_t *)(var_p->v.a.ptr + (sizeof(var_t) * idx));
316+
}
317+
318+
// set the value onto the element
319+
if (byref) {
320+
v_eval_ref(elem_p);
321+
} else {
322+
v_set(elem_p, arg_p);
301323
}
302-
v_set(elem_p, arg_p);
303324

304325
// next parameter
305326
if (code_peek() != kwTYPE_SEP) {

src/common/blib_func.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2163,8 +2163,9 @@ void cmd_genfunc(long funcCode, var_t * r) {
21632163
v_set(r, &arg); // set the false value
21642164
v_free(&arg);
21652165
}
2166-
} else
2166+
} else {
21672167
par_skip();
2168+
}
21682169
}
21692170
break;
21702171
//

src/common/ceval.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,15 +68,12 @@ void cev_prim() {
6868
case kwTYPE_CALL_UDP:
6969
cev_udp();
7070
break;
71-
7271
case kwTYPE_PTR:
7372
bc_add_n(bc_out, bc_in->ptr + bc_in->cp, ADDRSZ); // addr
7473
IP += ADDRSZ;
7574
bc_add_n(bc_out, bc_in->ptr + bc_in->cp, ADDRSZ); // return var
7675
IP += ADDRSZ;
7776
break;
78-
79-
case kwTYPE_UDS_EL:
8077
case kwTYPE_VAR:
8178
bc_add_n(bc_out, bc_in->ptr + bc_in->cp, ADDRSZ); // 1 addr
8279
IP += ADDRSZ;
@@ -104,6 +101,7 @@ void cev_prim() {
104101
}
105102

106103
if (CODE_PEEK() != kwTYPE_LEVEL_END) {
104+
fprintf(stderr, "1\n");
107105
cev_missing_rp();
108106
} else {
109107
cev_add1(kwTYPE_LEVEL_END);
@@ -149,6 +147,9 @@ void cev_prim() {
149147
}
150148

151149
if (CODE_PEEK() == kwTYPE_UDS_EL) {
150+
// code + string
151+
cev_add1(CODE(IP));
152+
IP++;
152153
cev_prim();
153154
} else if (CODE_PEEK() != kwTYPE_LEVEL_END) {
154155
cev_missing_rp();
@@ -183,6 +184,9 @@ void cev_parenth() {
183184
cev_add1(CODE(IP));
184185
IP++;
185186
} else if (CODE_PEEK() == kwTYPE_UDS_EL) {
187+
// code + string
188+
cev_add1(CODE(IP));
189+
IP++;
186190
cev_prim();
187191
} else if (CODE_PEEK() != kwTYPE_LEVEL_END) {
188192
cev_missing_rp();

src/common/eval.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -651,7 +651,23 @@ static inline void eval_shortc(var_t *r, addr_t addr, byte op) {
651651
}
652652
}
653653

654+
var_t *eval_ref_var(var_t *var_p) {
655+
var_t *result = var_p;
656+
while (result->type == V_REF) {
657+
if (result->v.ref == var_p) {
658+
// circular referance error
659+
result = NULL;
660+
err_ref_var();
661+
break;
662+
} else {
663+
result = result->v.ref;
664+
}
665+
}
666+
return result;
667+
}
668+
654669
static inline void eval_var(var_t *r, var_t *var_p) {
670+
var_t *var_deref;
655671
switch (var_p->type) {
656672
case V_PTR:
657673
r->type = var_p->type;
@@ -671,6 +687,12 @@ static inline void eval_var(var_t *r, var_t *var_p) {
671687
case V_HASH:
672688
v_set(r, var_p);
673689
break;
690+
case V_REF:
691+
var_deref = eval_ref_var(var_p);
692+
if (var_deref != NULL) {
693+
eval_var(r, var_deref);
694+
}
695+
break;
674696
}
675697
}
676698

0 commit comments

Comments
 (0)