Skip to content

Commit 8cf7be7

Browse files
committed
COMMON: revert 6d array support
1 parent a524ae5 commit 8cf7be7

File tree

4 files changed

+84
-71
lines changed

4 files changed

+84
-71
lines changed

src/common/blib.c

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,8 @@ void cmd_packed_let() {
121121
}
122122
}
123123

124-
unsigned get_dimensions(int32_t **lbound, int32_t **ubound) {
125-
unsigned count = 0;
124+
uint8_t get_dimensions(int32_t **lbound, int32_t **ubound) {
125+
uint8_t count = 0;
126126
if (code_peek() == kwTYPE_LEVEL_BEGIN) {
127127
code_skipnext();
128128
while (code_peek() != kwTYPE_LEVEL_END && !prog_error) {
@@ -193,7 +193,7 @@ void cmd_dim(int preserve) {
193193
code_skipnext();
194194
if (code_getnext() != ',') {
195195
err_missing_comma();
196-
return;
196+
break;
197197
}
198198
}
199199

@@ -204,30 +204,31 @@ void cmd_dim(int preserve) {
204204

205205
int32_t *lbound = NULL;
206206
int32_t *ubound = NULL;
207-
unsigned dimensions = get_dimensions(&lbound, &ubound);
207+
uint8_t dimensions = get_dimensions(&lbound, &ubound);
208208
if (!prog_error) {
209+
if (!preserve || var_p->type != V_ARRAY) {
210+
v_free(var_p);
211+
}
209212
if (!dimensions) {
210213
v_toarray1(var_p, 0);
214+
continue;
215+
}
216+
int size = 1;
217+
for (int i = 0; i < dimensions; i++) {
218+
size = size * (ABS(ubound[i] - lbound[i]) + 1);
219+
}
220+
if (!preserve || var_p->type != V_ARRAY) {
221+
v_new_array(var_p, size);
222+
} else if (v_maxdim(var_p) != dimensions) {
223+
err_matdim();
211224
} else {
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);
218-
} else {
219-
if (var_p->type == V_ARRAY) {
220-
v_resize_array(var_p, size);
221-
} else {
222-
v_new_array(var_p, size);
223-
}
224-
}
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-
}
225+
// preserve previous array contents
226+
v_resize_array(var_p, size);
227+
}
228+
v_maxdim(var_p) = dimensions;
229+
for (int i = 0; i < dimensions; i++) {
230+
v_lbound(var_p, i) = lbound[i];
231+
v_ubound(var_p, i) = ubound[i];
231232
}
232233
}
233234
free(lbound);

src/common/sys.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ typedef long int var_int_t;
8080
#define SB_KEYWORD_SIZE 128
8181
#define SB_SOURCELINE_SIZE 65536 // compiler
8282
#define SB_TEXTLINE_SIZE 8192 // RTL
83-
#define SB_EXEC_STACK_SIZE 256 // executor's stack size
83+
#define SB_EXEC_STACK_SIZE 512 // executor's stack size
8484
#define SB_EVAL_STACK_SIZE 16 // evaluation stack size
8585
#define SB_KW_NONE_STR "Nil"
8686

src/common/var.c

Lines changed: 50 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,9 @@ uint32_t v_get_capacity(uint32_t size) {
6060
return size + (size / 2) + 1;
6161
}
6262

63-
void v_new_array(var_t *var, uint32_t size) {
63+
// allocate capacity in the array container
64+
void v_alloc_capacity(var_t *var, uint32_t size) {
6465
uint32_t capacity = v_get_capacity(size);
65-
var->type = V_ARRAY;
6666
v_capacity(var) = capacity;
6767
v_asize(var) = size;
6868
v_data(var) = (var_t *)malloc(sizeof(var_t) * capacity);
@@ -73,13 +73,55 @@ void v_new_array(var_t *var, uint32_t size) {
7373
}
7474
}
7575

76+
// create an new empty array
77+
void v_init_array(var_t *var) {
78+
v_capacity(var) = 0;
79+
v_asize(var) = 0;
80+
v_data(var) = NULL;
81+
v_maxdim(var) = 1;
82+
v_ubound(var, 0) = opt_base;
83+
v_lbound(var, 0) = opt_base;
84+
}
85+
86+
// create an array of the given size
87+
void v_new_array(var_t *var, uint32_t size) {
88+
var->type = V_ARRAY;
89+
v_alloc_capacity(var, size);
90+
}
91+
92+
void v_set_array1_size(var_t *var, uint32_t size) {
93+
v_asize(var) = size;
94+
v_maxdim(var) = 1;
95+
v_ubound(var, 0) = v_lbound(var, 0) + (size - 1);
96+
}
97+
98+
void v_copy_array(var_t *dest, const var_t *src) {
99+
dest->type = V_ARRAY;
100+
v_alloc_capacity(dest, v_asize(src));
101+
102+
// copy dimensions
103+
v_maxdim(dest) = v_maxdim(src);
104+
for (int i = 0; i < v_maxdim(src); i++) {
105+
v_ubound(dest, i) = v_ubound(src, i);
106+
v_lbound(dest, i) = v_lbound(src, i);
107+
}
108+
109+
// copy each element
110+
uint32_t v_size = v_asize(src);
111+
for (uint32_t i = 0; i < v_size; i++) {
112+
var_t *dest_vp = v_elem(dest, i);
113+
v_init(dest_vp);
114+
v_set(dest_vp, v_elem(src, i));
115+
}
116+
}
117+
76118
void v_array_free(var_t *var) {
77119
uint32_t v_size = v_capacity(var);
78120
if (v_size && v_data(var)) {
79121
for (uint32_t i = 0; i < v_size; i++) {
80122
v_free(v_elem(var, i));
81123
}
82-
free(v_data(var));
124+
free(var->v.a.data);
83125
}
84126
}
85127

@@ -180,33 +222,6 @@ var_t *v_getelemptr(var_t *v, uint32_t index) {
180222
return NULL;
181223
}
182224

183-
void v_set_array1_size(var_t *var, uint32_t size) {
184-
v_asize(var) = size;
185-
v_maxdim(var) = 1;
186-
v_ubound(var, 0) = v_lbound(var, 0) + (size - 1);
187-
}
188-
189-
void v_init_array(var_t *var) {
190-
v_capacity(var) = 0;
191-
v_asize(var) = 0;
192-
v_data(var) = NULL;
193-
v_ubound(var, 0) = opt_base;
194-
v_lbound(var, 0) = opt_base;
195-
v_maxdim(var) = 1;
196-
}
197-
198-
void v_copy_array(var_t *dest, const var_t *src) {
199-
memcpy(&dest->v.a, &src->v.a, sizeof(src->v.a));
200-
v_new_array(dest, v_asize(src));
201-
// copy each element
202-
uint32_t v_size = v_asize(src);
203-
for (uint32_t i = 0; i < v_size; i++) {
204-
var_t *dest_vp = v_elem(dest, i);
205-
v_init(dest_vp);
206-
v_set(dest_vp, v_elem(src, i));
207-
}
208-
}
209-
210225
/*
211226
* resize an existing array
212227
*/
@@ -235,7 +250,7 @@ void v_resize_array(var_t *v, uint32_t size) {
235250
// insufficient capacity
236251
uint32_t prev_size = v_asize(v);
237252
if (prev_size == 0) {
238-
v_new_array(v, size);
253+
v_alloc_capacity(v, size);
239254
} else if (prev_size < size) {
240255
// resize & copy
241256
uint32_t capacity = v_get_capacity(size);
@@ -263,10 +278,10 @@ void v_resize_array(var_t *v, uint32_t size) {
263278
void v_tomatrix(var_t *v, int r, int c) {
264279
v_free(v);
265280
v_new_array(v, r * c);
281+
v_maxdim(v) = 2;
266282
v_lbound(v, 0) = v_lbound(v, 1) = opt_base;
267283
v_ubound(v, 0) = opt_base + (r - 1);
268284
v_ubound(v, 1) = opt_base + (c - 1);
269-
v_maxdim(v) = 2;
270285
}
271286

272287
/*
@@ -606,6 +621,7 @@ void v_inc(var_t *a, var_t *b) {
606621
}
607622

608623
/*
624+
* returns the sign of a variable
609625
*/
610626
int v_sign(var_t *x) {
611627
if (x->type == V_INT) {
@@ -771,14 +787,13 @@ void v_input2var(const char *str, var_t *var) {
771787
// no data
772788
v_setstr(var, str);
773789
} else {
774-
char *np, *sb;
775790
char buf[INT_STR_LEN];
776791
int type;
777792
var_int_t lv;
778793
var_num_t dv;
779794

780-
sb = strdup(str);
781-
np = get_numexpr(sb, buf, &type, &lv, &dv);
795+
char *sb = strdup(str);
796+
char *np = get_numexpr(sb, buf, &type, &lv, &dv);
782797

783798
if (type == 1 && *np == '\0') {
784799
v_setint(var, lv);

src/common/var.h

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
* @ingroup var
6464
* @def MAXDIM Maxium number of array-dimensions
6565
*/
66-
#define MAXDIM 2
66+
#define MAXDIM 6
6767

6868
#if defined(__cplusplus)
6969
extern "C" {
@@ -72,16 +72,6 @@ extern "C" {
7272
struct var_s;
7373
typedef void (*method) (struct var_s *self);
7474

75-
// array
76-
typedef struct {
77-
struct var_s *data; /**< array data pointer */
78-
uint32_t size; /**< the number of elements */
79-
uint32_t capacity; /**< the number of slots */
80-
int32_t ubound[MAXDIM]; /**< upper bound */
81-
int8_t lbound[MAXDIM]; /**< lower bound */
82-
uint8_t maxdim; /**< number of dimensions */
83-
} var_array;
84-
8575
/**
8676
* @ingroup var
8777
* @typedef var_s
@@ -123,7 +113,14 @@ typedef struct var_s {
123113
} p;
124114

125115
// array
126-
var_array a;
116+
struct {
117+
struct var_s *data; /**< array data pointer */
118+
uint32_t size; /**< the number of elements */
119+
uint32_t capacity; /**< the number of slots */
120+
int32_t ubound[MAXDIM]; /**< upper bound */
121+
int8_t lbound[MAXDIM]; /**< lower bound */
122+
uint8_t maxdim; /**< number of dimensions */
123+
} a;
127124

128125
// next item in the free-list
129126
struct var_s *pool_next;

0 commit comments

Comments
 (0)