diff options
author | Mystery Man <unknown@mandriva.org> | 2003-08-20 07:37:27 +0000 |
---|---|---|
committer | Mystery Man <unknown@mandriva.org> | 2003-08-20 07:37:27 +0000 |
commit | 7f2ac73888b8ef372ea597049981b27e7d810ac2 (patch) | |
tree | 354132889b63bbe5f446cb82869b3c3367135a80 /mdk-stage1/dietlibc/libstdio/fread.c | |
parent | 327bd24f8e4291bd1882de1990dd7339f781a9cb (diff) | |
download | drakx-backup-do-not-use-7f2ac73888b8ef372ea597049981b27e7d810ac2.tar drakx-backup-do-not-use-7f2ac73888b8ef372ea597049981b27e7d810ac2.tar.gz drakx-backup-do-not-use-7f2ac73888b8ef372ea597049981b27e7d810ac2.tar.bz2 drakx-backup-do-not-use-7f2ac73888b8ef372ea597049981b27e7d810ac2.tar.xz drakx-backup-do-not-use-7f2ac73888b8ef372ea597049981b27e7d810ac2.zip |
This commit was manufactured by cvs2svn to create branch 'MDKC_1_0'.topic/MDKC_1_0
Diffstat (limited to 'mdk-stage1/dietlibc/libstdio/fread.c')
-rw-r--r-- | mdk-stage1/dietlibc/libstdio/fread.c | 55 |
1 files changed, 25 insertions, 30 deletions
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 } |