@@ -366,8 +366,7 @@ void brun_break() {
366366 */
367367void cmd_chain (void ) {
368368 var_t var ;
369- const char * code = NULL ;
370- char * code_alloc = NULL ;
369+ char * code = NULL ;
371370
372371 v_init (& var );
373372 eval (& var );
@@ -380,20 +379,18 @@ void cmd_chain(void) {
380379 if (var .type == V_STR ) {
381380 if (access (var .v .p .ptr , R_OK ) == 0 ) {
382381 // argument is a file name
383- FILE * f = fopen (var .v .p .ptr , "r" );
384- if (!fseek (f , 0 , SEEK_END )) {
385- int len = ftell (f );
386- fseek (f , 0 , SEEK_SET );
387- if (len ) {
388- code_alloc = malloc (len + 1 );
389- fgets (code_alloc , len , f );
390- code = code_alloc ;
391- }
382+ int h = open (var .v .p .ptr , O_BINARY | O_RDONLY , 0644 );
383+ if (h != -1 ) {
384+ int len = lseek (h , 0 , SEEK_END );
385+ lseek (h , 0 , SEEK_SET );
386+ code = (char * )malloc (len + 1 );
387+ len = read (h , code , len );
388+ code [len ] = '\0' ;
389+ close (h );
392390 }
393- fclose (f );
394391 }
395392 if (!code ) {
396- code = var .v .p .ptr ;
393+ code = strdup ( var .v .p .ptr ) ;
397394 }
398395 } else if (var .type == V_ARRAY ) {
399396 int el ;
@@ -403,19 +400,16 @@ void cmd_chain(void) {
403400 if (el_p -> type == V_STR ) {
404401 int str_len = strlen (el_p -> v .p .ptr ) + 2 ;
405402 if (len ) {
406- code_alloc = realloc (code_alloc , len + str_len );
407- strcat (code_alloc , el_p -> v .p .ptr );
403+ code = realloc (code , len + str_len );
404+ strcat (code , el_p -> v .p .ptr );
408405 } else {
409- code_alloc = malloc (str_len );
410- strcpy (code_alloc , el_p -> v .p .ptr );
406+ code = malloc (str_len );
407+ strcpy (code , el_p -> v .p .ptr );
411408 }
412- strcat (code_alloc , "\n" );
409+ strcat (code , "\n" );
413410 len += str_len + 1 ;
414411 }
415412 }
416- if (len ) {
417- code = code_alloc ;
418- }
419413 }
420414
421415 if (code == NULL ) {
@@ -424,24 +418,30 @@ void cmd_chain(void) {
424418 return ;
425419 }
426420
421+ v_free (& var );
422+
427423 int tid_base = create_task ("CH_BASE" );
428424 int tid_prev = activate_task (tid_base );
429425
430426 // compile the buffer
431427 sys_before_comp ();
432428 int success = comp_compile_buffer (code );
433429
434- v_free (& var );
435- if (code_alloc ) {
436- free (code_alloc );
437- }
430+ free (code );
431+ code = NULL ;
432+
438433 if (success == 0 ) {
439434 close_task (tid_base );
440435 activate_task (tid_prev );
441436 prog_error = 1 ;
442437 return ;
443438 }
444439
440+ char last_file [OS_PATHNAME_SIZE + 1 ];
441+ char bas_dir [OS_PATHNAME_SIZE + 1 ];
442+ strcpy (last_file , gsb_last_file );
443+ strcpy (bas_dir , gsb_bas_dir );
444+
445445 int tid_main = brun_create_task ("CH_MAIN" , ctask -> bytecode , 0 );
446446 exec_sync_variables (0 );
447447
@@ -452,6 +452,13 @@ void cmd_chain(void) {
452452 close_task (tid_base ); // cleanup task container
453453 activate_task (tid_prev ); // resume calling task
454454
455+ // reset globals
456+ gsb_last_line = 0 ;
457+ gsb_last_error = 0 ;
458+ strcpy (gsb_last_file , last_file );
459+ strcpy (gsb_bas_dir , bas_dir );
460+ strcpy (gsb_last_errmsg , "" );
461+
455462 if (success == 0 ) {
456463 prog_error = 1 ;
457464 }
0 commit comments