Skip to content

Commit 8ea08c3

Browse files
committed
Merge pull request markwal#4 from markwal/sdCardPath
Filename handling changes
2 parents ff25ba6 + 070bf25 commit 8ea08c3

1 file changed

Lines changed: 36 additions & 38 deletions

File tree

src/gpx/gpx-main.c

Lines changed: 36 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)