diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2017-12-15 09:38:53 -0500 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2017-12-15 09:39:34 -0500 |
commit | f95a4a932476be2ba99e2fd081e8d2bc6ea12813 (patch) | |
tree | 75f67192cb2d7b7b575c94edda318e475239b63c /newlib/libc/stdio/stdio.c | |
parent | f60aca96985e68c7d8a52eb7bc955fb80e132f73 (diff) |
Import newlib and create makefile
Diffstat (limited to 'newlib/libc/stdio/stdio.c')
-rw-r--r-- | newlib/libc/stdio/stdio.c | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/newlib/libc/stdio/stdio.c b/newlib/libc/stdio/stdio.c new file mode 100644 index 0000000..c06f51a --- /dev/null +++ b/newlib/libc/stdio/stdio.c @@ -0,0 +1,92 @@ +/* No user fns here. Pesch 15apr92. */ + +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include <stdio.h> +#include <sys/types.h> +#include <fcntl.h> +#include <sys/unistd.h> +#include "local.h" + +/* + * Small standard I/O/seek/close functions. + * These maintain the `known seek offset' for seek optimisation. + */ + +int +__sread (cookie, buf, n) + _PTR cookie; + char *buf; + int n; +{ + register FILE *fp = (FILE *) cookie; + register int ret; + + ret = _read_r (fp->_data, fp->_file, buf, n); + + /* If the read succeeded, update the current offset. */ + + if (ret >= 0) + fp->_offset += ret; + else + fp->_flags &= ~__SOFF; /* paranoia */ + return ret; +} + +int +__swrite (cookie, buf, n) + _PTR cookie; + char _CONST *buf; + int n; +{ + register FILE *fp = (FILE *) cookie; + + if (fp->_flags & __SAPP) + (void) _lseek_r (fp->_data, fp->_file, (off_t) 0, SEEK_END); + fp->_flags &= ~__SOFF; /* in case O_APPEND mode is set */ + return _write_r (fp->_data, fp->_file, buf, n); +} + +fpos_t +__sseek (cookie, offset, whence) + _PTR cookie; + fpos_t offset; + int whence; +{ + register FILE *fp = (FILE *) cookie; + register off_t ret; + + ret = _lseek_r (fp->_data, fp->_file, (off_t) offset, whence); + if (ret == -1L) + fp->_flags &= ~__SOFF; + else + { + fp->_flags |= __SOFF; + fp->_offset = ret; + } + return ret; +} + +int +__sclose (cookie) + _PTR cookie; +{ + FILE *fp = (FILE *) cookie; + + return _close_r (fp->_data, fp->_file); +} |