Add Strlen(), a strlen(3) that panics if string is stupid long and returns unsigned.
First batch of changes to use it to suppress warnings.
This commit is contained in:
@@ -968,6 +968,7 @@ extern char *strip_newline(char *);
|
|||||||
extern char *stripchars(char *, const char *, const char *);
|
extern char *stripchars(char *, const char *, const char *);
|
||||||
extern char *stripdigits(char *);
|
extern char *stripdigits(char *);
|
||||||
extern char *eos(char *);
|
extern char *eos(char *);
|
||||||
|
extern unsigned Strlen(const char *);
|
||||||
extern boolean str_end_is(const char *, const char *);
|
extern boolean str_end_is(const char *, const char *);
|
||||||
extern int str_lines_maxlen(const char *);
|
extern int str_lines_maxlen(const char *);
|
||||||
extern char *strkitten(char *, char);
|
extern char *strkitten(char *, char);
|
||||||
|
|||||||
+2
-2
@@ -368,7 +368,7 @@ title_to_mon(const char *str, int *rank_indx, int *title_length)
|
|||||||
if (rank_indx)
|
if (rank_indx)
|
||||||
*rank_indx = j;
|
*rank_indx = j;
|
||||||
if (title_length)
|
if (title_length)
|
||||||
*title_length = strlen(roles[i].rank[j].m);
|
*title_length = Strlen(roles[i].rank[j].m);
|
||||||
return roles[i].mnum;
|
return roles[i].mnum;
|
||||||
}
|
}
|
||||||
if (roles[i].rank[j].f
|
if (roles[i].rank[j].f
|
||||||
@@ -376,7 +376,7 @@ title_to_mon(const char *str, int *rank_indx, int *title_length)
|
|||||||
if (rank_indx)
|
if (rank_indx)
|
||||||
*rank_indx = j;
|
*rank_indx = j;
|
||||||
if (title_length)
|
if (title_length)
|
||||||
*title_length = strlen(roles[i].rank[j].f);
|
*title_length = Strlen(roles[i].rank[j].f);
|
||||||
return roles[i].mnum;
|
return roles[i].mnum;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2550,7 +2550,7 @@ extcmds_match(const char *findstr, int ecmflags, int **matchlist)
|
|||||||
{
|
{
|
||||||
static int retmatchlist[SIZE(extcmdlist)] = DUMMY;
|
static int retmatchlist[SIZE(extcmdlist)] = DUMMY;
|
||||||
int i, mi = 0;
|
int i, mi = 0;
|
||||||
int fslen = findstr ? strlen(findstr) : 0;
|
int fslen = findstr ? Strlen(findstr) : 0;
|
||||||
boolean ignoreac = (ecmflags & ECM_IGNOREAC) != 0;
|
boolean ignoreac = (ecmflags & ECM_IGNOREAC) != 0;
|
||||||
boolean exactmatch = (ecmflags & ECM_EXACTMATCH) != 0;
|
boolean exactmatch = (ecmflags & ECM_EXACTMATCH) != 0;
|
||||||
boolean no1charcmd = (ecmflags & ECM_NO1CHARCMD) != 0;
|
boolean no1charcmd = (ecmflags & ECM_NO1CHARCMD) != 0;
|
||||||
|
|||||||
@@ -176,9 +176,10 @@ eatmupdate(void)
|
|||||||
|
|
||||||
if (altmsg) {
|
if (altmsg) {
|
||||||
/* replace end-of-mimicking message */
|
/* replace end-of-mimicking message */
|
||||||
if (strlen(altmsg) > strlen(g.eatmbuf)) {
|
int amlen = Strlen(altmsg);
|
||||||
|
if (amlen > Strlen(g.eatmbuf)) {
|
||||||
free((genericptr_t) g.eatmbuf);
|
free((genericptr_t) g.eatmbuf);
|
||||||
g.eatmbuf = (char *) alloc(strlen(altmsg) + 1);
|
g.eatmbuf = (char *) alloc(amlen + 1);
|
||||||
}
|
}
|
||||||
g.nomovemsg = strcpy(g.eatmbuf, altmsg);
|
g.nomovemsg = strcpy(g.eatmbuf, altmsg);
|
||||||
/* update current image */
|
/* update current image */
|
||||||
|
|||||||
@@ -1423,7 +1423,7 @@ really_done(int how)
|
|||||||
|
|
||||||
corpse = mk_named_object(CORPSE, &mons[mnum], u.ux, u.uy, g.plname);
|
corpse = mk_named_object(CORPSE, &mons[mnum], u.ux, u.uy, g.plname);
|
||||||
Sprintf(pbuf, "%s, ", g.plname);
|
Sprintf(pbuf, "%s, ", g.plname);
|
||||||
formatkiller(eos(pbuf), sizeof pbuf - strlen(pbuf), how, TRUE);
|
formatkiller(eos(pbuf), sizeof pbuf - Strlen(pbuf), how, TRUE);
|
||||||
make_grave(u.ux, u.uy, pbuf);
|
make_grave(u.ux, u.uy, pbuf);
|
||||||
}
|
}
|
||||||
pbuf[0] = '\0'; /* clear grave text; also lint suppression */
|
pbuf[0] = '\0'; /* clear grave text; also lint suppression */
|
||||||
|
|||||||
+1
-1
@@ -388,7 +388,7 @@ void
|
|||||||
make_engr_at(int x, int y, const char *s, long e_time, xchar e_type)
|
make_engr_at(int x, int y, const char *s, long e_time, xchar e_type)
|
||||||
{
|
{
|
||||||
struct engr *ep;
|
struct engr *ep;
|
||||||
unsigned smem = strlen(s) + 1;
|
unsigned smem = Strlen(s) + 1;
|
||||||
|
|
||||||
if ((ep = engr_at(x, y)) != 0)
|
if ((ep = engr_at(x, y)) != 0)
|
||||||
del_engr(ep);
|
del_engr(ep);
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
char * strip_newline (char *)
|
char * strip_newline (char *)
|
||||||
char * stripchars (char *, const char *, const char *)
|
char * stripchars (char *, const char *, const char *)
|
||||||
char * stripdigits (char *)
|
char * stripdigits (char *)
|
||||||
|
unsigned Strlen (const char *str)
|
||||||
char * eos (char *)
|
char * eos (char *)
|
||||||
boolean str_end_is (const char *, const char *)
|
boolean str_end_is (const char *, const char *)
|
||||||
int str_lines_maxlen (const char *)
|
int str_lines_maxlen (const char *)
|
||||||
@@ -228,6 +229,16 @@ eos(register char *s)
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* like strlen(3) but returns unsigned and panics if string is unreasonably long */
|
||||||
|
unsigned
|
||||||
|
Strlen(const char *str){
|
||||||
|
size_t len = strnlen(str, LARGEST_INT);
|
||||||
|
|
||||||
|
if (len == LARGEST_INT)
|
||||||
|
panic("string too long");
|
||||||
|
return (unsigned) len;
|
||||||
|
}
|
||||||
|
|
||||||
/* determine whether 'str' ends in 'chkstr' */
|
/* determine whether 'str' ends in 'chkstr' */
|
||||||
boolean
|
boolean
|
||||||
str_end_is(const char *str, const char *chkstr)
|
str_end_is(const char *str, const char *chkstr)
|
||||||
|
|||||||
+3
-3
@@ -3985,8 +3985,8 @@ let_to_name(char let, boolean unpaid, boolean showsym)
|
|||||||
else
|
else
|
||||||
class_name = names[0];
|
class_name = names[0];
|
||||||
|
|
||||||
len = strlen(class_name) + (unpaid ? sizeof "unpaid_" : sizeof "")
|
len = Strlen(class_name) + (unpaid ? sizeof "unpaid_" : sizeof "")
|
||||||
+ (oclass ? (strlen(ocsymfmt) + invbuf_sympadding) : 0);
|
+ (oclass ? (Strlen(ocsymfmt) + invbuf_sympadding) : 0);
|
||||||
if (len > g.invbufsiz) {
|
if (len > g.invbufsiz) {
|
||||||
if (g.invbuf)
|
if (g.invbuf)
|
||||||
free((genericptr_t) g.invbuf);
|
free((genericptr_t) g.invbuf);
|
||||||
@@ -3999,7 +3999,7 @@ let_to_name(char let, boolean unpaid, boolean showsym)
|
|||||||
Strcpy(g.invbuf, class_name);
|
Strcpy(g.invbuf, class_name);
|
||||||
if ((oclass != 0) && showsym) {
|
if ((oclass != 0) && showsym) {
|
||||||
char *bp = eos(g.invbuf);
|
char *bp = eos(g.invbuf);
|
||||||
int mlen = invbuf_sympadding - strlen(class_name);
|
int mlen = invbuf_sympadding - Strlen(class_name);
|
||||||
while (--mlen > 0) {
|
while (--mlen > 0) {
|
||||||
*bp = ' ';
|
*bp = ' ';
|
||||||
bp++;
|
bp++;
|
||||||
|
|||||||
+1
-1
@@ -1382,7 +1382,7 @@ nhl_loadlua(lua_State *L, const char *fname)
|
|||||||
long buflen, ct, cnt;
|
long buflen, ct, cnt;
|
||||||
int llret;
|
int llret;
|
||||||
|
|
||||||
altfname = (char *) alloc(strlen(fname) + 3); /* 3: '('...')\0' */
|
altfname = (char *) alloc(Strlen(fname) + 3); /* 3: '('...')\0' */
|
||||||
/* don't know whether 'fname' is inside a dlb container;
|
/* don't know whether 'fname' is inside a dlb container;
|
||||||
if we did, we could choose between "nhdat(<fname>)" and "<fname>"
|
if we did, we could choose between "nhdat(<fname>)" and "<fname>"
|
||||||
but since we don't, compromise */
|
but since we don't, compromise */
|
||||||
|
|||||||
+1
-1
@@ -383,7 +383,7 @@ savenames(NHFILE* nhfp)
|
|||||||
for (i = 0; i < NUM_OBJECTS; i++)
|
for (i = 0; i < NUM_OBJECTS; i++)
|
||||||
if (objects[i].oc_uname) {
|
if (objects[i].oc_uname) {
|
||||||
if (perform_bwrite(nhfp)) {
|
if (perform_bwrite(nhfp)) {
|
||||||
len = strlen(objects[i].oc_uname) + 1;
|
len = Strlen(objects[i].oc_uname) + 1;
|
||||||
if (nhfp->structlevel) {
|
if (nhfp->structlevel) {
|
||||||
bwrite(nhfp->fd, (genericptr_t)&len, sizeof len);
|
bwrite(nhfp->fd, (genericptr_t)&len, sizeof len);
|
||||||
bwrite(nhfp->fd, (genericptr_t)objects[i].oc_uname, len);
|
bwrite(nhfp->fd, (genericptr_t)objects[i].oc_uname, len);
|
||||||
|
|||||||
+11
-11
@@ -402,7 +402,7 @@ fruit_from_name(
|
|||||||
if (!exact) {
|
if (!exact) {
|
||||||
tentativef = 0;
|
tentativef = 0;
|
||||||
for (f = g.ffruit; f; f = f->nextf) {
|
for (f = g.ffruit; f; f = f->nextf) {
|
||||||
k = strlen(f->fname);
|
k = Strlen(f->fname);
|
||||||
if (!strncmp(f->fname, fname, k)
|
if (!strncmp(f->fname, fname, k)
|
||||||
&& (!fname[k] || fname[k] == ' ')
|
&& (!fname[k] || fname[k] == ' ')
|
||||||
&& (!tentativef || k > strlen(tentativef->fname)))
|
&& (!tentativef || k > strlen(tentativef->fname)))
|
||||||
@@ -422,11 +422,11 @@ fruit_from_name(
|
|||||||
}
|
}
|
||||||
if (!f && !exact) {
|
if (!f && !exact) {
|
||||||
char fnamebuf[BUFSZ], *p;
|
char fnamebuf[BUFSZ], *p;
|
||||||
unsigned fname_k = strlen(fname); /* length of assumed plural fname */
|
unsigned fname_k = Strlen(fname); /* length of assumed plural fname */
|
||||||
|
|
||||||
tentativef = 0;
|
tentativef = 0;
|
||||||
for (f = g.ffruit; f; f = f->nextf) {
|
for (f = g.ffruit; f; f = f->nextf) {
|
||||||
k = strlen(f->fname);
|
k = Strlen(f->fname);
|
||||||
/* reload fnamebuf[] each iteration in case it gets modified;
|
/* reload fnamebuf[] each iteration in case it gets modified;
|
||||||
there's no need to recalculate fname_k */
|
there's no need to recalculate fname_k */
|
||||||
Strcpy(fnamebuf, fname);
|
Strcpy(fnamebuf, fname);
|
||||||
@@ -441,7 +441,7 @@ fruit_from_name(
|
|||||||
if (fname_k >= k && (p = index(&fnamebuf[k], ' ')) != 0) {
|
if (fname_k >= k && (p = index(&fnamebuf[k], ' ')) != 0) {
|
||||||
*p = '\0'; /* truncate at 1st space past length of f->fname */
|
*p = '\0'; /* truncate at 1st space past length of f->fname */
|
||||||
altfname = makesingular(fnamebuf);
|
altfname = makesingular(fnamebuf);
|
||||||
k = strlen(altfname); /* actually revised 'fname_k' */
|
k = Strlen(altfname); /* actually revised 'fname_k' */
|
||||||
if (!strcmp(f->fname, altfname)
|
if (!strcmp(f->fname, altfname)
|
||||||
&& (!tentativef || k > strlen(tentativef->fname)))
|
&& (!tentativef || k > strlen(tentativef->fname)))
|
||||||
tentativef = f;
|
tentativef = f;
|
||||||
@@ -1976,7 +1976,7 @@ yobjnam(struct obj* obj, const char *verb)
|
|||||||
if (!carried(obj) || !obj_is_pname(obj)
|
if (!carried(obj) || !obj_is_pname(obj)
|
||||||
|| obj->oartifact >= ART_ORB_OF_DETECTION) {
|
|| obj->oartifact >= ART_ORB_OF_DETECTION) {
|
||||||
char *outbuf = shk_your(nextobuf(), obj);
|
char *outbuf = shk_your(nextobuf(), obj);
|
||||||
int space_left = BUFSZ - 1 - strlen(outbuf);
|
int space_left = BUFSZ - 1 - Strlen(outbuf);
|
||||||
|
|
||||||
s = strncat(outbuf, s, space_left);
|
s = strncat(outbuf, s, space_left);
|
||||||
}
|
}
|
||||||
@@ -2050,7 +2050,7 @@ yname(struct obj* obj)
|
|||||||
if (!carried(obj) || !obj_is_pname(obj)
|
if (!carried(obj) || !obj_is_pname(obj)
|
||||||
|| obj->oartifact >= ART_ORB_OF_DETECTION) {
|
|| obj->oartifact >= ART_ORB_OF_DETECTION) {
|
||||||
char *outbuf = shk_your(nextobuf(), obj);
|
char *outbuf = shk_your(nextobuf(), obj);
|
||||||
int space_left = BUFSZ - 1 - strlen(outbuf);
|
int space_left = BUFSZ - 1 - Strlen(outbuf);
|
||||||
|
|
||||||
s = strncat(outbuf, s, space_left);
|
s = strncat(outbuf, s, space_left);
|
||||||
}
|
}
|
||||||
@@ -2077,7 +2077,7 @@ ysimple_name(struct obj* obj)
|
|||||||
{
|
{
|
||||||
char *outbuf = nextobuf();
|
char *outbuf = nextobuf();
|
||||||
char *s = shk_your(outbuf, obj); /* assert( s == outbuf ); */
|
char *s = shk_your(outbuf, obj); /* assert( s == outbuf ); */
|
||||||
int space_left = BUFSZ - 1 - strlen(s);
|
int space_left = BUFSZ - 1 - Strlen(s);
|
||||||
|
|
||||||
return strncat(s, minimal_xname(obj), space_left);
|
return strncat(s, minimal_xname(obj), space_left);
|
||||||
}
|
}
|
||||||
@@ -2273,7 +2273,7 @@ vtense(const char* subj, const char* verb)
|
|||||||
/* check for special cases to avoid false matches */
|
/* check for special cases to avoid false matches */
|
||||||
len = (int) (spot - subj) + 1;
|
len = (int) (spot - subj) + 1;
|
||||||
for (spec = special_subjs; *spec; spec++) {
|
for (spec = special_subjs; *spec; spec++) {
|
||||||
ltmp = strlen(*spec);
|
ltmp = Strlen(*spec);
|
||||||
if (len == ltmp && !strncmpi(*spec, subj, len))
|
if (len == ltmp && !strncmpi(*spec, subj, len))
|
||||||
goto sing;
|
goto sing;
|
||||||
/* also check for <prefix><space><special_subj>
|
/* also check for <prefix><space><special_subj>
|
||||||
@@ -2377,7 +2377,7 @@ const char *const *alt_as_is) /* another set like as_is[] */
|
|||||||
const struct sing_plur *sp;
|
const struct sing_plur *sp;
|
||||||
const char *same, *other, *const *as;
|
const char *same, *other, *const *as;
|
||||||
int al;
|
int al;
|
||||||
int baselen = strlen(basestr);
|
int baselen = Strlen(basestr);
|
||||||
|
|
||||||
for (as = as_is; *as; ++as) {
|
for (as = as_is; *as; ++as) {
|
||||||
al = (int) strlen(*as);
|
al = (int) strlen(*as);
|
||||||
@@ -2555,7 +2555,7 @@ makeplural(const char* oldstr)
|
|||||||
*(spot + 1) = '\0';
|
*(spot + 1) = '\0';
|
||||||
/* Now spot is the last character of the string */
|
/* Now spot is the last character of the string */
|
||||||
|
|
||||||
len = strlen(str);
|
len = Strlen(str);
|
||||||
|
|
||||||
/* Single letters */
|
/* Single letters */
|
||||||
if (len == 1 || !letter(*spot)) {
|
if (len == 1 || !letter(*spot)) {
|
||||||
@@ -4118,7 +4118,7 @@ readobjnam_postparse1(struct _readobjnam_data *d)
|
|||||||
&& strncmpi(d->bp, "food ration", 11)
|
&& strncmpi(d->bp, "food ration", 11)
|
||||||
&& strncmpi(d->bp, "meat ring", 9))
|
&& strncmpi(d->bp, "meat ring", 9))
|
||||||
for (i = 0; i < (int) (sizeof wrpsym); i++) {
|
for (i = 0; i < (int) (sizeof wrpsym); i++) {
|
||||||
register int j = strlen(wrp[i]);
|
register int j = Strlen(wrp[i]);
|
||||||
|
|
||||||
/* check for "<class> [ of ] something" */
|
/* check for "<class> [ of ] something" */
|
||||||
if (!strncmpi(d->bp, wrp[i], j)) {
|
if (!strncmpi(d->bp, wrp[i], j)) {
|
||||||
|
|||||||
+4
-4
@@ -748,7 +748,7 @@ str2role(const char *str)
|
|||||||
return ROLE_NONE;
|
return ROLE_NONE;
|
||||||
|
|
||||||
/* Match as much of str as is provided */
|
/* Match as much of str as is provided */
|
||||||
len = strlen(str);
|
len = Strlen(str);
|
||||||
for (i = 0; roles[i].name.m; i++) {
|
for (i = 0; roles[i].name.m; i++) {
|
||||||
/* Does it match the male name? */
|
/* Does it match the male name? */
|
||||||
if (!strncmpi(str, roles[i].name.m, len))
|
if (!strncmpi(str, roles[i].name.m, len))
|
||||||
@@ -878,7 +878,7 @@ str2gend(const char *str)
|
|||||||
return ROLE_NONE;
|
return ROLE_NONE;
|
||||||
|
|
||||||
/* Match as much of str as is provided */
|
/* Match as much of str as is provided */
|
||||||
len = strlen(str);
|
len = Strlen(str);
|
||||||
for (i = 0; i < ROLE_GENDERS; i++) {
|
for (i = 0; i < ROLE_GENDERS; i++) {
|
||||||
/* Does it match the adjective? */
|
/* Does it match the adjective? */
|
||||||
if (!strncmpi(str, genders[i].adj, len))
|
if (!strncmpi(str, genders[i].adj, len))
|
||||||
@@ -941,7 +941,7 @@ str2align(const char *str)
|
|||||||
return ROLE_NONE;
|
return ROLE_NONE;
|
||||||
|
|
||||||
/* Match as much of str as is provided */
|
/* Match as much of str as is provided */
|
||||||
len = strlen(str);
|
len = Strlen(str);
|
||||||
for (i = 0; i < ROLE_ALIGNS; i++) {
|
for (i = 0; i < ROLE_ALIGNS; i++) {
|
||||||
/* Does it match the adjective? */
|
/* Does it match the adjective? */
|
||||||
if (!strncmpi(str, aligns[i].adj, len))
|
if (!strncmpi(str, aligns[i].adj, len))
|
||||||
@@ -1530,7 +1530,7 @@ build_plselection_prompt(
|
|||||||
Strcat(tmpbuf, "a ");
|
Strcat(tmpbuf, "a ");
|
||||||
/* <your> */
|
/* <your> */
|
||||||
|
|
||||||
(void) root_plselection_prompt(eos(tmpbuf), buflen - strlen(tmpbuf),
|
(void) root_plselection_prompt(eos(tmpbuf), buflen - Strlen(tmpbuf),
|
||||||
rolenum, racenum, gendnum, alignnum);
|
rolenum, racenum, gendnum, alignnum);
|
||||||
/* "Shall I pick a character's role, race, gender, and alignment for you?"
|
/* "Shall I pick a character's role, race, gender, and alignment for you?"
|
||||||
plus " [ynaq] (y)" is a little too long for a conventional 80 columns;
|
plus " [ynaq] (y)" is a little too long for a conventional 80 columns;
|
||||||
|
|||||||
+1
-1
@@ -243,7 +243,7 @@ save_gamelog(NHFILE *nhfp)
|
|||||||
tmp2 = tmp->next;
|
tmp2 = tmp->next;
|
||||||
if (perform_bwrite(nhfp)) {
|
if (perform_bwrite(nhfp)) {
|
||||||
if (nhfp->structlevel) {
|
if (nhfp->structlevel) {
|
||||||
slen = strlen(tmp->text);
|
slen = Strlen(tmp->text);
|
||||||
bwrite(nhfp->fd, (genericptr_t) &slen, sizeof slen);
|
bwrite(nhfp->fd, (genericptr_t) &slen, sizeof slen);
|
||||||
bwrite(nhfp->fd, (genericptr_t) tmp->text, slen);
|
bwrite(nhfp->fd, (genericptr_t) tmp->text, slen);
|
||||||
bwrite(nhfp->fd, (genericptr_t) tmp,
|
bwrite(nhfp->fd, (genericptr_t) tmp,
|
||||||
|
|||||||
+2
-2
@@ -2906,8 +2906,8 @@ lspo_message(lua_State *L)
|
|||||||
|
|
||||||
msg = luaL_checkstring(L, 1);
|
msg = luaL_checkstring(L, 1);
|
||||||
|
|
||||||
old_n = g.lev_message ? (strlen(g.lev_message) + 1) : 0;
|
old_n = g.lev_message ? (Strlen(g.lev_message) + 1) : 0;
|
||||||
n = strlen(msg);
|
n = Strlen(msg);
|
||||||
|
|
||||||
levmsg = (char *) alloc(old_n + n + 1);
|
levmsg = (char *) alloc(old_n + n + 1);
|
||||||
if (old_n)
|
if (old_n)
|
||||||
|
|||||||
+1
-1
@@ -117,7 +117,7 @@ formatkiller(
|
|||||||
/*FALLTHRU*/
|
/*FALLTHRU*/
|
||||||
case KILLED_BY:
|
case KILLED_BY:
|
||||||
(void) strncat(buf, killed_by_prefix[how], siz - 1);
|
(void) strncat(buf, killed_by_prefix[how], siz - 1);
|
||||||
l = strlen(buf);
|
l = Strlen(buf);
|
||||||
buf += l, siz -= l;
|
buf += l, siz -= l;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -1170,7 +1170,7 @@ enhance_weapon_skill(void)
|
|||||||
for (longest = 0, i = 0; i < P_NUM_SKILLS; i++) {
|
for (longest = 0, i = 0; i < P_NUM_SKILLS; i++) {
|
||||||
if (P_RESTRICTED(i))
|
if (P_RESTRICTED(i))
|
||||||
continue;
|
continue;
|
||||||
if ((len = strlen(P_NAME(i))) > longest)
|
if ((len = Strlen(P_NAME(i))) > longest)
|
||||||
longest = len;
|
longest = len;
|
||||||
if (can_advance(i, speedy))
|
if (can_advance(i, speedy))
|
||||||
to_advance++;
|
to_advance++;
|
||||||
|
|||||||
Reference in New Issue
Block a user