Some type fixes from Michael Allison.
#ifndef STRSTRI
extern char *strstri(const char *, const char *);
#endif
+extern int streq(const char *, const char *, boolean);
extern boolean fuzzymatch(const char *, const char *, const char *, boolean);
extern void init_random(int(*fn)(int));
extern void reseed_random(int(*fn)(int));
if(len >= LARGEST_INT)
panic("string too long");
*lenout = (unsigned int) len;
- return strcpy((char *) alloc((unsigned)len + 1), string);
+ return strcpy((char *) alloc(len + 1), string);
}
/*alloc.c*/
/* loop through each of the rank titles for role #i */
for (j = 0; j < 9; j++) {
if (roles[i].rank[j].m
- && !strncmpi(str, roles[i].rank[j].m,
- strlen(roles[i].rank[j].m))) {
+ && streq(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
- && !strncmpi(str, roles[i].rank[j].f,
- strlen(roles[i].rank[j].f))) {
+ && streq(str, roles[i].rank[j].m, TRUE)) {
if (rank_indx)
*rank_indx = j;
if (title_length)
static unsigned long match_str2conditionbitmask(const char *);
static unsigned long str2conditionbitmask(char *);
static boolean parse_condition(char (*)[QBUFSZ], int);
-static char *hlattr2attrname(int, char *, int);
+static char *hlattr2attrname(int, char *, size_t);
static void status_hilite_linestr_add(int, struct hilite_s *, unsigned long,
const char *);
static void status_hilite_linestr_done(void);
}
static char *
-hlattr2attrname(int attrib, char *buf, int bufsz)
+hlattr2attrname(int attrib, char *buf, size_t bufsz)
{
if (attrib && buf) {
char attbuf[BUFSZ];
/* add new annotation, unless it's all spaces (which will be an
empty string after mungspaces() above) */
if (*nbuf && strcmp(nbuf, " ")) {
- mptr->custom = dupstr(nbuf);
- mptr->custom_lth = strlen(mptr->custom);
+ mptr->custom = dupstr_n(nbuf,&mptr->custom_lth);
}
return ECMD_OK;
}
divsgn = -divsgn;
x = -x;
}
- r = x / y;
+ r = (int) (x / y);
m = x % y;
if (2 * m >= y)
r++;
}
#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
for (len = 0, i = LOW_PM; i < NUMMONS; i++) {
for (mgend = MALE; mgend < NUM_MGENDERS; mgend++) {
- int m_i_len;
+ size_t m_i_len;
if (!mons[i].pmnames[mgend])
continue;
- m_i_len = (int) strlen(mons[i].pmnames[mgend]);
- if (m_i_len > len && !strncmpi(mons[i].pmnames[mgend], str, m_i_len)) {
- if (m_i_len == (int) slen) {
+ m_i_len = strlen(mons[i].pmnames[mgend]);
+ if (m_i_len > (size_t) len && !strncmpi(mons[i].pmnames[mgend], str, (int) m_i_len)) {
+ if (m_i_len == slen) {
mntmp = i;
- len = m_i_len;
+ len = (int) m_i_len;
matchgend = mgend;
exact_match = TRUE;
break; /* exact match */
- } else if ((int) slen > m_i_len
+ } else if (slen > m_i_len
&& (str[m_i_len] == ' '
|| !strcmpi(&str[m_i_len], "s")
|| !strncmpi(&str[m_i_len], "s ", 2)
|| !strcmpi(&str[m_i_len], "es")
|| !strncmpi(&str[m_i_len], "es ", 3))) {
mntmp = i;
- len = m_i_len;
+ len = (int) m_i_len;
matchgend = mgend;
}
}
const char *tname;
tname = trapname(trap, TRUE);
- if (strncmpi(tname, bp, strlen(tname)))
+ if(!streq(tname, bp, TRUE))
continue;
/* found it; avoid stupid mistakes */
if (is_hole(trap) && !Can_fall_thru(&u.uz))
int i;
for (i = 0; i < SIZE(msgtype_names); i++)
- if (!strncmpi(msgtype_names[i].name, msgtype, strlen(msgtype))) {
+ if (streq(msgtype_names[i].name, msgtype, TRUE)) {
+ //if (!strncmpi(msgtype_names[i].name, msgtype, strlen(msgtype))) {
typ = msgtype_names[i].msgtyp;
break;
}