1 // This file is part of the ustl library, an STL implementation.
3 // Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
4 // This file is free software, distributed under the MIT License.
11 #include "uexception.h"
19 //----------------------------------------------------------------------
21 ifstream
cin (STDIN_FILENO
);
22 ofstream
cout (STDOUT_FILENO
);
23 ofstream
cerr (STDERR_FILENO
);
25 //----------------------------------------------------------------------
27 /// Default constructor.
28 ofstream::ofstream (void)
35 /// Constructs a stream for writing to \p Fd.
36 ofstream::ofstream (int Fd
)
40 clear (m_File
.rdstate());
44 /// Constructs a stream for writing to \p filename.
45 ofstream::ofstream (const char* filename
, openmode mode
)
47 m_File (filename
, mode
)
49 clear (m_File
.rdstate());
52 /// Default destructor.
53 ofstream::~ofstream (void)
55 try { flush(); } catch (...) {}
58 /// Flushes the buffer to the file.
59 void ofstream::flush (void)
61 while (pos() && overflow (remaining()));
63 clear (m_File
.rdstate());
66 /// Seeks to \p p based on \p d.
67 void ofstream::seekp (off_t p
, seekdir d
)
71 clear (m_File
.rdstate());
74 /// Called when more buffer space (\p n bytes) is needed.
75 ofstream::size_type
ofstream::overflow (size_type n
)
77 if (eof() || (n
> remaining() && n
< capacity() - pos()))
78 return (ostringstream::overflow (n
));
79 size_type bw
= m_File
.write (cdata(), pos());
80 clear (m_File
.rdstate());
83 ostringstream::overflow (n
);
87 //----------------------------------------------------------------------
89 /// Constructs a stream to read from \p Fd.
90 ifstream::ifstream (int Fd
)
95 link (m_Buffer
.data(), size_t(0));
98 /// Constructs a stream to read from \p filename.
99 ifstream::ifstream (const char* filename
, openmode mode
)
102 m_File (filename
, mode
)
104 clear (m_File
.rdstate());
105 link (m_Buffer
.data(), size_t(0));
108 /// Reads at least \p n more bytes and returns available bytes.
109 ifstream::size_type
ifstream::underflow (size_type n
)
112 return (istringstream::underflow (n
));
114 const ssize_t freeSpace
= m_Buffer
.size() - pos();
115 const ssize_t neededFreeSpace
= max (n
, m_Buffer
.size() / 2);
116 const size_t oughtToErase
= Align (max (0, neededFreeSpace
- freeSpace
));
117 const size_t nToErase
= min (pos(), oughtToErase
);
118 m_Buffer
.memlink::erase (m_Buffer
.begin(), nToErase
);
119 const uoff_t
oldPos (pos() - nToErase
);
121 size_type br
= oldPos
;
122 if (m_Buffer
.size() - br
< n
) {
123 m_Buffer
.resize (br
+ neededFreeSpace
);
124 link (m_Buffer
.data(), size_t(0));
129 for (; br
< oldPos
+ n
&& brn
&& m_File
.good(); br
+= brn
)
130 brn
= m_File
.readsome (m_Buffer
.begin() + br
, m_Buffer
.size() - br
);
131 clear (m_File
.rdstate());
133 m_Buffer
[br
] = string::c_Terminator
;
134 link (m_Buffer
.data(), br
);
136 return (remaining());
139 /// Flushes the input.
140 void ifstream::sync (void)
142 istringstream::sync();
145 clear (m_File
.rdstate());
148 /// Seeks to \p p based on \p d.
149 void ifstream::seekg (off_t p
, seekdir d
)
154 clear (m_File
.rdstate());
157 //----------------------------------------------------------------------