This is the mail archive of the crossgcc@cygnus.com mailing list for the crossgcc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: scanf() acting strange


I fixed this bug for the coldfire.
Since they use the same library source, you probably have the same bug.

The bug is in read.c,
The fix is to replace the code in the LIBGLOSS read.c with:

/*
 * read  -- read bytes from the serial port. Ignore fd, since
 *          we only have stdin.
 */
int     read(int fd ,char * buf,int nbytes)
{
  int i = 0;

  for (i = 0; i < nbytes; i++) {
    *(buf + i) = inbyte();
    if ((*(buf + i) == '\r') || (*(buf + i) == '\n'))  {
        *(buf +i)='\n';
        outbyte('\r');
        outbyte('\n');
        return i+1;
        }
        else
        outbyte(*(buf+i));
  }
  return (i);
}

The origional code was:

/*
 * read  -- read bytes from the serial port. Ignore fd, since
 *          we only have stdin.
 */
int
_DEFUN (read, (fd, buf, nbytes),
       int fd _AND
       char *buf _AND
       int nbytes)
{
  int i = 0;

  for (i = 0; i < nbytes; i++) {
    *(buf + i) = inbyte();
    if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) {
      (*(buf + i + 1)) = 0;
      break;
    }
  }
  return (i);
}

When it reads a \n or \r it breaks out of the loop.
i never gots incrmented.
So the number of chars read is reported as one too few.
The good old off by one bug ;-)