diff options
Diffstat (limited to 'mdk-stage1/dietlibc/libstdio')
-rw-r--r-- | mdk-stage1/dietlibc/libstdio/fclose.c | 8 | ||||
-rw-r--r-- | mdk-stage1/dietlibc/libstdio/fdglue.c | 34 | ||||
-rw-r--r-- | mdk-stage1/dietlibc/libstdio/fdopen.c | 18 | ||||
-rw-r--r-- | mdk-stage1/dietlibc/libstdio/feof.c | 2 | ||||
-rw-r--r-- | mdk-stage1/dietlibc/libstdio/fflush.c | 34 | ||||
-rw-r--r-- | mdk-stage1/dietlibc/libstdio/fgets.c | 4 | ||||
-rw-r--r-- | mdk-stage1/dietlibc/libstdio/fopen.c | 8 | ||||
-rw-r--r-- | mdk-stage1/dietlibc/libstdio/fprintf.c | 18 | ||||
-rw-r--r-- | mdk-stage1/dietlibc/libstdio/fread.c | 55 | ||||
-rw-r--r-- | mdk-stage1/dietlibc/libstdio/fseek.c | 7 | ||||
-rw-r--r-- | mdk-stage1/dietlibc/libstdio/ftell.c | 2 | ||||
-rw-r--r-- | mdk-stage1/dietlibc/libstdio/fwrite.c | 28 | ||||
-rw-r--r-- | mdk-stage1/dietlibc/libstdio/printf.c | 20 | ||||
-rw-r--r-- | mdk-stage1/dietlibc/libstdio/setvbuf.c | 32 | ||||
-rw-r--r-- | mdk-stage1/dietlibc/libstdio/stderr.c | 25 | ||||
-rw-r--r-- | mdk-stage1/dietlibc/libstdio/stdin.c | 26 | ||||
-rw-r--r-- | mdk-stage1/dietlibc/libstdio/stdout.c | 25 | ||||
-rw-r--r-- | mdk-stage1/dietlibc/libstdio/ungetc.c | 7 |
18 files changed, 157 insertions, 196 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/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/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 |