@@ -36,7 +36,7 @@ void cmd_let(int allowConst) {
3636 return ;
3737 }
3838
39- if (prog_source [prog_ip ] == kwTYPE_CMPOPR &&
39+ if (prog_source [prog_ip ] == kwTYPE_CMPOPR &&
4040 prog_source [prog_ip + 1 ] == '=' ) {
4141 code_skipopr ();
4242 }
@@ -173,12 +173,11 @@ void cmd_redim() {
173173 * A << x1 [, x2, ...]
174174 */
175175void cmd_ladd () {
176- var_t * var_p , * elem_p , * arg_p ;
177-
178- var_p = code_getvarptr ();
176+ var_t * var_p = code_getvarptr ();
179177 if (prog_error ) {
180178 return ;
181179 }
180+
182181 if (code_peek () == kwTYPE_CMPOPR && prog_source [prog_ip + 1 ] == '=' ) {
183182 // compatible with LET, operator format
184183 code_skipopr ();
@@ -190,30 +189,37 @@ void cmd_ladd() {
190189 return ;
191190 }
192191
193- // data
194- arg_p = v_new ();
192+ // for each argument to append
193+ var_t * arg_p = v_new ();
195194 do {
196- // get parameter on arg_p
195+ // get the value to append
197196 v_free (arg_p );
198197
198+ int byref = 0 ;
199199 if (code_peek () == kwBYREF ) {
200200 code_skipnext ();
201- v_eval_ref ( var_p ) ;
201+ byref = 1 ;
202202 } else {
203203 eval (arg_p );
204- if (prog_error ) {
205- break ;
206- }
207-
208- // append data
209- if (var_p -> type != V_ARRAY ) {
210- v_toarray1 (var_p , 1 );
211- elem_p = (var_t * ) var_p -> v .a .ptr ;
212- } else {
213- v_resize_array (var_p , var_p -> v .a .size + 1 );
214- elem_p = (var_t * ) (var_p -> v .a .ptr + (sizeof (var_t ) * (var_p -> v .a .size - 1 )));
215- }
216-
204+ }
205+ if (prog_error ) {
206+ break ;
207+ }
208+
209+ // find the array element
210+ var_t * elem_p ;
211+ if (var_p -> type != V_ARRAY ) {
212+ v_toarray1 (var_p , 1 );
213+ elem_p = (var_t * )var_p -> v .a .ptr ;
214+ } else {
215+ v_resize_array (var_p , var_p -> v .a .size + 1 );
216+ elem_p = (var_t * )(var_p -> v .a .ptr + (sizeof (var_t ) * (var_p -> v .a .size - 1 )));
217+ }
218+
219+ // set the value onto the element
220+ if (byref ) {
221+ v_eval_ref (elem_p );
222+ } else {
217223 v_set (elem_p , arg_p );
218224 }
219225
@@ -226,7 +232,6 @@ void cmd_ladd() {
226232 break ;
227233 }
228234 }
229-
230235 } while (1 );
231236
232237 // cleanup
@@ -238,23 +243,22 @@ void cmd_ladd() {
238243 * INSERT A, index, v1 [, vN]
239244 */
240245void cmd_lins () {
241- var_t * var_p , * elem_p , * arg_p ;
242- int idx , ladd , i ;
243-
244- var_p = code_getvarptr ();
246+ var_t * var_p = code_getvarptr ();
245247 if (prog_error ) {
246248 return ;
247249 }
248250 par_getcomma ();
249251 if (prog_error ) {
250252 return ;
251253 }
254+
252255 // convert to array
253256 if (var_p -> type != V_ARRAY ) {
254257 v_toarray1 (var_p , 0 );
255258 }
259+
256260 // get 'index'
257- idx = par_getint ();
261+ int idx = par_getint ();
258262 if (prog_error ) {
259263 return ;
260264 }
@@ -264,42 +268,59 @@ void cmd_lins() {
264268 if (prog_error ) {
265269 return ;
266270 }
267- // if ( (idx > var_p->v.a.size) || (idx < 0) ) {
268- // err_out_of_range();
269- // return;
270- // }
271271
272- ladd = 0 ;
272+ int ladd = 0 ;
273273 if (idx >= var_p -> v .a .size ) {
274- ladd = 1 ; // append
274+ // append
275+ ladd = 1 ;
275276 idx = var_p -> v .a .size ;
276277 } else if (idx <= 0 ) {
277- idx = 0 ; // insert at top
278+ // insert at top
279+ idx = 0 ;
278280 }
279- // data
280- arg_p = v_new ();
281+
282+ // for each argument to insert
283+ var_t * arg_p = v_new ();
281284 do {
282- // get parameter on arg_p
285+ // get the value to append
283286 v_free (arg_p );
284- eval (arg_p );
287+
288+ int byref = 0 ;
289+ if (code_peek () == kwBYREF ) {
290+ code_skipnext ();
291+ byref = 1 ;
292+ } else {
293+ eval (arg_p );
294+ }
285295 if (prog_error ) {
286296 break ;
287297 }
298+
288299 // resize +1
289300 v_resize_array (var_p , var_p -> v .a .size + 1 );
290301
291- if (ladd ) { // append
292- elem_p = (var_t * ) (var_p -> v .a .ptr + (sizeof (var_t ) * (var_p -> v .a .size - 1 )));
302+ // find the array element
303+ var_t * elem_p ;
304+ if (ladd ) {
305+ // append
306+ elem_p = (var_t * )(var_p -> v .a .ptr + (sizeof (var_t ) * (var_p -> v .a .size - 1 )));
293307 } else {
294308 // move all form idx one down
309+ int i ;
295310 for (i = var_p -> v .a .size - 1 ; i > idx ; i -- ) {
296311 // A(i) = A(i-1)
297- v_set ((var_t * ) (var_p -> v .a .ptr + (sizeof (var_t ) * i )),
298- (var_t * ) (var_p -> v .a .ptr + (sizeof (var_t ) * (i - 1 ))));
312+ v_set ((var_t * )(var_p -> v .a .ptr + (sizeof (var_t ) * i )),
313+ (var_t * )(var_p -> v .a .ptr + (sizeof (var_t ) * (i - 1 ))));
299314 }
300- elem_p = (var_t * ) (var_p -> v .a .ptr + (sizeof (var_t ) * idx ));
315+ elem_p = (var_t * )(var_p -> v .a .ptr + (sizeof (var_t ) * idx ));
316+ }
317+
318+ // set the value onto the element
319+ if (byref ) {
320+ v_eval_ref (elem_p );
321+ } else {
322+ v_set (elem_p , arg_p );
301323 }
302- v_set (elem_p , arg_p );
303324
304325 // next parameter
305326 if (code_peek () != kwTYPE_SEP ) {
0 commit comments