Skip to content

Commit a524ae5

Browse files
committed
COMMON: cleanup array handling
1 parent 98bc41a commit a524ae5

File tree

14 files changed

+266
-218
lines changed

14 files changed

+266
-218
lines changed

src/common/blib.c

Lines changed: 96 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,62 @@ void cmd_packed_let() {
121121
}
122122
}
123123

124+
unsigned get_dimensions(int32_t **lbound, int32_t **ubound) {
125+
unsigned count = 0;
126+
if (code_peek() == kwTYPE_LEVEL_BEGIN) {
127+
code_skipnext();
128+
while (code_peek() != kwTYPE_LEVEL_END && !prog_error) {
129+
if (count == MAXDIM) {
130+
err_matdim();
131+
break;
132+
}
133+
var_t arg;
134+
v_init(&arg);
135+
eval(&arg);
136+
if (prog_error) {
137+
break;
138+
}
139+
int dim = v_getint(&arg);
140+
v_free(&arg);
141+
142+
if (count) {
143+
// allocate for extra dimension
144+
*lbound = (int32_t *)realloc(*lbound, (sizeof(int32_t) * (count + 1)));
145+
*ubound = (int32_t *)realloc(*ubound, (sizeof(int32_t) * (count + 1)));
146+
} else {
147+
// allocate for first dimension
148+
*lbound = (int32_t *)malloc(sizeof(int32_t));
149+
*ubound = (int32_t *)malloc(sizeof(int32_t));
150+
}
151+
152+
if (code_peek() == kwTO) {
153+
(*lbound)[count] = dim;
154+
code_skipnext();
155+
eval(&arg);
156+
(*ubound)[count] = v_getint(&arg);
157+
v_free(&arg);
158+
} else {
159+
(*lbound)[count] = opt_base;
160+
(*ubound)[count] = dim;
161+
}
162+
163+
count++;
164+
165+
// skip separator
166+
if (code_peek() == kwTYPE_SEP) {
167+
code_skipnext();
168+
if (code_getnext() != ',') {
169+
err_missing_comma();
170+
break;
171+
}
172+
}
173+
}
174+
// skip end separator
175+
code_skipnext();
176+
}
177+
return count;
178+
}
179+
124180
/**
125181
* DIM var([lower TO] uppper [, ...])
126182
*/
@@ -131,95 +187,51 @@ void cmd_dim(int preserve) {
131187
byte code = code_peek();
132188
if (code == kwTYPE_LINE || code == kwTYPE_EOC) {
133189
exitf = 1;
134-
} else {
135-
var_t array;
136-
array.v.a.maxdim = 0;
137-
if (code_peek() == kwTYPE_SEP) {
138-
code_skipnext();
139-
if (code_getnext() != ',') {
140-
err_missing_comma();
141-
}
190+
break;
191+
}
192+
if (code_peek() == kwTYPE_SEP) {
193+
code_skipnext();
194+
if (code_getnext() != ',') {
195+
err_missing_comma();
196+
return;
142197
}
198+
}
143199

144-
var_t *var_p = code_getvarptr_parens(1);
145-
byte zero_length = 1;
200+
var_t *var_p = code_getvarptr_parens(1);
201+
if (prog_error) {
202+
break;
203+
}
146204

147-
if (!prog_error) {
148-
if (code_peek() == kwTYPE_LEVEL_BEGIN) {
149-
code_skipnext();
150-
while (code_peek() != kwTYPE_LEVEL_END) {
151-
zero_length = 0;
152-
var_t arg;
153-
v_init(&arg);
154-
eval(&arg);
155-
if (prog_error) {
156-
return;
157-
}
158-
if (code_peek() == kwTO) {
159-
array.v.a.lbound[array.v.a.maxdim] = v_getint(&arg);
160-
code_skipnext();
161-
eval(&arg);
162-
if (prog_error) {
163-
return;
164-
}
165-
array.v.a.ubound[array.v.a.maxdim] = v_getint(&arg);
166-
} else {
167-
array.v.a.lbound[array.v.a.maxdim] = opt_base;
168-
array.v.a.ubound[array.v.a.maxdim] = v_getint(&arg);
169-
}
170-
v_free(&arg);
171-
array.v.a.maxdim++;
172-
173-
// skip separator
174-
if (code_peek() == kwTYPE_SEP) {
175-
code_skipnext();
176-
if (code_getnext() != ',') {
177-
err_missing_comma();
178-
}
179-
}
180-
}
181-
// skip end separator
182-
code_skipnext();
183-
} else {
184-
zero_length = 1;
185-
}
205+
int32_t *lbound = NULL;
206+
int32_t *ubound = NULL;
207+
unsigned dimensions = get_dimensions(&lbound, &ubound);
208+
if (!prog_error) {
209+
if (!dimensions) {
210+
v_toarray1(var_p, 0);
186211
} else {
187-
rt_raise(ERR_SYNTAX);
188-
}
189-
190-
//
191-
// run...
192-
//
193-
if (!prog_error) {
194-
if (zero_length) {
195-
v_toarray1(var_p, 0);
212+
int size = 1;
213+
for (int i = 0; i < dimensions; i++) {
214+
size = size * (ABS(ubound[i] - lbound[i]) + 1);
215+
}
216+
if (!preserve) {
217+
v_new_array(var_p, size);
196218
} else {
197-
int i;
198-
int size = 1;
199-
for (i = 0; i < array.v.a.maxdim; i++) {
200-
size = size * (ABS(array.v.a.ubound[i] - array.v.a.lbound[i]) + 1);
201-
}
202-
if (!preserve) {
203-
v_toarray1(var_p, size);
219+
if (var_p->type == V_ARRAY) {
220+
v_resize_array(var_p, size);
204221
} else {
205-
if (var_p->type == V_ARRAY) {
206-
v_resize_array(var_p, size);
207-
} else {
208-
v_toarray1(var_p, size);
209-
}
210-
}
211-
212-
// dim
213-
var_p->v.a.maxdim = array.v.a.maxdim;
214-
for (i = 0; i < array.v.a.maxdim; i++) {
215-
var_p->v.a.lbound[i] = array.v.a.lbound[i];
216-
var_p->v.a.ubound[i] = array.v.a.ubound[i];
222+
v_new_array(var_p, size);
217223
}
218224
}
219-
} else {
220-
exitf = 1;
225+
// dim
226+
v_maxdim(var_p) = dimensions;
227+
for (int i = 0; i < dimensions; i++) {
228+
v_lbound(var_p, i) = lbound[i];
229+
v_ubound(var_p, i) = ubound[i];
230+
}
221231
}
222232
}
233+
free(lbound);
234+
free(ubound);
223235
} while (!exitf && !prog_error);
224236
}
225237

@@ -328,7 +340,7 @@ void cmd_lins() {
328340
if (prog_error) {
329341
return;
330342
}
331-
idx -= var_p->v.a.lbound[0];
343+
idx -= v_lbound(var_p, 0);
332344

333345
par_getcomma();
334346
if (prog_error) {
@@ -412,7 +424,7 @@ void cmd_ldel() {
412424
if (prog_error) {
413425
return;
414426
}
415-
idx -= var_p->v.a.lbound[0];
427+
idx -= v_lbound(var_p, 0);
416428
if ((idx >= size) || (idx < 0)) {
417429
err_out_of_range();
418430
return;
@@ -2520,7 +2532,7 @@ void cmd_sort() {
25202532
if (!errf) {
25212533
if (v_asize(var_p) > 1) {
25222534
static_qsort_last_use_ip = use_ip;
2523-
qsort(var_p->v.a.data, v_asize(var_p), sizeof(var_t), qs_cmp);
2535+
qsort(v_data(var_p), v_asize(var_p), sizeof(var_t), qs_cmp);
25242536
}
25252537
}
25262538
// NO RTE anymore... there is no meaning on this because of empty
@@ -2585,12 +2597,12 @@ void cmd_search() {
25852597
}
25862598
// search
25872599
if (!errf) {
2588-
rv_p->v.i = var_p->v.a.lbound[0] - 1;
2600+
rv_p->v.i = v_lbound(var_p, 0) - 1;
25892601
for (int i = 0; i < v_asize(var_p); i++) {
25902602
var_t *elem_p = v_elem(var_p, i);
25912603
int bcmp = sb_qcmp(elem_p, &vkey, use_ip);
25922604
if (bcmp == 0) {
2593-
rv_p->v.i = i + var_p->v.a.lbound[0];
2605+
rv_p->v.i = i + v_lbound(var_p, 0);
25942606
break;
25952607
}
25962608
}

src/common/blib_db.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -149,18 +149,18 @@ void write_encoded_var(int handle, var_t *var) {
149149
dev_fwrite(handle, (byte *)var->v.p.ptr, fv.size);
150150
break;
151151
case V_ARRAY:
152-
fv.size = var->v.a.size;
152+
fv.size = v_asize(var);
153153
dev_fwrite(handle, (byte *)&fv, sizeof(struct file_encoded_var));
154154

155155
// write additional data about array
156-
dev_fwrite(handle, &var->v.a.maxdim, 1);
157-
for (int i = 0; i < var->v.a.maxdim; i++) {
158-
dev_fwrite(handle, (byte *)&var->v.a.lbound[i], sizeof(int));
159-
dev_fwrite(handle, (byte *)&var->v.a.ubound[i], sizeof(int));
156+
dev_fwrite(handle, &v_maxdim(var), 1);
157+
for (int i = 0; i < v_maxdim(var); i++) {
158+
dev_fwrite(handle, (byte *)&v_lbound(var, i), sizeof(int));
159+
dev_fwrite(handle, (byte *)&v_ubound(var, i), sizeof(int));
160160
}
161161

162162
// write elements
163-
for (int i = 0; i < var->v.a.size; i++) {
163+
for (int i = 0; i < v_asize(var); i++) {
164164
var_t *elem = v_elem(var, i);
165165
write_encoded_var(handle, elem);
166166
}
@@ -200,14 +200,14 @@ int read_encoded_var(int handle, var_t *var) {
200200
v_new_array(var, fv.size);
201201

202202
// read additional data about array
203-
dev_fread(handle, (byte *)&var->v.a.maxdim, 1);
204-
for (int i = 0; i < var->v.a.maxdim; i++) {
205-
dev_fread(handle, (byte *)&var->v.a.lbound[i], sizeof(int));
206-
dev_fread(handle, (byte *)&var->v.a.ubound[i], sizeof(int));
203+
dev_fread(handle, (byte *)&v_maxdim(var), 1);
204+
for (int i = 0; i < v_maxdim(var); i++) {
205+
dev_fread(handle, (byte *)&v_lbound(var, i), sizeof(int));
206+
dev_fread(handle, (byte *)&v_ubound(var, i), sizeof(int));
207207
}
208208

209209
// write elements
210-
for (int i = 0; i < var->v.a.size; i++) {
210+
for (int i = 0; i < v_asize(var); i++) {
211211
var_t *elem = v_elem(var, i);
212212
v_init(elem);
213213
read_encoded_var(handle, elem);
@@ -711,7 +711,7 @@ void cmd_fsaveln() {
711711

712712
if (var_p->type == V_ARRAY) {
713713
// parameter is an array
714-
for (int i = 0; i < array_p->v.a.size; i++) {
714+
for (int i = 0; i < v_asize(array_p); i++) {
715715
var_p = v_elem(array_p, i);
716716
fprint_var(handle, var_p);
717717
dev_fwrite(handle, (byte *)"\n", 1);

src/common/blib_func.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1873,10 +1873,10 @@ void cmd_intN(long funcCode, var_t *r) {
18731873

18741874
if (!prog_error) {
18751875
l--;
1876-
if (l >= 0 && l < var_p->v.a.maxdim) {
1877-
r->v.i = var_p->v.a.lbound[l];
1876+
if (l >= 0 && l < v_maxdim(var_p)) {
1877+
r->v.i = v_lbound(var_p, l);
18781878
} else {
1879-
rt_raise(ERR_BOUND_DIM, var_p->v.a.maxdim, l);
1879+
rt_raise(ERR_BOUND_DIM, v_maxdim(var_p), l);
18801880
}
18811881
}
18821882
} else {
@@ -1909,10 +1909,10 @@ void cmd_intN(long funcCode, var_t *r) {
19091909

19101910
if (!prog_error) {
19111911
l--;
1912-
if (l >= 0 && l < var_p->v.a.maxdim) {
1913-
r->v.i = var_p->v.a.ubound[l];
1912+
if (l >= 0 && l < v_maxdim(var_p)) {
1913+
r->v.i = v_ubound(var_p, l);
19141914
} else {
1915-
rt_raise(ERR_BOUND_DIM, var_p->v.a.maxdim);
1915+
rt_raise(ERR_BOUND_DIM, v_maxdim(var_p));
19161916
}
19171917
}
19181918
} else {

src/common/blib_graph.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1194,7 +1194,7 @@ void cmd_chart() {
11941194
var_p = par_getvarray();
11951195
if (prog_error)
11961196
return;
1197-
count = var_p->v.a.size;
1197+
count = v_asize(var_p);
11981198

11991199
// optional labels-flag
12001200
if (code_peek() == kwTYPE_SEP) {
@@ -1274,7 +1274,7 @@ var_t *par_getm3() {
12741274
if (prog_error) {
12751275
return NULL;
12761276
}
1277-
if (vp == NULL || vp->type != V_ARRAY || vp->v.a.size != 9) {
1277+
if (vp == NULL || vp->type != V_ARRAY || v_asize(vp) != 9) {
12781278
err_typemismatch();
12791279
return NULL;
12801280
}
@@ -1486,7 +1486,7 @@ void cmd_m3apply() {
14861486
p = par_getvarray();
14871487
if (prog_error)
14881488
return;
1489-
count = p->v.a.size;
1489+
count = v_asize(p);
14901490

14911491
// copy m to om
14921492
for (i = 0; i < 3; i++) {
@@ -1501,7 +1501,7 @@ void cmd_m3apply() {
15011501
if (e->type != V_ARRAY) {
15021502
int o;
15031503

1504-
count = (p->v.a.size >> 1);
1504+
count = (v_asize(p) >> 1);
15051505
for (i = 0; i < count; i++) {
15061506
o = i << 1;
15071507
x = v_getreal(v_elem(p, o));
@@ -1515,7 +1515,7 @@ void cmd_m3apply() {
15151515

15161516
if (e->type != V_ARRAY)
15171517
err_parsepoly(i, 10);
1518-
else if ((e->v.a.size % 2) != 0)
1518+
else if ((v_asize(e) % 2) != 0)
15191519
err_parsepoly(i, 11);
15201520

15211521
if (prog_error)

src/common/brun.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -366,9 +366,9 @@ void cmd_chain(void) {
366366
code = strdup(var.v.p.ptr);
367367
}
368368
} else if (var.type == V_ARRAY) {
369-
int el;
370369
int len = 0;
371-
for (el = 0; el < var.v.a.size; el++) {
370+
uint32_t size = v_asize(&var);
371+
for (int el = 0; el < size; el++) {
372372
var_t *el_p = v_elem(&var, el);
373373
if (el_p->type == V_STR) {
374374
int str_len = strlen(el_p->v.p.ptr) + 2;

0 commit comments

Comments
 (0)