diff options
author | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-09-21 09:06:08 +0000 |
---|---|---|
committer | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-09-21 09:06:08 +0000 |
commit | b1e0564adf04390f2921195e8bc37d6cd22bfa2d (patch) | |
tree | 9e373d55203d1064b681801730506b4a64a1e7d2 /libstdc++-v3/config | |
parent | fd0bce5b47fa55e02fd1aba454b0f2daacc9e4a8 (diff) | |
download | ppe42-gcc-b1e0564adf04390f2921195e8bc37d6cd22bfa2d.tar.gz ppe42-gcc-b1e0564adf04390f2921195e8bc37d6cd22bfa2d.zip |
2004-09-21 Paolo Carlini <pcarlini@suse.de>
PR libstdc++/12882 (cont)
* acinclude.m4 (GLIBCXX_CHECK_LFS): Check for fstat64 too.
* configure: Regenerate.
* config/io/basic_file_stdio.cc (__basic_file<>::showmanyc): When
_GLIBCXX_USE_LFS use fstat64 and lseek64, thus providing a non
trivial showmanyc for large files too.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@87797 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/config')
-rw-r--r-- | libstdc++-v3/config/io/basic_file_stdio.cc | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/libstdc++-v3/config/io/basic_file_stdio.cc b/libstdc++-v3/config/io/basic_file_stdio.cc index 0a4e154ebbc..c5cbf04b8da 100644 --- a/libstdc++-v3/config/io/basic_file_stdio.cc +++ b/libstdc++-v3/config/io/basic_file_stdio.cc @@ -68,7 +68,7 @@ # endif #endif -#include <limits> // For <off_t>::max() and min() +#include <limits> // For <off_t>::max() and min() and <streamsize>::max() namespace __gnu_internal { @@ -315,8 +315,8 @@ namespace std #ifdef _GLIBCXX_USE_LFS return lseek64(this->fd(), __off, __way); #else - if (__off > std::numeric_limits<off_t>::max() - || __off < std::numeric_limits<off_t>::min()) + if (__off > numeric_limits<off_t>::max() + || __off < numeric_limits<off_t>::min()) return -1L; return lseek(this->fd(), __off, __way); #endif @@ -352,10 +352,21 @@ namespace std #if defined(_GLIBCXX_HAVE_S_ISREG) || defined(_GLIBCXX_HAVE_S_IFREG) // Regular files. +#ifdef _GLIBCXX_USE_LFS + struct stat64 __buffer; + const int __err = fstat64(this->fd(), &__buffer); + if (!__err && _GLIBCXX_ISREG(__buffer.st_mode)) + { + const streamoff __off = __buffer.st_size - lseek64(this->fd(), 0, + ios_base::cur); + return std::min(__off, streamoff(numeric_limits<streamsize>::max())); + } +#else struct stat __buffer; - int __ret = fstat(this->fd(), &__buffer); - if (!__ret && _GLIBCXX_ISREG(__buffer.st_mode)) - return __buffer.st_size - lseek(this->fd(), 0, ios_base::cur); + const int __err = fstat(this->fd(), &__buffer); + if (!__err && _GLIBCXX_ISREG(__buffer.st_mode)) + return __buffer.st_size - lseek(this->fd(), 0, ios_base::cur); +#endif #endif return 0; } |