summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/libstdio/setvbuf.c
diff options
context:
space:
mode:
Diffstat (limited to 'mdk-stage1/dietlibc/libstdio/setvbuf.c')
-rw-r--r--mdk-stage1/dietlibc/libstdio/setvbuf.c32
1 files changed, 24 insertions, 8 deletions
diff --git a/mdk-stage1/dietlibc/libstdio/setvbuf.c b/mdk-stage1/dietlibc/libstdio/setvbuf.c
index d0b1b7640..b8b50addf 100644
--- a/mdk-stage1/dietlibc/libstdio/setvbuf.c
+++ b/mdk-stage1/dietlibc/libstdio/setvbuf.c
@@ -1,18 +1,34 @@
#include <sys/types.h>
#include "dietstdio.h"
#include <unistd.h>
+#include <stdlib.h>
#include "dietwarning.h"
-int setvbuf(FILE *stream, char *buf, int flags , size_t size) {
-#ifdef WANT_BUFFERED_STDIO
+static int set_flags (FILE *stream, int flags) {
switch (flags) {
- case _IONBF: stream->flags = (stream->flags & ~(BUFLINEWISE)) | NOBUF; break;
- case _IOLBF: stream->flags = (stream->flags & ~(BUFLINEWISE|NOBUF)) | BUFLINEWISE; break;
- case _IOFBF: stream->flags = stream->flags & ~(NOBUF | BUFLINEWISE); break;
- default: return -1;
+ case _IONBF: stream->flags = (stream->flags & ~(BUFLINEWISE)) | NOBUF; break;
+ case _IOLBF: stream->flags = (stream->flags & ~(NOBUF)) | BUFLINEWISE; break;
+ case _IOFBF: stream->flags = stream->flags & ~(NOBUF | BUFLINEWISE); break;
+ default: return -1;
}
-#endif
return 0;
}
-link_warning("setvbuf","setvbuf does not implement changing the buffer in diet libc.")
+int setvbuf(FILE *stream, char *buf, int flags, size_t size) {
+ if (buf) {
+ if (!(stream->flags&STATICBUF)) free(stream->buf);
+ stream->buf=buf;
+ }
+ else {
+ char *tmp;
+ if (!size) {
+ return set_flags(stream,flags);
+ }
+ if (!(tmp=malloc(size))) return -1;
+ if (!(stream->flags&STATICBUF)) free(stream->buf);
+ stream->buf=tmp;
+ }
+ stream->buflen=size;
+ stream->bm=stream->bs=0;
+ return set_flags(stream,flags);
+}