From 973806fe6bd6eed1f337d6eca688b2cdff36e30a Mon Sep 17 00:00:00 2001 From: ocornut Date: Tue, 25 May 2021 14:08:20 +0200 Subject: [PATCH] ImStrv: standardized code doing format copy, optimized ImStrStr --- imgui.cpp | 21 +++++++-------- imgui_widgets.cpp | 69 ++++++++++++++++++++++++++++++----------------- 2 files changed, 53 insertions(+), 37 deletions(-) diff --git a/imgui.cpp b/imgui.cpp index 21523179..a03916f1 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -1639,22 +1639,19 @@ const char* ImStristr(const char* haystack, const char* haystack_end, const char return NULL; } -// FIXME-IMSTR: probably unneeded. const char* ImStrstr(ImStrv haystack, ImStrv needle) { const char un0 = (char)*needle.Begin; - while ((!haystack.End && *haystack.Begin) || (haystack.End && haystack.Begin < haystack.End)) + const char* p = haystack.Begin; + const size_t needle_len_m1 = needle.length() - 1; + while (true) { - if (*haystack.Begin == un0) - { - const char* b = needle.Begin + 1; - for (const char* a = haystack.Begin + 1; b < needle.End; a++, b++) - if (*a != *b) - break; - if (b == needle.End) - return haystack.Begin; - } - haystack.Begin++; + p = (const char*)memchr(p, un0, haystack.End - p); + if (p == NULL || (size_t)(haystack.End - p) - 1u < needle_len_m1) + return NULL; + if (needle_len_m1 == 0 || memcmp(p + 1, needle.Begin + 1, needle_len_m1) == 0) + return p; + p += 1; } return NULL; } diff --git a/imgui_widgets.cpp b/imgui_widgets.cpp index dd219999..259a68be 100644 --- a/imgui_widgets.cpp +++ b/imgui_widgets.cpp @@ -2351,16 +2351,22 @@ bool ImGui::DragScalar(ImStrv label, ImGuiDataType data_type, void* p_data, floa return false; // FIXME-IMSTR - char format_0[64]; // format may not end with \0 - const char* format = format_0; - IM_ASSERT(format_p.End - format_p.Begin < IM_ARRAYSIZE(format_0)); - ImStrncpy(format_0, format_p, IM_ARRAYSIZE(format_0)); - - // Default format string when passing NULL + const char* format; + char format_buf[64]; if (!format_p) + { + // Default format string when passing NULL format = DataTypeGetInfo(data_type)->PrintFmt; - else if (data_type == ImGuiDataType_S32 && ImStrcmp(format_p, "%d") != 0) // (FIXME-LEGACY: Patch old "%.0f" format string to use "%d", read function more details.) - format = PatchFormatStringFloatToInt(format); + } + else + { + // Copy format string (format may not be zero-terminated) + format = format_buf; + IM_ASSERT(format_p.End - format_p.Begin < IM_ARRAYSIZE(format_buf)); + ImStrncpy(format_buf, format_p, IM_ARRAYSIZE(format_buf)); + if (data_type == ImGuiDataType_S32 && ImStrcmp(format_p, "%d") != 0) // (FIXME-LEGACY: Patch old "%.0f" format string to use "%d", read function more details.) + format = PatchFormatStringFloatToInt(format); + } // Tabbing or CTRL-clicking on Drag turns it into an InputText const bool hovered = ItemHoverable(frame_bb, id); @@ -2977,16 +2983,19 @@ bool ImGui::SliderScalar(ImStrv label, ImGuiDataType data_type, void* p_data, co return false; // FIXME-IMSTR - char format_0[64]; // format may not end with \0 - const char* format = format_0; - IM_ASSERT(format_p.End - format_p.Begin < IM_ARRAYSIZE(format_0)); - - // Default format string when passing NULL + const char* format; + char format_buf[64]; if (!format_p) + { + // Default format string when passing NULL format = DataTypeGetInfo(data_type)->PrintFmt; + } else { - ImStrncpy(format_0, format_p, IM_ARRAYSIZE(format_0)); + // Copy format string (format may not be zero-terminated) + format = format_buf; + IM_ASSERT(format_p.End - format_p.Begin < IM_ARRAYSIZE(format_buf)); + ImStrncpy(format_buf, format_p, IM_ARRAYSIZE(format_buf)); if (data_type == ImGuiDataType_S32 && ImStrcmp(format_p, "%d") != 0) // (FIXME-LEGACY: Patch old "%.0f" format string to use "%d", read function more details.) format = PatchFormatStringFloatToInt(format); } @@ -3150,16 +3159,19 @@ bool ImGui::VSliderScalar(ImStrv label, const ImVec2& size, ImGuiDataType data_t return false; // FIXME-IMSTR - char format_0[64]; // format may not end with \0 - const char* format = format_0; - IM_ASSERT(format_p.End - format_p.Begin < IM_ARRAYSIZE(format_0)); - - // Default format string when passing NULL + const char* format; + char format_buf[64]; if (!format_p) + { + // Default format string when passing NULL format = DataTypeGetInfo(data_type)->PrintFmt; + } else { - ImStrncpy(format_0, format_p, IM_ARRAYSIZE(format_0)); + // Copy format string (format may not be zero-terminated) + format = format_buf; + IM_ASSERT(format_p.End - format_p.Begin < IM_ARRAYSIZE(format_buf)); + ImStrncpy(format_buf, format_p, IM_ARRAYSIZE(format_buf)); if (data_type == ImGuiDataType_S32 && ImStrcmp(format_p, "%d") != 0) // (FIXME-LEGACY: Patch old "%.0f" format string to use "%d", read function more details.) format = PatchFormatStringFloatToInt(format); } @@ -3401,13 +3413,20 @@ bool ImGui::InputScalar(ImStrv label, ImGuiDataType data_type, void* p_data, con ImGuiStyle& style = g.Style; // FIXME-IMSTR - char format_0[64]; // format may not end with \0 - const char* format = format_0; - IM_ASSERT(format_p.End - format_p.Begin < IM_ARRAYSIZE(format_0)); - ImStrncpy(format_0, format_p, IM_ARRAYSIZE(format_0)); - + const char* format; + char format_buf[64]; if (!format_p) + { + // Default format string when passing NULL format = DataTypeGetInfo(data_type)->PrintFmt; + } + else + { + // Copy format string (format may not be zero-terminated) + format = format_buf; + IM_ASSERT(format_p.End - format_p.Begin < IM_ARRAYSIZE(format_buf)); + ImStrncpy(format_buf, format_p, IM_ARRAYSIZE(format_buf)); + } char buf[64]; DataTypeFormatString(buf, IM_ARRAYSIZE(buf), data_type, p_data, format);