OSDN Git Service

[Refactor] #3406 angband_strstr() の引数をchar\* からstring_view に変え、data() を呼んでいる箇所を削除した
authorHourier <66951241+Hourier@users.noreply.github.com>
Tue, 13 Jun 2023 12:58:01 +0000 (21:58 +0900)
committerHourier <66951241+Hourier@users.noreply.github.com>
Sat, 24 Jun 2023 03:24:08 +0000 (12:24 +0900)
src/autopick/autopick-matcher.cpp
src/knowledge/knowledge-monsters.cpp
src/player/process-death.cpp
src/util/string-processor.cpp
src/util/string-processor.h

index 393c51e..f360be7 100644 (file)
@@ -347,7 +347,7 @@ bool is_autopick_match(PlayerType *player_ptr, ItemEntity *o_ptr, const autopick
             return false;
         }
     } else {
-        if (angband_strstr(item_name.data(), entry.name.data()) == nullptr) {
+        if (angband_strstr(item_name.data(), entry.name) == nullptr) {
             return false;
         }
     }
index e094570..ad47dfa 100644 (file)
@@ -223,7 +223,7 @@ void do_cmd_knowledge_kill_count(PlayerType *player_ptr)
         fprintf(fff, "     %3d %sの %s\n", (int)this_monster, number_of_kills, r_ptr->name.data());
 #else
         if (this_monster < 2) {
-            if (angband_strstr(r_ptr->name.data(), "coins")) {
+            if (r_ptr->name.find("coins") != std::string::npos) {
                 fprintf(fff, "     1 pile of %s\n", r_ptr->name.data());
             } else {
                 fprintf(fff, "     1 %s\n", r_ptr->name.data());
index 453c6fe..da3c028 100644 (file)
@@ -108,12 +108,10 @@ static int show_killing_monster(PlayerType *player_ptr)
         return 1;
     }
 
-    if (const auto start_ptr = angband_strstr(lines[0].data(), "『");
-        (start_ptr != nullptr) && suffix(lines[1], "』")) {
-        const auto start_pos = start_ptr - lines[0].data();
-
+    if (const auto start_pos = lines[0].find("『");
+        (start_pos != std::string::npos) && suffix(lines[1], "』")) {
         if (lines[0].length() + lines[1].length() - start_pos <= GRAVE_LINE_WIDTH) {
-            const auto name = lines[0].substr(start_pos).append(lines[1]);
+            const auto &name = lines[0].substr(start_pos).append(lines[1]);
             std::string_view title(lines[0].data(), start_pos);
             show_tomb_line(title, GRAVE_KILLER_NAME_ROW);
             show_tomb_line(name, GRAVE_KILLER_NAME_ROW + 1);
index be51b2a..bacf66d 100644 (file)
@@ -478,23 +478,26 @@ size_t angband_strcat(char *buf, std::string_view src, size_t bufsize)
  *
  * angband_strstr() can handle Kanji strings correctly.
  */
-char *angband_strstr(concptr haystack, concptr needle)
+char *angband_strstr(const char *haystack, std::string_view needle)
 {
-    int l1 = strlen(haystack);
-    int l2 = strlen(needle);
+    std::string_view haystack_view(haystack);
+    auto l1 = haystack_view.length();
+    auto l2 = needle.length();
+    if (l1 < l2) {
+        return nullptr;
+    }
 
-    if (l1 >= l2) {
-        for (int i = 0; i <= l1 - l2; i++) {
-            if (!strncmp(haystack + i, needle, l2)) {
-                return (char *)haystack + i;
-            }
+    for (size_t i = 0; i <= l1 - l2; i++) {
+        const auto part = haystack_view.substr(i);
+        if (part.starts_with(needle)) {
+            return const_cast<char *>(haystack) + i;
+        }
 
 #ifdef JP
-            if (iskanji(*(haystack + i))) {
-                i++;
-            }
-#endif
+        if (iskanji(*(haystack + i))) {
+            i++;
         }
+#endif
     }
 
     return nullptr;
index 57a0e0a..b096617 100644 (file)
@@ -24,7 +24,7 @@ void text_to_ascii(char *buf, std::string_view sv, size_t bufsize);
 void ascii_to_text(char *buf, std::string_view sv, size_t bufsize);
 size_t angband_strcpy(char *buf, std::string_view src, size_t bufsize);
 size_t angband_strcat(char *buf, std::string_view src, size_t bufsize);
-char *angband_strstr(concptr haystack, concptr needle);
+char *angband_strstr(const char *haystack, std::string_view needle);
 char *angband_strchr(concptr ptr, char ch);
 char *ltrim(char *p);
 char *rtrim(char *p);