FILE* fdevopen(int(*put)(char, FILE *), int(*get)(FILE *))
This function is a replacement for fopen()
.
It opens a stream for a device where the actual device implementation needs to be
provided by the application. If successful, a pointer to the structure for the opened
stream is returned. Reasons for a possible failure currently include that neither the
put
nor the get
argument have been provided, thus attempting to open a stream with no IO intent at all,
or that insufficient dynamic memory is available to establish a new stream.
If the put
function pointer is provided, the stream
is opened with write intent. The function passed as put
shall take two arguments, the first a character to write to the device, and the second a
pointer to FILE, and shall return 0 if the output was successful, and a nonzero value if
the character could not be sent to the device.
If the get
function pointer is provided, the stream
is opened with read intent. The function passed as get
shall take a pointer to FILE as its single argument, and return one character from the
device, passed as an int
type. If an error occurs when
trying to read from the device, it shall return
_FDEV_ERR
. If an end-of-file condition was reached
while reading from the device, _FDEV_EOF
shall be
returned.
If both functions are provided, the stream is opened with read and write intent.
The first stream opened with read intent is assigned to
stdin
, and the first one opened with write intent is
assigned to both, stdout
and
stderr
.
fdevopen() uses calloc() (und thus malloc()) in order to allocate the storage for the new stream.
If the macro __STDIO_FDEVOPEN_COMPAT_12 is declared before including <stdio.h>, a function prototype for fdevopen() will be chosen that is backwards compatible with avr-libc version 1.2 and before. This is solely intented for providing a simple migration path without the need to immediately change all source code. Do not use for new code.