diff --git a/common/include/strutil.h b/common/include/strutil.h index f221716a7..5eae5ebae 100644 --- a/common/include/strutil.h +++ b/common/include/strutil.h @@ -56,7 +56,7 @@ struct splitpath_t }; // remove extension from filename, doesn't work with paths. -void removeext(const char *filename, char *out); +void removeext(const char *filename, array &out); //give a filename a new extension, doesn't work with paths with no extension already there extern void change_filename_extension( char *dest, const char *src, const char *new_ext ); diff --git a/common/misc/strutil.cpp b/common/misc/strutil.cpp index 3ba3430b8..2462a7e2c 100644 --- a/common/misc/strutil.cpp +++ b/common/misc/strutil.cpp @@ -128,17 +128,22 @@ char *(d_strdup)(const char *str, const char *var, const char *file, unsigned li #endif // remove extension from filename -void removeext(const char *filename, char *out) +void removeext(const char *const filename, array &out) { - const char *p; - - if ((p = strrchr(filename, '.'))) + const char *p = nullptr; + auto i = filename; + for (; const char c = *i; ++i) { - strncpy(out, filename, p - filename); - out[p - filename] = 0; + if (c == '.') + p = i; + /* No break - find the last '.', not the first. */ } - else - strcpy(out, filename); + if (!p) + p = i; + const std::size_t rawlen = p - filename; + const std::size_t copy_len = rawlen < out.size() ? rawlen : 0; + out[copy_len] = 0; + memcpy(out.data(), filename, copy_len); } diff --git a/similar/main/bmread.cpp b/similar/main/bmread.cpp index 64c79fc70..0fbe7db28 100644 --- a/similar/main/bmread.cpp +++ b/similar/main/bmread.cpp @@ -225,7 +225,6 @@ static bitmap_index bm_load_sub(const int skip, const char *const filename) bitmap_index bitmap_num; palette_array_t newpal; int iff_error; //reference parm to avoid warning message - char fname[20]; bitmap_num.index = 0; @@ -233,17 +232,18 @@ static bitmap_index bm_load_sub(const int skip, const char *const filename) return bitmap_num; } + array fname; #if defined(DXX_BUILD_DESCENT_I) removeext(filename, fname); #elif defined(DXX_BUILD_DESCENT_II) struct splitpath_t path; d_splitpath( filename, &path); - if (path.base_end - path.base_start >= sizeof(fname)) + if (path.base_end - path.base_start >= fname.size()) Error("File <%s> - bitmap error, filename too long", filename); - memcpy(fname,path.base_start,path.base_end - path.base_start); + memcpy(fname.data(), path.base_start, path.base_end - path.base_start); #endif - bitmap_num=piggy_find_bitmap( fname ); + bitmap_num = piggy_find_bitmap(fname.data()); if (bitmap_num.index) { return bitmap_num; } @@ -258,7 +258,7 @@ static bitmap_index bm_load_sub(const int skip, const char *const filename) n.avg_color = compute_average_pixel(&n); - bitmap_num = piggy_register_bitmap(n, fname, 0); + bitmap_num = piggy_register_bitmap(n, fname.data(), 0); return bitmap_num; } @@ -282,7 +282,7 @@ static void ab_load(int skip, const char * filename, array fname; removeext(filename, fname); #elif defined(DXX_BUILD_DESCENT_II) struct splitpath_t path; @@ -293,7 +293,7 @@ static void ab_load(int skip, const char * filename, array fname; removeext(filename, fname); #if defined(DXX_BUILD_DESCENT_I) - snprintf(rawname, sizeof(rawname), "Sounds/%s.raw", fname); + snprintf(rawname, sizeof(rawname), "Sounds/%s.raw", fname.data()); #elif defined(DXX_BUILD_DESCENT_II) - snprintf(rawname, sizeof(rawname), "Sounds/%s.%s", fname, (GameArg.SndDigiSampleRate==SAMPLE_RATE_22K) ? "r22" : "raw"); + snprintf(rawname, sizeof(rawname), "Sounds/%s.%s", fname.data(), (GameArg.SndDigiSampleRate==SAMPLE_RATE_22K) ? "r22" : "raw"); #endif - i=piggy_find_sound( fname ); + i = piggy_find_sound(fname.data()); if (i!=255) { return i; } @@ -369,7 +369,7 @@ int ds_load(int skip, const char * filename ) { } else { return 255; } - i = piggy_register_sound( &n, fname, 0 ); + i = piggy_register_sound(&n, fname.data(), 0); return i; }