summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/libstdio
diff options
context:
space:
mode:
Diffstat (limited to 'mdk-stage1/dietlibc/libstdio')
-rw-r--r--mdk-stage1/dietlibc/libstdio/fclose.c8
-rw-r--r--mdk-stage1/dietlibc/libstdio/fdglue.c34
-rw-r--r--mdk-stage1/dietlibc/libstdio/fdopen.c18
-rw-r--r--mdk-stage1/dietlibc/libstdio/feof.c2
-rw-r--r--mdk-stage1/dietlibc/libstdio/fflush.c34
-rw-r--r--mdk-stage1/dietlibc/libstdio/fgetc.c40
-rw-r--r--mdk-stage1/dietlibc/libstdio/fgets.c4
-rw-r--r--mdk-stage1/dietlibc/libstdio/fopen.c8
-rw-r--r--mdk-stage1/dietlibc/libstdio/fprintf.c18
-rw-r--r--mdk-stage1/dietlibc/libstdio/fputc.c19
-rw-r--r--mdk-stage1/dietlibc/libstdio/fread.c55
-rw-r--r--mdk-stage1/dietlibc/libstdio/fseek.c7
-rw-r--r--mdk-stage1/dietlibc/libstdio/ftell.c2
-rw-r--r--mdk-stage1/dietlibc/libstdio/fwrite.c28
-rw-r--r--mdk-stage1/dietlibc/libstdio/printf.c20
-rw-r--r--mdk-stage1/dietlibc/libstdio/setvbuf.c32
-rw-r--r--mdk-stage1/dietlibc/libstdio/stderr.c25
-rw-r--r--mdk-stage1/dietlibc/libstdio/stdin.c26
-rw-r--r--mdk-stage1/dietlibc/libstdio/stdout.c25
-rw-r--r--mdk-stage1/dietlibc/libstdio/ungetc.c7
20 files changed, 157 insertions, 255 deletions
diff --git a/mdk-stage1/dietlibc/libstdio/fclose.c b/mdk-stage1/dietlibc/libstdio/fclose.c
index a955c6086..491ed2522 100644
--- a/mdk-stage1/dietlibc/libstdio/fclose.c
+++ b/mdk-stage1/dietlibc/libstdio/fclose.c
@@ -4,14 +4,9 @@
int fclose(FILE *stream) {
int res;
-#ifdef WANT_BUFFERED_STDIO
FILE *f,*fl;
-#endif
- if (!stream)
- return EOF;
fflush(stream);
res=close(stream->fd);
-#ifdef WANT_BUFFERED_STDIO
for (fl=0,f=__stdio_root; f; fl=f,f=f->next)
if (f==stream) {
if (fl)
@@ -20,7 +15,8 @@ int fclose(FILE *stream) {
__stdio_root=f->next;
break;
}
-#endif
+ if ((!(stream->flags&STATICBUF))&&(stream->buf))
+ free(stream->buf);
free(stream);
return res;
}
diff --git a/mdk-stage1/dietlibc/libstdio/fdglue.c b/mdk-stage1/dietlibc/libstdio/fdglue.c
index 1c3918f1f..9542711e2 100644
--- a/mdk-stage1/dietlibc/libstdio/fdglue.c
+++ b/mdk-stage1/dietlibc/libstdio/fdglue.c
@@ -1,13 +1,9 @@
-#include "dietstdio.h"
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
-
-#ifdef WANT_BUFFERED_STDIO
-extern int __stdio_atexit;
-extern void __stdio_flushall();
-#endif
+#include <pthread.h>
+#include "dietstdio.h"
int __stdio_parse_mode(const char *mode) {
int f=0;
@@ -24,29 +20,3 @@ int __stdio_parse_mode(const char *mode) {
}
}
-FILE* __stdio_init_file(int fd) {
- FILE *tmp=(FILE*)malloc(sizeof(FILE));
- if (!tmp) {
- close(fd);
- errno=ENOMEM;
- return 0;
- }
- tmp->fd=fd;
-#ifdef WANT_BUFFERED_STDIO
- tmp->bm=0;
- tmp->bs=0;
-#endif
-#ifdef WANT_UNGETC
- tmp->ungotten = 0;
-#endif
- tmp->flags=0;
-#ifdef WANT_BUFFERED_STDIO
- if (__stdio_atexit==0) {
- __stdio_atexit=1;
- atexit(__stdio_flushall);
- }
- tmp->next=__stdio_root;
- __stdio_root=tmp;
-#endif
- return tmp;
-}
diff --git a/mdk-stage1/dietlibc/libstdio/fdopen.c b/mdk-stage1/dietlibc/libstdio/fdopen.c
index aee14fb0c..748b716eb 100644
--- a/mdk-stage1/dietlibc/libstdio/fdopen.c
+++ b/mdk-stage1/dietlibc/libstdio/fdopen.c
@@ -1,21 +1,13 @@
+#include <errno.h>
+#include "dietfeatures.h"
#include <sys/types.h>
#include <dietstdio.h>
#include <unistd.h>
-#define SEEK_END 2
-
-int __stdio_parse_mode(const char *mode);
-FILE* __stdio_init_file(int fd);
-
-FILE *fdopen (int filedes, const char *mode) {
+FILE *fdopen(int filedes, const char *mode) {
int f=0; /* O_RDONLY, O_WRONLY or O_RDWR */
- int fd;
f=__stdio_parse_mode(mode);
- if ((fd=filedes)<0) return 0;
- {
- FILE * ret = __stdio_init_file(fd);
- ret->flags |= UNSEEKABLE;
- return ret;
- }
+ if (filedes<0) { errno=EBADF; return 0; }
+ return __stdio_init_file(filedes,0);
}
diff --git a/mdk-stage1/dietlibc/libstdio/feof.c b/mdk-stage1/dietlibc/libstdio/feof.c
index b7e86fe3b..bf2267fcf 100644
--- a/mdk-stage1/dietlibc/libstdio/feof.c
+++ b/mdk-stage1/dietlibc/libstdio/feof.c
@@ -1,9 +1,7 @@
#include <dietstdio.h>
int feof(FILE *stream) {
-#ifdef WANT_UNGETC
/* yuck!!! */
if (stream->ungotten) return 0;
-#endif
return (stream->flags&EOFINDICATOR);
}
diff --git a/mdk-stage1/dietlibc/libstdio/fflush.c b/mdk-stage1/dietlibc/libstdio/fflush.c
index 7078e04f4..e0e23b3ba 100644
--- a/mdk-stage1/dietlibc/libstdio/fflush.c
+++ b/mdk-stage1/dietlibc/libstdio/fflush.c
@@ -1,21 +1,16 @@
-#include "dietstdio.h"
#include <unistd.h>
#include <stdlib.h>
#include "dietwarning.h"
+#include "dietstdio.h"
FILE *__stdio_root;
-#ifdef WANT_BUFFERED_STDIO
int __stdio_atexit=0;
-void __stdio_flushall() {
+void __stdio_flushall(void) {
fflush(0);
}
-extern int __fflush_stdin();
-extern int __fflush_stdout();
-extern int __fflush_stderr();
-
int fflush(FILE *stream) {
if (stream==0) {
int res;
@@ -28,15 +23,20 @@ int fflush(FILE *stream) {
res=-1;
return res;
}
+// if (stream->flags&NOBUF) return 0;
if (stream->flags&BUFINPUT) {
register int tmp;
- if ((tmp=stream->bm-stream->bs)) lseek(stream->fd,tmp,SEEK_CUR);
- } else
- if (stream->bm && write(stream->fd,stream->buf,stream->bm)!=stream->bm) {
+ if ((tmp=stream->bm-stream->bs)) {
+ lseek(stream->fd,tmp,SEEK_CUR);
+ }
+ stream->bs=stream->bm=0;
+ } else {
+ if (stream->bm && write(stream->fd,stream->buf,stream->bm)!=(int)stream->bm) {
stream->flags|=ERRORINDICATOR;
return -1;
}
- stream->bm=0;
+ stream->bm=0;
+ }
return 0;
}
@@ -50,13 +50,15 @@ int __fflush4(FILE *stream,int next) {
stream->flags=(stream->flags&~BUFINPUT)|next;
return res;
}
+ if (stream->fd==0) __fflush_stdout();
return 0;
}
-#else
-int fflush(FILE *stream) {
- return 0;
+/* Internal function, has no prototype.
+ * This is defined here because of the weak symbol ELF semantics */
+int __stdio_outs(const char *s,size_t len);
+int __stdio_outs(const char *s,size_t len) {
+ return fwrite(s,1,(size_t)len,stdout)==len?1:0;
}
-#endif
-link_warning("fflush","warning: your code uses stdio (several kilobytes of bloat).")
+link_warning("fflush","warning: your code uses stdio (7+k bloat).")
diff --git a/mdk-stage1/dietlibc/libstdio/fgetc.c b/mdk-stage1/dietlibc/libstdio/fgetc.c
deleted file mode 100644
index 90d83961a..000000000
--- a/mdk-stage1/dietlibc/libstdio/fgetc.c
+++ /dev/null
@@ -1,40 +0,0 @@
-#include "dietstdio.h"
-#include <unistd.h>
-
-extern int feof(FILE *stream);
-
-int fgetc(FILE *stream) {
- unsigned char c;
-#ifdef WANT_UNGETC
- if (stream->ungotten) {
- stream->ungotten=0;
- return stream->ungetbuf;
- }
-#endif
- if (feof(stream))
- return EOF;
-#ifdef WANT_BUFFERED_STDIO
- if (__fflush4(stream,BUFINPUT)) return EOF;
- if (stream->bm>=stream->bs) {
- int len=read(stream->fd,stream->buf,BUFSIZE);
- if (len==0) {
- stream->flags|=EOFINDICATOR;
- return EOF;
- } else if (len<0) {
- stream->flags|=ERRORINDICATOR;
- return EOF;
- }
- stream->bm=0;
- stream->bs=len;
- }
- c=stream->buf[stream->bm];
- ++stream->bm;
- return c;
-#else
- if (read(stream->fd,&c,1)!=1) {
- stream->flags|=ERRORINDICATOR;
- return EOF;
- }
- return c;
-#endif
-}
diff --git a/mdk-stage1/dietlibc/libstdio/fgets.c b/mdk-stage1/dietlibc/libstdio/fgets.c
index c613d452d..d2ce4195d 100644
--- a/mdk-stage1/dietlibc/libstdio/fgets.c
+++ b/mdk-stage1/dietlibc/libstdio/fgets.c
@@ -1,11 +1,9 @@
#include "dietstdio.h"
-extern int ferror(FILE *stream);
-
char *fgets(char *s, int size, FILE *stream) {
char *orig=s;
int l;
- for (l=size; l>0;) {
+ for (l=size; l>1;) {
int c=fgetc(stream);
if (c==EOF) break;
*s=c;
diff --git a/mdk-stage1/dietlibc/libstdio/fopen.c b/mdk-stage1/dietlibc/libstdio/fopen.c
index aac17be42..3d9c28198 100644
--- a/mdk-stage1/dietlibc/libstdio/fopen.c
+++ b/mdk-stage1/dietlibc/libstdio/fopen.c
@@ -2,13 +2,7 @@
#include <dietstdio.h>
#include <unistd.h>
-#define SEEK_END 2
-
extern int __stdio_atexit;
-extern void __stdio_flushall();
-
-extern int __stdio_parse_mode(const char *mode);
-extern FILE* __stdio_init_file(int fd);
FILE *fopen (const char *path, const char *mode) {
int f=0; /* O_RDONLY, O_WRONLY or O_RDWR */
@@ -17,5 +11,5 @@ FILE *fopen (const char *path, const char *mode) {
f=__stdio_parse_mode(mode);
if ((fd=open(path,f,0666))<0)
return 0;
- return __stdio_init_file(fd);
+ return __stdio_init_file(fd,1);
}
diff --git a/mdk-stage1/dietlibc/libstdio/fprintf.c b/mdk-stage1/dietlibc/libstdio/fprintf.c
index 237fd1e51..6b3849a33 100644
--- a/mdk-stage1/dietlibc/libstdio/fprintf.c
+++ b/mdk-stage1/dietlibc/libstdio/fprintf.c
@@ -1,23 +1,13 @@
#include <stdarg.h>
-#include <linux/types.h>
+#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
-extern int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr);
-
int fprintf(FILE *f,const char *format,...) {
int n;
- char *printf_buf;
-/* char printf_buf[1024]; */
va_list arg_ptr;
- va_start(arg_ptr, format);
- n=vsnprintf(0,1000000,format,arg_ptr);
-/* write(1,printf_buf,strlen(printf_buf)); */
- va_end (arg_ptr);
- va_start (arg_ptr, format);
- printf_buf=alloca(n+2);
- n=vsnprintf(printf_buf,n+1,format,arg_ptr);
- va_end (arg_ptr);
- fwrite(printf_buf,n,1,f);
+ va_start(arg_ptr,format);
+ n=vfprintf(f,format,arg_ptr);
+ va_end(arg_ptr);
return n;
}
diff --git a/mdk-stage1/dietlibc/libstdio/fputc.c b/mdk-stage1/dietlibc/libstdio/fputc.c
deleted file mode 100644
index b816f7c4d..000000000
--- a/mdk-stage1/dietlibc/libstdio/fputc.c
+++ /dev/null
@@ -1,19 +0,0 @@
-#include <dietstdio.h>
-#ifndef WANT_BUFFERED_STDIO
-#include <unistd.h>
-#endif
-
-int fputc(int c, FILE *stream) {
-#ifdef WANT_BUFFERED_STDIO
- if (__fflush4(stream,0)) return EOF;
- if (stream->bm>=BUFSIZE-1)
- if (fflush(stream)) return EOF;
- stream->buf[stream->bm]=c;
- ++stream->bm;
- if ((stream->flags&BUFLINEWISE) && c=='\n') /* puke */
- if (fflush(stream)) return EOF;
-#else
- write(stream->fd,&c,1);
-#endif
- return 0;
-}
diff --git a/mdk-stage1/dietlibc/libstdio/fread.c b/mdk-stage1/dietlibc/libstdio/fread.c
index 29afa1489..813a98fb2 100644
--- a/mdk-stage1/dietlibc/libstdio/fread.c
+++ b/mdk-stage1/dietlibc/libstdio/fread.c
@@ -4,48 +4,43 @@
size_t fread( void *ptr, size_t size, size_t nmemb, FILE *stream) {
int res;
-#ifdef WANT_BUFFERED_STDIO
unsigned long i,j;
j=size*nmemb;
-#ifdef WANT_UNGETC
+ i=0;
+
+ if (!j || j/nmemb!=size) return 0;
if (stream->ungotten) {
+ stream->ungotten=0;
*(char*)ptr=stream->ungetbuf;
- ptr=((char*)ptr)+1;
- --j;
+ ++i;
}
if (!j) return 1;
+
+#ifdef WANT_FREAD_OPTIMIZATION
+ if ( !(stream->flags&FDPIPE) && (j>stream->buflen)) {
+ size_t tmp=j-i;
+ int res;
+ fflush(stream);
+ while ((res=read(stream->fd,ptr+i,tmp))<(int)tmp) {
+ if (res==-1) {
+ stream->flags|=ERRORINDICATOR;
+ goto exit;
+ } else if (!res) {
+ stream->flags|=EOFINDICATOR;
+ goto exit;
+ }
+ i+=res; tmp-=res;
+ }
+ return nmemb;
+ }
#endif
- for (i=0; i<j; ++i) {
+ for (; i<j; ++i) {
res=fgetc(stream);
if (res==EOF)
+exit:
return i/size;
else
((unsigned char*)ptr)[i]=(unsigned char)res;
}
return nmemb;
-#else
-#ifdef WANT_UNGETC
- unsigned long j=size*nmemb;
-#endif
- fflush(stream);
-#ifdef WANT_UNGETC
- if (stream->ungotten) {
- *(char*)ptr=stream->ungetbuf;
- ptr=((char*)ptr)+1;
- --j;
- }
- if (!j) return 1;
- res=read(stream->fd,ptr,j);
-#else
- res=read(stream->fd,ptr,size*nmemb);
-#endif
- if (res<0) {
- stream->flags|=ERRORINDICATOR;
- return 0;
- } else if (res<size*nmemb)
- if (!(stream->flags & UNSEEKABLE)
- || ((stream->flags & UNSEEKABLE) && res == 0))
- stream->flags|=EOFINDICATOR;
- return res/size;
-#endif
}
diff --git a/mdk-stage1/dietlibc/libstdio/fseek.c b/mdk-stage1/dietlibc/libstdio/fseek.c
index 5bb96bc6e..a49230f0a 100644
--- a/mdk-stage1/dietlibc/libstdio/fseek.c
+++ b/mdk-stage1/dietlibc/libstdio/fseek.c
@@ -1,11 +1,10 @@
#include <dietstdio.h>
#include <unistd.h>
-long fseek(FILE *stream, long offset, int whence) {
+int fseek(FILE *stream, long offset, int whence) {
fflush(stream);
-#ifdef WANT_BUFFERED_STDIO
stream->bm=0; stream->bs=0;
-#endif
stream->flags&=~(ERRORINDICATOR|EOFINDICATOR);
- return (lseek(stream->fd,offset,whence));
+ stream->ungotten=0;
+ return lseek(stream->fd,offset,whence)!=-1?0:-1;
}
diff --git a/mdk-stage1/dietlibc/libstdio/ftell.c b/mdk-stage1/dietlibc/libstdio/ftell.c
index 42d2c9f26..48f74858a 100644
--- a/mdk-stage1/dietlibc/libstdio/ftell.c
+++ b/mdk-stage1/dietlibc/libstdio/ftell.c
@@ -3,5 +3,5 @@
long ftell(FILE *stream) {
fflush(stream);
- return (lseek(stream->fd,0,SEEK_CUR));
+ return (lseek(stream->fd,0,SEEK_CUR)-stream->ungotten);
}
diff --git a/mdk-stage1/dietlibc/libstdio/fwrite.c b/mdk-stage1/dietlibc/libstdio/fwrite.c
index 5691661a5..e2536ccfb 100644
--- a/mdk-stage1/dietlibc/libstdio/fwrite.c
+++ b/mdk-stage1/dietlibc/libstdio/fwrite.c
@@ -1,30 +1,28 @@
#include <sys/types.h>
#include "dietstdio.h"
#include <unistd.h>
+#include <errno.h>
-size_t fwrite( const void *ptr, size_t size, size_t nmemb, FILE *stream) {
+size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) {
int res;
-#ifdef WANT_BUFFERED_STDIO
- long len=size*nmemb;
+ unsigned long len=size*nmemb;
long i;
- if (len>BUFSIZE || (stream->flags&NOBUF)) {
- if (!(stream->flags&NOBUF)) fflush(stream);
- res=write(stream->fd,ptr,size*nmemb);
+ if (!nmemb || len/nmemb!=size) return 0; /* check for integer overflow */
+ if (len>stream->buflen || (stream->flags&NOBUF)) {
+ fflush(stream);
+ do {
+ res=write(stream->fd,ptr,size*nmemb);
+ } while (res==-1 && errno==EINTR);
} else {
register const unsigned char *c=ptr;
- for (i=size*nmemb; i>0; --i,++c)
- if (fputc(*c,stream)) {
- res=-1;
- break;
- }
- res=size*nmemb;
+ for (i=len; i>0; --i,++c)
+ if (fputc(*c,stream)) { res=len-i; goto abort; }
+ res=len;
}
-#else
- res=write(stream->fd,ptr,size*nmemb);
-#endif
if (res<0) {
stream->flags|=ERRORINDICATOR;
return 0;
}
+abort:
return size?res/size:0;
}
diff --git a/mdk-stage1/dietlibc/libstdio/printf.c b/mdk-stage1/dietlibc/libstdio/printf.c
index 571420dc3..5af172c58 100644
--- a/mdk-stage1/dietlibc/libstdio/printf.c
+++ b/mdk-stage1/dietlibc/libstdio/printf.c
@@ -1,29 +1,15 @@
#include <stdarg.h>
-#include <linux/types.h>
+#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include "dietstdio.h"
-int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr);
-
int printf(const char *format,...)
{
int n;
- char *printf_buf;
-/* char printf_buf[1024]; */
va_list arg_ptr;
va_start(arg_ptr, format);
- n=vsnprintf(0,1000000,format,arg_ptr);
-/* write(1,printf_buf,strlen(printf_buf)); */
- va_end (arg_ptr);
- va_start (arg_ptr, format);
- printf_buf=alloca(n+2);
- n=vsnprintf(printf_buf,n+1,format,arg_ptr);
-#ifdef WANT_BUFFERED_STDIO
- fwrite(printf_buf,n,1,stdout);
-#else
- write(1,printf_buf,n);
-#endif
- va_end (arg_ptr);
+ n=vprintf(format, arg_ptr);
+ va_end(arg_ptr);
return n;
}
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);
+}
diff --git a/mdk-stage1/dietlibc/libstdio/stderr.c b/mdk-stage1/dietlibc/libstdio/stderr.c
index a82b1b727..a9a34fd7e 100644
--- a/mdk-stage1/dietlibc/libstdio/stderr.c
+++ b/mdk-stage1/dietlibc/libstdio/stderr.c
@@ -1,13 +1,22 @@
#include <dietstdio.h>
-#ifdef WANT_BUFFERED_STDIO
-static FILE __stderr = { 2, NOBUF, 0, 0 };
-
-int __fflush_stderr() {
- return fflush(stderr);
-}
-#else
-static FILE __stderr = { 2, 0 };
+static FILE __stderr = {
+ .fd=2,
+ .flags=NOBUF,
+ .bs=0, .bm=0,
+ .buflen=0,
+ .buf=0,
+ .next=0,
+ .popen_kludge=0,
+ .ungetbuf=0,
+ .ungotten=0
+#ifdef WANT_THREAD_SAFE
+ , .m=PTHREAD_MUTEX_INITIALIZER
#endif
+};
FILE *stderr=&__stderr;
+
+int __fflush_stderr(void) {
+ return fflush(stderr);
+}
diff --git a/mdk-stage1/dietlibc/libstdio/stdin.c b/mdk-stage1/dietlibc/libstdio/stdin.c
index 2db82f9ab..217f3f609 100644
--- a/mdk-stage1/dietlibc/libstdio/stdin.c
+++ b/mdk-stage1/dietlibc/libstdio/stdin.c
@@ -1,13 +1,23 @@
#include <dietstdio.h>
-#ifdef WANT_BUFFERED_STDIO
-static FILE __stdin = { 0, BUFINPUT, 0, 0 };
-
-int __fflush_stdin() {
- return fflush(stdin);
-}
-#else
-static FILE __stdin = { 0, 0 };
+static char __stdin_buf[BUFSIZE];
+static FILE __stdin = {
+ .fd=0,
+ .flags=BUFINPUT|STATICBUF,
+ .bs=0, .bm=0,
+ .buflen=BUFSIZE,
+ .buf=__stdin_buf,
+ .next=0,
+ .popen_kludge=0,
+ .ungetbuf=0,
+ .ungotten=0
+#ifdef WANT_THREAD_SAFE
+ , .m=PTHREAD_MUTEX_INITIALIZER
#endif
+};
FILE *stdin=&__stdin;
+
+int __fflush_stdin(void) {
+ return fflush(stdin);
+}
diff --git a/mdk-stage1/dietlibc/libstdio/stdout.c b/mdk-stage1/dietlibc/libstdio/stdout.c
index 481fb1014..08054d0d4 100644
--- a/mdk-stage1/dietlibc/libstdio/stdout.c
+++ b/mdk-stage1/dietlibc/libstdio/stdout.c
@@ -1,14 +1,23 @@
#include <dietstdio.h>
-#ifdef WANT_BUFFERED_STDIO
-static FILE __stdout = { 1, BUFLINEWISE, 0, 0 };
-
-int __fflush_stdout() {
- return fflush(stdout);
-}
-#else
-static FILE __stdout = { 1, 0 };
+static char __stdout_buf[BUFSIZE];
+static FILE __stdout = {
+ .fd=1,
+ .flags=BUFLINEWISE|STATICBUF,
+ .bs=0, .bm=0,
+ .buflen=BUFSIZE,
+ .buf=__stdout_buf,
+ .next=0,
+ .popen_kludge=0,
+ .ungetbuf=0,
+ .ungotten=0
+#ifdef WANT_THREAD_SAFE
+ , .m=PTHREAD_MUTEX_INITIALIZER
#endif
+};
FILE *stdout=&__stdout;
+int __fflush_stdout(void) {
+ return fflush(stdout);
+}
diff --git a/mdk-stage1/dietlibc/libstdio/ungetc.c b/mdk-stage1/dietlibc/libstdio/ungetc.c
index ae03e9381..133e92820 100644
--- a/mdk-stage1/dietlibc/libstdio/ungetc.c
+++ b/mdk-stage1/dietlibc/libstdio/ungetc.c
@@ -1,11 +1,10 @@
#include "dietstdio.h"
-#ifdef WANT_UNGETC
int ungetc(int c, FILE *stream) {
- if (stream->ungotten)
+ if (stream->ungotten || c<0 || c>255)
return EOF;
stream->ungotten=1;
- stream->ungetbuf=(char)(unsigned char)c;
+ stream->ungetbuf=(unsigned char)c;
+ stream->flags&=~(ERRORINDICATOR|EOFINDICATOR);
return c;
}
-#endif