Contributed by Michael Meyer.
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);
/* 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)
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)
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)
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)
}
#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
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))
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;
}
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'",
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;
}
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;
}