From: nhkeni Date: Sat, 19 Mar 2022 00:33:13 +0000 (-0400) Subject: Replace streq() with str_start_is(), which actually has the intended semantics. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b5c5496d17e8891192125b204913968074a5900e;p=nethack Replace streq() with str_start_is(), which actually has the intended semantics. Contributed by Michael Meyer. --- diff --git a/include/extern.h b/include/extern.h index 7e3ee500a..ebc312c37 100644 --- a/include/extern.h +++ b/include/extern.h @@ -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); diff --git a/src/botl.c b/src/botl.c index a7d571285..fb96cb688 100644 --- a/src/botl.c +++ b/src/botl.c @@ -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) diff --git a/src/hacklib.c b/src/hacklib.c index dd55fa0f2..f9a91e1cc 100644 --- a/src/hacklib.c +++ b/src/hacklib.c @@ -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 diff --git a/src/objnam.c b/src/objnam.c index 79535cbab..8a639516d 100644 --- a/src/objnam.c +++ b/src/objnam.c @@ -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)) diff --git a/src/options.c b/src/options.c index 7f16db876..f818e047f 100644 --- a/src/options.c +++ b/src/options.c @@ -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; }