Replace streq() with str_start_is(), which actually has the intended semantics.
Contributed by Michael Meyer.
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user