]> granicus.if.org Git - nethack/commitdiff
Replace streq() with str_start_is(), which actually has the intended semantics.
authornhkeni <keni@his.com>
Sat, 19 Mar 2022 00:33:13 +0000 (20:33 -0400)
committernhkeni <keni@his.com>
Sat, 19 Mar 2022 00:33:13 +0000 (20:33 -0400)
Contributed by Michael Meyer.

include/extern.h
src/botl.c
src/hacklib.c
src/objnam.c
src/options.c

index 7e3ee500add030fa127a8a69ddfc9599a853a758..ebc312c37fa2a55f614a1456471f20f1f31f556b 100644 (file)
@@ -969,6 +969,7 @@ extern char *stripchars(char *, const char *, const char *);
 extern char *stripdigits(char *);
 extern char *eos(char *);
 extern unsigned Strlen_(const char *, const char *, int);
+extern boolean str_start_is(const char *, const char *, boolean);
 extern boolean str_end_is(const char *, const char *);
 extern int str_lines_maxlen(const char *);
 extern char *strkitten(char *, char);
index a7d5712855ee7a9e96e91aea34c7fc5f72784b7e..fb96cb688dcfac7eec9240edad18e6d1b4b7dae2 100644 (file)
@@ -364,7 +364,7 @@ title_to_mon(const char *str, int *rank_indx, int *title_length)
         /* loop through each of the rank titles for role #i */
         for (j = 0; j < 9; j++) {
             if (roles[i].rank[j].m
-                && streq(str, roles[i].rank[j].m, TRUE)) {
+                && str_start_is(str, roles[i].rank[j].m, TRUE)) {
                 if (rank_indx)
                     *rank_indx = j;
                 if (title_length)
@@ -372,7 +372,7 @@ title_to_mon(const char *str, int *rank_indx, int *title_length)
                 return roles[i].mnum;
             }
             if (roles[i].rank[j].f
-                && streq(str, roles[i].rank[j].m, TRUE)) {
+                && str_start_is(str, roles[i].rank[j].f, TRUE)) {
                 if (rank_indx)
                     *rank_indx = j;
                 if (title_length)
index dd55fa0f20cd13505f5646012674567c8bd2d65b..f9a91e1cc9643d692474637ba933a2f88f92fc25 100644 (file)
@@ -24,8 +24,9 @@
         char *          strip_newline   (char *)
         char *          stripchars      (char *, const char *, const char *)
         char *          stripdigits     (char *)
-       unsigned        Strlen_         (const char *str, const char *, int)
+        unsigned       Strlen_         (const char *str, const char *, int)
         char *          eos             (char *)
+        boolean         str_start_is    (const char *, const char *, boolean)
         boolean         str_end_is      (const char *, const char *)
         int             str_lines_maxlen (const char *)
         char *          strkitten       (char *,char)
@@ -235,10 +236,34 @@ Strlen_(const char *str, const char *file, int line){
     size_t len = strnlen(str, LARGEST_INT);
 
     if (len == LARGEST_INT)
-       panic("%s:%d string too long", file, line);
+        panic("%s:%d string too long", file, line);
     return (unsigned) len;
 }
 
+/* determine whether 'str' starts with 'chkstr', possibly ignoring case;
+ * panics on huge strings */
+boolean
+str_start_is(const char *str, const char *chkstr, boolean caseblind)
+{
+    int n = LARGEST_INT;
+
+    while (n--) {
+        char t1, t2;
+        if (!*str)
+            return (*chkstr == 0); /* chkstr >= str */
+        else if (!*chkstr)
+            return TRUE; /* chkstr < str */
+        t1 = caseblind ? lowc(*str) : *str;
+        t2 = caseblind ? lowc(*chkstr) : *chkstr;
+        str++, chkstr++;
+        if (t1 != t2)
+            return FALSE;
+    }
+    if (n == 0)
+        panic("string too long");
+    return TRUE;
+}
+
 /* determine whether 'str' ends in 'chkstr' */
 boolean
 str_end_is(const char *str, const char *chkstr)
@@ -848,30 +873,6 @@ strstri(const char *str, const char *sub)
 }
 #endif /* STRSTRI */
 
-/* string equality, possibly ignoring case; panics on huge strings */
-int
-streq(register const char *s1, register const char *s2,
-         boolean caseblind)
-{
-    register char t1, t2;
-    int n = LARGEST_INT;
-
-    while (n--) {
-        if (!*s2)
-            return (*s1 == 0); /* s1 >= s2 */
-        else if (!*s1)
-            return 1; /* s1 < s2 */
-       t1 = caseblind ? lowc(*s1) : *s1;
-       t2 = caseblind ? lowc(*s2) : *s2;
-       s1++,s2++;
-        if (t1 != t2)
-            return 0;
-    }
-    if (n==0)
-        panic("string too long");
-    return 1;
-}
-
 /* compare two strings for equality, ignoring the presence of specified
    characters (typically whitespace) and possibly ignoring case */
 boolean
index 79535cbab29052dc245e52eda640a7a05302aa8f..8a639516d76cb02a377f4e21e74859579d1dee43 100644 (file)
@@ -3196,7 +3196,7 @@ wizterrainwish(struct _readobjnam_data *d)
         const char *tname;
 
         tname = trapname(trap, TRUE);
-        if(!streq(tname, bp, TRUE))
+        if (!str_start_is(bp, tname, TRUE))
             continue;
         /* found it; avoid stupid mistakes */
         if (is_hole(trap) && !Can_fall_thru(&u.uz))
index 7f16db876fea1acfc0aeba85d31fc548f340a285..f818e047f85a9f132551603db70e71420782a97b 100644 (file)
@@ -378,7 +378,7 @@ parseoptions(register char *opts, boolean tinitial, boolean tfrom_file)
         got_match = FALSE;
 
         if (allopt[i].pfx) {
-            if (streq(opts, allopt[i].name, TRUE)) {
+            if (str_start_is(opts, allopt[i].name, TRUE)) {
                 matchidx = i;
                 got_match = TRUE;
             }
@@ -2724,13 +2724,13 @@ optfn_runmode(int optidx, int req, boolean negated, char *opts, char *op)
         if (negated) {
             flags.runmode = RUN_TPORT;
         } else if (op != empty_optstr) {
-            if (streq(op, "teleport", TRUE))
+            if (str_start_is("teleport", op, TRUE))
                 flags.runmode = RUN_TPORT;
-            else if (streq(op, "run", TRUE))
+            else if (str_start_is("run", op, TRUE))
                 flags.runmode = RUN_LEAP;
-            else if (streq(op, "walk", TRUE))
+            else if (str_start_is("walk", op, TRUE))
                 flags.runmode = RUN_STEP;
-            else if (streq(op, "crawl", TRUE))
+            else if (str_start_is("crawl", op, TRUE))
                 flags.runmode = RUN_CRAWL;
             else {
                 config_error_add("Unknown %s parameter '%s'",
@@ -6696,7 +6696,7 @@ msgtype_parse_add(char *str)
         int i;
 
         for (i = 0; i < SIZE(msgtype_names); i++)
-            if (streq(msgtype_names[i].name, msgtype, TRUE)) {
+            if (str_start_is(msgtype_names[i].name, msgtype, TRUE)) {
                 typ = msgtype_names[i].msgtyp;
                 break;
             }
@@ -8467,8 +8467,7 @@ set_option_mod_status(const char *optnam, int status)
         return;
     }
     for (k = 0; allopt[k].name; k++) {
-        if (streq(allopt[k].name, optnam, TRUE)) {
-        //if (!strncmpi(allopt[k].name, optnam, strlen(optnam))) {
+        if (str_start_is(allopt[k].name, optnam, TRUE)) {
             allopt[k].setwhere = status;
             return;
         }