summaryrefslogtreecommitdiffstats
path: root/libstdc++-v3/config
diff options
context:
space:
mode:
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2004-09-21 09:06:08 +0000
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2004-09-21 09:06:08 +0000
commitb1e0564adf04390f2921195e8bc37d6cd22bfa2d (patch)
tree9e373d55203d1064b681801730506b4a64a1e7d2 /libstdc++-v3/config
parentfd0bce5b47fa55e02fd1aba454b0f2daacc9e4a8 (diff)
downloadppe42-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.cc23
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;
}
OpenPOWER on IntegriCloud