diff --git a/common/include/strutil.h b/common/include/strutil.h index 7cff76337..b8f8a751d 100644 --- a/common/include/strutil.h +++ b/common/include/strutil.h @@ -11,6 +11,7 @@ #include #include #include "dxxsconf.h" +#include "u_mem.h" #include "dsx-ns.h" #include #include @@ -39,11 +40,10 @@ int d_strnicmp(const char *s1, const char *s2, uint_fast32_t n); #endif extern void d_strlwr( char *s1 ); #ifdef DEBUG_MEMORY_ALLOCATIONS -char *d_strdup(const char *str, const char *, const char *, unsigned) __attribute_malloc(); +RAIIdmem d_strdup(const char *str, const char *, const char *, unsigned); #define d_strdup(str) (d_strdup(str, #str, __FILE__,__LINE__)) #else -#include -#define d_strdup strdup +RAIIdmem d_strdup(const char *str); #endif #if DXX_USE_EDITOR diff --git a/common/main/cmd.cpp b/common/main/cmd.cpp index 855d836e5..76a9106f9 100644 --- a/common/main/cmd.cpp +++ b/common/main/cmd.cpp @@ -95,8 +95,8 @@ namespace { struct cmd_queue_t { RAIIdmem command_line; - explicit cmd_queue_t(char *p) : - command_line(p) + explicit cmd_queue_t(RAIIdmem p) : + command_line(std::move(p)) { } }; @@ -348,7 +348,7 @@ static void cmd_alias(unsigned long argc, const char *const *const argv) alias->name[sizeof(alias->name) - 1] = 0; strncpy(alias->name, argv[1], sizeof(alias->name) - 1); } - alias->value.reset(d_strdup(buf)); + alias->value = d_strdup(buf); } diff --git a/common/misc/strutil.cpp b/common/misc/strutil.cpp index d6d1c0f4d..74b535184 100644 --- a/common/misc/strutil.cpp +++ b/common/misc/strutil.cpp @@ -109,15 +109,23 @@ void d_strupr(std::array &out, const std::array #endif #ifdef DEBUG_MEMORY_ALLOCATIONS -char *(d_strdup)(const char *str, const char *var, const char *file, unsigned line) +RAIIdmem (d_strdup)(const char *str, const char *var, const char *file, unsigned line) +#else +RAIIdmem (d_strdup)(const char *str) +#endif { - char *newstr; + RAIIdmem newstr; +#ifndef DEBUG_MEMORY_ALLOCATIONS + const auto var = nullptr; + const auto file = nullptr; + const unsigned line = 0; +#endif const auto len = strlen(str) + 1; - MALLOC(newstr, len, var, file, line); - return static_cast(memcpy(newstr, str, len)); + MALLOC(newstr, len, var, file, line); + memcpy(newstr.get(), str, len); + return newstr; } -#endif // remove extension from filename void removeext(const char *const filename, std::array &out) diff --git a/common/ui/file.cpp b/common/ui/file.cpp index 5b5de9c51..0db4fa0f1 100644 --- a/common/ui/file.cpp +++ b/common/ui/file.cpp @@ -72,7 +72,7 @@ static PHYSFSX_counted_list file_getdirlist(const char *dir) list.release(); list.reset(r); std::move_backward(r, r + NumDirs, r + NumDirs + 1); - list[0] = d_strdup(".."); + list[0] = strdup(".."); } list.set_count(NumDirs); return list; diff --git a/common/ui/menubar.cpp b/common/ui/menubar.cpp index b6c597113..2a4bec84e 100644 --- a/common/ui/menubar.cpp +++ b/common/ui/menubar.cpp @@ -840,10 +840,8 @@ int menubar_init(grs_canvas &canvas, const char *const file) CommaParse( 2, buf1, buffer ); ul_xlate(buf1); - item.Text.reset(d_strdup(buf1[0] == '-' ? buf1 : (snprintf(buf2, sizeof(buf2), " %.197s ", buf1), buf2))); - - item.InactiveText.reset(d_strdup(item.Text.get())); - + item.Text = d_strdup(buf1[0] == '-' ? buf1 : (snprintf(buf2, sizeof(buf2), " %.197s ", buf1), buf2)); + item.InactiveText = d_strdup(item.Text.get()); for (int i = 0, j = 0;; i++ ) { np = item.Text[i]; diff --git a/common/ui/radio.cpp b/common/ui/radio.cpp index bc122e075..f77b05ac3 100644 --- a/common/ui/radio.cpp +++ b/common/ui/radio.cpp @@ -71,7 +71,7 @@ void ui_draw_radio(UI_DIALOG &dlg, UI_GADGET_RADIO &radio) std::unique_ptr ui_add_gadget_radio(UI_DIALOG &dlg, short x, short y, short w, short h, short group, const char *const text) { auto radio = ui_gadget_add(dlg, x, y, x + w - 1, y + h - 1); - radio->text = RAIIdmem(d_strdup(text)); + radio->text = d_strdup(text); radio->width = w; radio->height = h; radio->position = 0; diff --git a/similar/main/newmenu.cpp b/similar/main/newmenu.cpp index 979c8defe..bca33fdef 100644 --- a/similar/main/newmenu.cpp +++ b/similar/main/newmenu.cpp @@ -300,7 +300,7 @@ static void nm_string(grs_canvas &canvas, const grs_font &cv_font, const int w1, RAIIdmem s2; if (w1 > 0 && (p = strchr(s, '\t'))) { - s2.reset(d_strdup(s)); + s2 = d_strdup(s); s1 = s2.get(); *std::next(s2.get(), std::distance(s, p)) = '\0'; }