Services and Modeling for Embedded Software Development
Embecosm divider strip
Prev  Next

5.3.14.  Read from a File, read

For a namespace clean function, implement _read, otherwise implement read. The detailed implementation will depend on the file handling functionality available.

A minimal implementation has no file system. Rather than failing, this function returns 0, indicating end-of-file.

#include <errno.h>

#undef errno
extern int  errno;

int
_read (int   file,
       char *ptr,
       int   len)
{
  return  0;                            /* EOF */

}       /* _read () */
	  

The OpenRISC 1000  BSP without a UART is very similar to the minimal implementation, but checks that the stream is standard input before returning 0. For all other streams it returns an error.

#include <errno.h>
#include <unistd.h>

#undef errno
extern int  errno;

int
_read (int   file,
       char *ptr,
       int   len)
{
  if (STDIN_FILENO == file)
    {
      return  0;                        /* EOF */
    }
  else
    {
      errno = EBADF;
      return  -1;
    }
}       /* _read () */
	  

The OpenRISC 1000  BSP with a UART is more complex. In this case, if the stream is standard input, a character is read (and optionally echoed) from the UART.

#include <errno.h>
#include <unistd.h>

#undef errno
extern int  errno;

int
_read (int   file,
       char *buf,
       int   len)
{
  if (STDIN_FILENO == file)
    {
      int  i;

      for (i = 0; i < len; i++)
	{
	  buf[i] = _uart_getc ();
#ifdef UART_AUTO_ECHO
	  _uart_putc (buf[i]);
#endif
	  /* Return partial buffer if we get EOL */
	  if ('\n' == buf[i])
	    {
	      return  i;
	    }
	}

      return  i;			/* Filled the buffer */
    }
  else
    {
      errno = EBADF;
      return  -1;
    }
}	/* _read () */
	  
[Caution]Caution

The Or1ksim UART implementation only returns data when carriage return is hit, rather than as each character becomes available, which can lead to some unexpected behavior.

Embecosm divider strip