@@ -617,29 +617,30 @@ int main(int argc, char * const argv[])
617617 // use the output filename if one is provided
618618 if (argc > 0 ) {
619619 filename = argv [0 ];
620+ // prefer output filename over input for the buildname
621+ char * s = strrchr (filename , PATH_DELIM );
622+ s = strdup (s ? s + 1 : filename );
623+ if (s )
624+ buildname = s ;
620625 }
621626 else {
622627 if (serial_io ) {
623628 fputs ("Command line error: port required for serial I/O" EOL , stderr );
624629 usage (1 );
625630 goto done ;
626631 }
632+
627633 // or use the input filename with a .x3g extension
628- char * dot = strrchr (filename , '.' );
629- if (dot ) {
630- long l = dot - filename ;
631- memcpy (gpx .buffer .out , filename , l );
632- filename = gpx .buffer .out + l ;
633- }
634- // or just append one if no .gcode extension is present
635- else {
636- size_t sl = strlen (filename );
637- memcpy (gpx .buffer .out , filename , sl );
638- filename = gpx .buffer .out + sl ;
639- }
634+ char * ext = strrchr (filename , '.' );
635+ size_t l = ext ? ext - filename : strlen (filename );
636+ memcpy (gpx .buffer .out , filename , l );
637+ filename = gpx .buffer .out ;
638+ ext = filename + l ;
639+
640640 if (truncate_filename ) {
641+ // truncate, replace all non alnum with '_' and uppercase
641642 char * s = gpx .buffer .out ;
642- for (i = 0 ; s < filename && i < 8 ; i ++ ) {
643+ for (i = 0 ; s < ext && i < 8 ; i ++ ) {
643644 char c = * s ;
644645 if (isalnum (c )) {
645646 * s ++ = toupper (c );
@@ -648,20 +649,11 @@ int main(int argc, char * const argv[])
648649 * s ++ = '_' ;
649650 }
650651 }
651- * s ++ = '.' ;
652- * s ++ = 'X' ;
653- * s ++ = '3' ;
654- * s ++ = 'G' ;
655- * s ++ = '\0' ;
652+ strcpy (s , ".X3G" );
656653 }
657654 else {
658- * filename ++ = '.' ;
659- * filename ++ = 'x' ;
660- * filename ++ = '3' ;
661- * filename ++ = 'g' ;
662- * filename ++ = '\0' ;
655+ strcpy (ext , ".x3g" );
663656 }
664- filename = gpx .buffer .out ;
665657 }
666658
667659 // trim build name extension
@@ -681,23 +673,29 @@ int main(int argc, char * const argv[])
681673 // write a second copy to the SD Card
682674 if (gpx .sdCardPath ) {
683675 long sl = strlen (gpx .sdCardPath );
684- if (gpx .sdCardPath [sl - 1 ] == PATH_DELIM ) {
676+ if (sl > 0 && gpx .sdCardPath [sl - 1 ] == PATH_DELIM ) {
685677 gpx .sdCardPath [-- sl ] = 0 ;
686678 }
687- char * delim = strrchr (filename , PATH_DELIM );
688- if (delim ) {
689- memcpy (gpx .buffer .out , gpx .sdCardPath , sl );
690- long l = strlen (delim );
691- memcpy (gpx .buffer .out + sl , delim , l );
692- gpx .buffer .out [sl + l ] = 0 ;
693- }
694- else {
695- memcpy (gpx .buffer .out , gpx .sdCardPath , sl );
696- gpx .buffer .out [sl ++ ] = PATH_DELIM ;
697- long l = strlen (filename );
698- memcpy (gpx .buffer .out + sl , filename , l );
699- gpx .buffer .out [sl + l ] = 0 ;
679+
680+ char * leaf = strrchr (filename , PATH_DELIM );
681+ if (!leaf )
682+ leaf = filename ;
683+ else
684+ leaf ++ ;
685+ // strdup because we could be pointing into gpx.buffer.out
686+ // and we're about to use that to prepend the sdCardPath
687+ leaf = strdup (leaf );
688+ if (leaf == NULL ) {
689+ fputs ("Insufficient memory" EOL , stderr );
690+ goto done ;
700691 }
692+
693+ memcpy (gpx .buffer .out , gpx .sdCardPath , sl );
694+ gpx .buffer .out [sl ++ ] = PATH_DELIM ;
695+ strcpy (gpx .buffer .out + sl , filename );
696+
697+ free (leaf );
698+
701699 file_out2 = fopen (gpx .buffer .out , "wb" );
702700 if (file_out2 && gpx .flag .verboseMode ) fprintf (gpx .log , "Writing to: %s" EOL , gpx .buffer .out );
703701 }
0 commit comments