Skip to content

Commit 0f9e3d3

Browse files
authored
Merge pull request #64 from chrisws/0_12_11
0 12 11
2 parents 628da62 + b18dba2 commit 0f9e3d3

File tree

2 files changed

+41
-7
lines changed

2 files changed

+41
-7
lines changed

samples/distro-examples/tests/strings.bas

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,3 +152,23 @@ rem --- test line numbers are correctly maintained when using multiline strings
152152
if (PROGLINE != 152) then
153153
throw "invalid line no"
154154
endif
155+
156+
rem -- invalid input
157+
sub cmd_str1(n)
158+
x=chr(n)
159+
x=str(n)
160+
x=oct(n)
161+
x=bin(n)
162+
x=hex(n)
163+
x=lcase(n)
164+
x=ucase(n)
165+
x=ltrim(n)
166+
x=rtrim(n)
167+
x=trim(n)
168+
x=cat(n)
169+
x=tab(n)
170+
end
171+
cmd_str1("")
172+
cmd_str1(0)
173+
174+

src/common/blib_func.c

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -933,6 +933,10 @@ void cmd_str1(long funcCode, var_t *arg, var_t *r) {
933933
// str <- CBS$(str)
934934
// convert C-Style string to BASIC-style string
935935
//
936+
if (!v_is_type(arg, V_STR)) {
937+
v_init(r);
938+
break;
939+
}
936940
r->v.p.ptr = cstrdup(arg->v.p.ptr);
937941
r->v.p.length = strlen(r->v.p.ptr) + 1;
938942
break;
@@ -941,6 +945,10 @@ void cmd_str1(long funcCode, var_t *arg, var_t *r) {
941945
// str <- BCS$(str)
942946
// convert BASIC-Style string to C-style string
943947
//
948+
if (!v_is_type(arg, V_STR)) {
949+
v_init(r);
950+
break;
951+
}
944952
r->v.p.ptr = bstrdup(arg->v.p.ptr);
945953
r->v.p.length = strlen(r->v.p.ptr) + 1;
946954
break;
@@ -983,32 +991,34 @@ void cmd_str1(long funcCode, var_t *arg, var_t *r) {
983991
//
984992
// str <- LCASE$(s)
985993
//
986-
r->v.p.ptr = (char *)malloc(strlen(arg->v.p.ptr) + 1);
987-
strcpy(r->v.p.ptr, arg->v.p.ptr);
994+
r->v.p.ptr = v_str(arg);
995+
r->v.p.length = strlen(r->v.p.ptr) + 1;
988996
p = r->v.p.ptr;
989997
while (*p) {
990998
*p = to_lower(*p);
991999
p++;
9921000
}
993-
r->v.p.length = arg->v.p.length;
9941001
break;
9951002
case kwUCASE:
9961003
//
9971004
// str <- UCASE$(s)
9981005
//
999-
r->v.p.ptr = (char *)malloc(strlen(arg->v.p.ptr) + 1);
1000-
strcpy(r->v.p.ptr, arg->v.p.ptr);
1006+
r->v.p.ptr = v_str(arg);
1007+
r->v.p.length = strlen(r->v.p.ptr) + 1;
10011008
p = r->v.p.ptr;
10021009
while (*p) {
10031010
*p = to_upper(*p);
10041011
p++;
10051012
}
1006-
r->v.p.length = arg->v.p.length;
10071013
break;
10081014
case kwLTRIM:
10091015
//
10101016
// str <- LTRIM$(s)
10111017
//
1018+
if (!v_is_type(arg, V_STR)) {
1019+
v_init(r);
1020+
break;
1021+
}
10121022
p = arg->v.p.ptr;
10131023
while (is_wspace(*p)) {
10141024
p++;
@@ -1025,6 +1035,10 @@ void cmd_str1(long funcCode, var_t *arg, var_t *r) {
10251035
//
10261036
// str <- RTRIM$(s)
10271037
//
1038+
if (!v_is_type(arg, V_STR)) {
1039+
v_init(r);
1040+
break;
1041+
}
10281042
p = arg->v.p.ptr;
10291043
if (*p != '\0') {
10301044
while (*p) {
@@ -1131,7 +1145,7 @@ void cmd_str1(long funcCode, var_t *arg, var_t *r) {
11311145
//
11321146
// str <- ENVIRON$(str)
11331147
//
1134-
if (*arg->v.p.ptr != '\0') {
1148+
if (v_is_type(arg, V_STR) && *arg->v.p.ptr != '\0') {
11351149
// return the variable
11361150
const char *v = dev_getenv(arg->v.p.ptr);
11371151
if (v) {

0 commit comments

Comments
 (0)