- int c;
- if ((c = getc (f)) != EOF)
- ungetc (c, f);
- if (feof (f))
- return 1;
- for (score->score = 0; (c = getc (f)) != EOF && isdigit (c); )
- {
- if (INTMAX_MAX / 10 < score->score)
- return -1;
- score->score *= 10;
- if (INTMAX_MAX - (c - '0') < score->score)
- return -1;
- score->score += c - '0';
- }
- while ((c = getc (f)) != EOF
- && isspace (c))
- ;
- if (c == EOF)
- return -1;
- ungetc (c, f);
-#ifdef HAVE_GETDELIM
- {
- size_t count = 0;
- score->username = 0;
- if (getdelim (&score->username, &count, ' ', f) < 1
- || score->username == NULL)
- return -1;
- /* Trim the space */
- score->username[strlen (score->username)-1] = '\0';
- }
-#else
- {
- ptrdiff_t unameread = 0;
- ptrdiff_t unamelen = 30;
- char *username = malloc (unamelen);
- if (!username)
- return -1;
-
- while ((c = getc (f)) != EOF && c != ' ')
- {
- if (unameread >= unamelen - 1)
- {
- ptrdiff_t unamelen_max = min (PTRDIFF_MAX, SIZE_MAX);
- if (unamelen <= unamelen_max / 2)
- unamelen *= 2;
- else if (unamelen < unamelen_max)
- unamelen = unamelen_max;
- else
- {
- errno = ENOMEM;
- return -1;
- }
- username = realloc (username, unamelen);
- if (!username)
- return -1;
- }
- username[unameread] = c;
- unameread++;
- }
- if (c == EOF)
- return -1;
- username[unameread] = '\0';
- score->username = username;
- }
-#endif
-#ifdef HAVE_GETLINE
- score->data = NULL;
- errno = 0;
- {
- size_t len;
- if (getline (&score->data, &len, f) < 0)
- return -1;
- score->data[strlen (score->data)-1] = '\0';
- }
-#else
- {
- ptrdiff_t cur = 0;
- ptrdiff_t len = 16;
- char *buf = malloc (len);
- if (!buf)
- return -1;
- while ((c = getc (f)) != EOF
- && c != '\n')
- {
- if (cur >= len-1)
- {
- if (min (PTRDIFF_MAX, SIZE_MAX) / 2 < len)
- {
- errno = ENOMEM;
- return -1;
- }
- if (!(buf = realloc (buf, len *= 2)))
- return -1;
- }
- buf[cur] = c;
- cur++;
- }
- score->data = buf;
- score->data[cur] = '\0';
- }
-#endif
- return 0;