@@ -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+
76118void 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) {
263278void 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 */
610626int 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 );
0 commit comments