Qt character selection buglet
Testing for generic character name wasn't robust enough. Looking for whether "game" is a generic name would work when compared with the list "game games" but falsely report 'no' for the list "games game". The first matching substring isn't followed by a space and the routine wasn't checking for other matches in the rest of the list. Check again with a subset list starting after the next space beyond the false hit; repeat as needed.
This commit is contained in:
+12
-6
@@ -39,7 +39,7 @@ extern "C" {
|
|||||||
static bool generic_plname()
|
static bool generic_plname()
|
||||||
{
|
{
|
||||||
if (*g.plname) {
|
if (*g.plname) {
|
||||||
const char *sptr;
|
const char *sptr, *p;
|
||||||
const char *genericusers = sysopt.genericusers;
|
const char *genericusers = sysopt.genericusers;
|
||||||
int ln = (int) strlen(g.plname);
|
int ln = (int) strlen(g.plname);
|
||||||
|
|
||||||
@@ -48,12 +48,18 @@ static bool generic_plname()
|
|||||||
else if (!strcmp(genericusers, "*")) /* "*" => always ask for name */
|
else if (!strcmp(genericusers, "*")) /* "*" => always ask for name */
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if ((sptr = strstri(genericusers, g.plname)) != 0
|
while ((sptr = strstri(genericusers, g.plname)) != NULL) {
|
||||||
/* check for full word: start of list or following a space */
|
/* check for full word: start of list or following a space */
|
||||||
&& (sptr == genericusers || sptr[-1] == ' ')
|
if ((sptr == genericusers || sptr[-1] == ' ')
|
||||||
/* and also preceding a space or at end of list */
|
/* and also preceding a space or at end of list */
|
||||||
&& (sptr[ln] == ' ' || sptr[ln] == '\0'))
|
&& (sptr[ln] == ' ' || sptr[ln] == '\0'))
|
||||||
return true;
|
return true;
|
||||||
|
/* doesn't match full word, but maybe we got a false hit when
|
||||||
|
looking for "play" in list "player play" so keep going */
|
||||||
|
if ((p = strchr(sptr + 1, ' ')) == NULL)
|
||||||
|
break;
|
||||||
|
genericusers = p + 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user