1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-06 06:20:55 -08:00

Fix bugs in update-game-score, on MS-Windows and elsewhere.

lib-src/update-game-score.c (read_score): Try reading a character before
 probing the stream for EOF.  Initialize score->score to zero,
 before reading and accumulating the score.
 (read_scores): Fix logic that determines which value to return.
 Close the input stream when finished reading the scores (avoids
 failures in overwriting the file with a new one on MS-Windows,
 since a file that is open cannot be deleted).
 lib-src/ntlib.h (rename): Don't undefine.
 lib-src/ntlib.c (sys_rename): New function, needed for
 update-game-score.
This commit is contained in:
Eli Zaretskii 2013-08-05 20:09:28 +03:00
parent 5c0e57feb7
commit 98a428c15a
4 changed files with 60 additions and 28 deletions

View file

@ -228,10 +228,11 @@ static int
read_score (FILE *f, struct score_entry *score)
{
int c;
if ((c = getc (f)) != EOF)
ungetc (c, f);
if (feof (f))
return 1;
while ((c = getc (f)) != EOF
&& isdigit (c))
for (score->score = 0; (c = getc (f)) != EOF && isdigit (c); )
{
score->score *= 10;
score->score += (c-48);
@ -311,34 +312,38 @@ read_score (FILE *f, struct score_entry *score)
static int
read_scores (const char *filename, struct score_entry **scores, int *count)
{
int readval, scorecount, cursize;
int readval = -1, scorecount, cursize;
struct score_entry *ret;
FILE *f = fopen (filename, "r");
int retval = -1;
if (!f)
return -1;
scorecount = 0;
cursize = 16;
ret = (struct score_entry *) malloc (sizeof (struct score_entry) * cursize);
if (!ret)
return -1;
while ((readval = read_score (f, &ret[scorecount])) == 0)
if (ret)
{
/* We encountered an error. */
if (readval < 0)
return -1;
scorecount++;
if (scorecount >= cursize)
while ((readval = read_score (f, &ret[scorecount])) == 0)
{
cursize *= 2;
ret = (struct score_entry *)
realloc (ret, (sizeof (struct score_entry) * cursize));
if (!ret)
return -1;
scorecount++;
if (scorecount >= cursize)
{
cursize *= 2;
ret = (struct score_entry *)
realloc (ret, (sizeof (struct score_entry) * cursize));
if (!ret)
break;
}
}
}
*count = scorecount;
*scores = ret;
return 0;
if (readval > 0)
{
*count = scorecount;
*scores = ret;
retval = 0;
}
fclose (f);
return retval;
}
static int
@ -461,5 +466,4 @@ unlock_file (const char *filename, void *state)
return ret;
}
/* update-game-score.c ends here */