mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-02-03 21:06:58 +00:00
(svn r19578) -Codechange: do not accept commas at invalid places in ParseIntList()
This commit is contained in:
parent
5eb1e3d033
commit
dea165c3be
@ -158,19 +158,38 @@ static uint32 LookupManyOfMany(const char *many, const char *str)
|
||||
* @return returns the number of items found, or -1 on an error */
|
||||
int ParseIntList(const char *p, int *items, int maxitems)
|
||||
{
|
||||
int n = 0, v;
|
||||
char *end;
|
||||
int n = 0; // number of items read so far
|
||||
bool comma = false; // do we accept comma?
|
||||
|
||||
for (;;) {
|
||||
v = strtol(p, &end, 0);
|
||||
if (p == end || n == maxitems) return -1;
|
||||
p = end;
|
||||
items[n++] = v;
|
||||
if (*p == '\0') break;
|
||||
if (*p != ',' && *p != ' ') return -1;
|
||||
p++;
|
||||
while (*p != '\0') {
|
||||
switch (*p) {
|
||||
case ',':
|
||||
/* Do not accept multiple commas between numbers */
|
||||
if (!comma) return -1;
|
||||
comma = false;
|
||||
/* FALL THROUGH */
|
||||
case ' ':
|
||||
p++;
|
||||
break;
|
||||
|
||||
default: {
|
||||
if (n == maxitems) return -1; // we don't accept that many numbers
|
||||
char *end;
|
||||
long v = strtol(p, &end, 0);
|
||||
if (p == end) return -1; // invalid character (not a number)
|
||||
if (sizeof(int) < sizeof(long)) v = ClampToI32(v);
|
||||
items[n++] = v;
|
||||
p = end; // first non-number
|
||||
comma = true; // we accept comma now
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* If we have read comma but no number after it, fail.
|
||||
* We have read comma when (n != 0) and comma is not allowed */
|
||||
if (n != 0 && !comma) return -1;
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user