Skip to content

Commit abd0534

Browse files
committed
COMMON: fix uds regression
1 parent 9044646 commit abd0534

File tree

4 files changed

+109
-106
lines changed

4 files changed

+109
-106
lines changed

src/common/ceval.c

Lines changed: 98 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,11 @@ void cev_udp(void) {
2828
}
2929

3030
void cev_missing_rp(void) {
31-
sc_raise("(EXPR): MISSING ')' %d", IP);
31+
sc_raise("(EXPR): MISSING ')'");
3232
}
3333

3434
void cev_opr_err(void) {
35-
sc_raise("(EXPR): SYNTAX ERROR (1st OP)");
35+
sc_raise("(EXPR): SYNTAX ERROR");
3636
}
3737

3838
void cev_prim_str() {
@@ -44,6 +44,96 @@ void cev_prim_str() {
4444
IP += len;
4545
}
4646

47+
void cev_prim_uds() {
48+
while (CODE_PEEK() == kwTYPE_UDS_EL) {
49+
cev_add1(kwTYPE_UDS_EL);
50+
cev_add1(kwTYPE_STR);
51+
IP += 2;
52+
cev_prim_str();
53+
}
54+
}
55+
56+
void cev_prim_var() {
57+
bc_add_n(bc_out, bc_in->ptr + bc_in->cp, ADDRSZ);
58+
IP += ADDRSZ;
59+
60+
cev_prim_uds();
61+
62+
// support multiple ()
63+
while (CODE_PEEK() == kwTYPE_LEVEL_BEGIN) {
64+
cev_add1(kwTYPE_LEVEL_BEGIN);
65+
IP++;
66+
if (CODE_PEEK() == kwTYPE_LEVEL_END) {
67+
// NULL ARRAYS
68+
cev_add1(kwTYPE_LEVEL_END);
69+
IP++;
70+
} else {
71+
cev_log();
72+
73+
while (CODE_PEEK() == kwTYPE_SEP || CODE_PEEK() == kwTO) {
74+
// DIM X(A TO B)
75+
if (CODE_PEEK() == kwTYPE_SEP) {
76+
cev_add1(CODE(IP));
77+
IP++;
78+
}
79+
cev_add1(CODE(IP));
80+
IP++;
81+
82+
cev_log();
83+
}
84+
85+
if (CODE_PEEK() != kwTYPE_LEVEL_END) {
86+
cev_missing_rp();
87+
} else {
88+
cev_add1(kwTYPE_LEVEL_END);
89+
IP++;
90+
}
91+
}
92+
}
93+
}
94+
95+
// function [(...)]
96+
void cev_prim_args() {
97+
cev_add1(kwTYPE_LEVEL_BEGIN);
98+
IP++;
99+
100+
if (CODE_PEEK() == kwTYPE_CALL_PTR) {
101+
cev_add1(CODE(IP));
102+
IP++;
103+
}
104+
105+
if (CODE_PEEK() != kwTYPE_SEP) {
106+
// empty parameter
107+
cev_log();
108+
}
109+
while (CODE_PEEK() == kwTYPE_SEP) {
110+
// while parameters
111+
cev_add1(CODE(IP));
112+
IP++;
113+
cev_add1(CODE(IP));
114+
IP++;
115+
116+
if (CODE_PEEK() != kwTYPE_LEVEL_END) {
117+
if (CODE_PEEK() != kwTYPE_SEP) {
118+
cev_log();
119+
}
120+
}
121+
}
122+
123+
// after (), check for UDS field, eg foo(10).x
124+
if (CODE_PEEK() == kwTYPE_UDS_EL) {
125+
cev_prim_uds();
126+
cev_log();
127+
}
128+
129+
if (CODE_PEEK() != kwTYPE_LEVEL_END) {
130+
cev_missing_rp();
131+
} else {
132+
cev_add1(kwTYPE_LEVEL_END);
133+
IP++;
134+
}
135+
}
136+
47137
/*
48138
* prim
49139
*/
@@ -74,90 +164,20 @@ void cev_prim() {
74164
IP += ADDRSZ;
75165
break;
76166
case kwTYPE_VAR:
77-
bc_add_n(bc_out, bc_in->ptr + bc_in->cp, ADDRSZ); // 1 addr
78-
IP += ADDRSZ;
79-
80-
while (CODE_PEEK() == kwTYPE_UDS_EL) {
81-
cev_add1(kwTYPE_UDS_EL);
82-
cev_add1(kwTYPE_STR);
83-
IP += 2;
84-
cev_prim_str();
85-
}
86-
87-
// support multiple ()
88-
while (CODE_PEEK() == kwTYPE_LEVEL_BEGIN) {
89-
cev_add1(kwTYPE_LEVEL_BEGIN);
90-
IP++;
91-
if (CODE_PEEK() == kwTYPE_LEVEL_END) { // NULL ARRAYS
92-
cev_add1(kwTYPE_LEVEL_END);
93-
IP++;
94-
} else {
95-
cev_log();
96-
97-
while (CODE_PEEK() == kwTYPE_SEP || CODE_PEEK() == kwTO) {
98-
// DIM X(A TO B)
99-
if (CODE_PEEK() == kwTYPE_SEP) {
100-
cev_add1(CODE(IP));
101-
IP++;
102-
}
103-
cev_add1(CODE(IP));
104-
IP++;
105-
106-
cev_log();
107-
}
108-
109-
if (CODE_PEEK() != kwTYPE_LEVEL_END) {
110-
cev_missing_rp();
111-
} else {
112-
cev_add1(kwTYPE_LEVEL_END);
113-
IP++;
114-
}
115-
}
116-
}
167+
cev_prim_var();
117168
break;
118169
case kwTYPE_CALL_UDF: // [udf1][addr2]
119170
case kwTYPE_CALLEXTF: // [lib][index]
120171
bc_add_n(bc_out, bc_in->ptr + bc_in->cp, ADDRSZ);
121-
IP += ADDRSZ;
122-
// no break here
172+
IP += ADDRSZ; // no break here
123173
case kwTYPE_CALLF: // [code]
124174
bc_add_n(bc_out, bc_in->ptr + bc_in->cp, ADDRSZ);
125-
IP += ADDRSZ;
126-
// no break here
175+
IP += ADDRSZ; // no break here
127176
default:
128-
// function [(...)]
129177
if (CODE_PEEK() == kwTYPE_LEVEL_BEGIN) {
130-
cev_add1(kwTYPE_LEVEL_BEGIN);
131-
IP++;
132-
133-
if (CODE_PEEK() == kwTYPE_CALL_PTR) {
134-
cev_add1(CODE(IP));
135-
IP++;
136-
}
137-
138-
if (CODE_PEEK() != kwTYPE_SEP) { // empty parameter
139-
cev_log();
140-
}
141-
while (CODE_PEEK() == kwTYPE_SEP) { // while parameters
142-
cev_add1(CODE(IP));
143-
IP++;
144-
cev_add1(CODE(IP));
145-
IP++;
146-
147-
if (CODE_PEEK() != kwTYPE_LEVEL_END) {
148-
if (CODE_PEEK() != kwTYPE_SEP) {
149-
cev_log();
150-
}
151-
}
152-
}
153-
154-
if (CODE_PEEK() != kwTYPE_LEVEL_END) {
155-
cev_missing_rp();
156-
} else {
157-
cev_add1(kwTYPE_LEVEL_END);
158-
IP++;
159-
}
178+
cev_prim_args();
160179
}
180+
break;
161181
};
162182
}
163183

@@ -167,24 +187,7 @@ void cev_prim() {
167187
void cev_parenth() {
168188
IF_ERR_RTN;
169189
if (CODE_PEEK() == kwTYPE_LEVEL_BEGIN) {
170-
cev_add1(kwTYPE_LEVEL_BEGIN);
171-
IP++;
172-
173-
cev_log(); // R = cev_log
174-
IF_ERR_RTN;
175-
176-
if (CODE_PEEK() == kwTYPE_SEP) {
177-
cev_add1(kwTYPE_SEP);
178-
IP++;
179-
cev_add1(CODE(IP));
180-
IP++;
181-
} else if (CODE_PEEK() != kwTYPE_LEVEL_END) {
182-
cev_missing_rp();
183-
return;
184-
} else {
185-
cev_add1(kwTYPE_LEVEL_END);
186-
IP++;
187-
}
190+
cev_prim_args();
188191
} else {
189192
cev_prim();
190193
}

src/common/eval.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1297,7 +1297,8 @@ void eval(var_t *r) {
12971297
// normal exit
12981298
return;
12991299
}
1300-
rt_raise("UNKNOWN FUNC=%d", code);
1300+
rt_raise("UNKNOWN ERROR. IP:%d=0x%02X", IP, code);
1301+
hex_dump(prog_source, prog_length);
13011302
};
13021303

13031304
// run-time error check

src/common/scan.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2582,7 +2582,6 @@ addr_t comp_next_bc_cmd(addr_t ip) {
25822582
case kwGOSUB:
25832583
case kwTYPE_LINE:
25842584
case kwTYPE_VAR: // [addr|id]
2585-
case kwTYPE_UDS_EL:
25862585
ip += ADDRSZ;
25872586
break;
25882587
case kwTYPE_PTR:

src/common/str.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,11 @@ char *trimdup(const char *str) {
5252
*/
5353
void str_alltrim(char *str) {
5454
char *buf;
55-
56-
buf = trimdup(str);
57-
strcpy(str, buf);
58-
tmp_free(buf);
55+
if (str && str[0]) {
56+
buf = trimdup(str);
57+
strcpy(str, buf);
58+
tmp_free(buf);
59+
}
5960
}
6061

6162
/**
@@ -237,13 +238,12 @@ char *q_strstr(const char *s1, const char *s2, const char *pairs) {
237238
*
238239
*/
239240
int is_alpha(int ch) {
240-
if (ch == 0)
241+
if (ch == 0) {
241242
return 0;
242-
if ((ch > 64 && ch < 91) || (ch > 96 && ch < 123))
243+
}
244+
if ((ch > 64 && ch < 91) || (ch > 96 && ch < 123)) {
243245
return -1;
244-
// return
245-
// (strchr("_���������������������������������������������������������", ch)
246-
// != NULL); // Greek
246+
}
247247
return (ch & 0x80); // +foreign
248248
}
249249

0 commit comments

Comments
 (0)