annotate packages/language/cxx/ustl/current/src/ofstream.cpp @ 2904:88af52c64ce4

* ecos.db: Add uSTL library package record. * language/cxx/ustl/*: Initial check-in of the port of uSTL 1.3 to eCos contributed by Uwe Kindler.
author jld
date Thu, 20 Aug 2009 17:00:30 +0000
parents
children 4885e0722884
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2904
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
1 // This file is part of the uSTL library, an STL implementation.
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
2 //
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
3 // Copyright (c) 2005-2009 by Mike Sharov <msharov@users.sourceforge.net>
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
4 // This file is free software, distributed under the MIT License.
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
5
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
6 #include "ofstream.h"
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
7 #include "ustring.h"
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
8 #include "uexception.h"
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
9 #include <unistd.h>
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
10 #include <errno.h>
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
11 #include <stdio.h>
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
12 #include <stdarg.h>
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
13
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
14 namespace ustl {
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
15
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
16 //----------------------------------------------------------------------
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
17 #ifdef CYGVAR_USTL_CIN_COUT_CERR
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
18 ifstream cin (STDIN_FILENO);
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
19 ofstream cout (STDOUT_FILENO);
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
20 ofstream cerr (STDERR_FILENO);
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
21 #endif
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
22 //----------------------------------------------------------------------
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
23
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
24 /// Default constructor.
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
25 ofstream::ofstream (void)
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
26 : ostringstream (),
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
27 m_File ()
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
28 {
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
29 reserve (255);
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
30 }
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
31
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
32 /// Constructs a stream for writing to \p Fd.
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
33 ofstream::ofstream (int Fd)
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
34 : ostringstream (),
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
35 m_File (Fd)
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
36 {
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
37 clear (m_File.rdstate());
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
38 reserve (255);
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
39 }
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
40
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
41 /// Constructs a stream for writing to \p filename.
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
42 ofstream::ofstream (const char* filename, openmode mode)
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
43 : ostringstream (),
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
44 m_File (filename, mode)
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
45 {
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
46 clear (m_File.rdstate());
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
47 }
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
48
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
49 /// Default destructor.
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
50 ofstream::~ofstream (void) throw()
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
51 {
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
52 USTL_TRY { flush(); } USTL_CATCH_ALL;
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
53 }
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
54
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
55 /// Flushes the buffer and closes the file.
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
56 void ofstream::close (void)
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
57 {
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
58 clear (m_File.rdstate());
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
59 flush();
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
60 m_File.close();
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
61 }
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
62
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
63 /// Flushes the buffer to the file.
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
64 ofstream& ofstream::flush (void)
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
65 {
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
66 clear();
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
67 while (good() && pos() && overflow (remaining())) ;
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
68 m_File.sync();
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
69 clear (m_File.rdstate());
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
70 return (*this);
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
71 }
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
72
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
73 /// Seeks to \p p based on \p d.
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
74 ofstream& ofstream::seekp (off_t p, seekdir d)
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
75 {
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
76 flush();
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
77 m_File.seekp (p, d);
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
78 clear (m_File.rdstate());
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
79 return (*this);
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
80 }
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
81
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
82 /// Called when more buffer space (\p n bytes) is needed.
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
83 ofstream::size_type ofstream::overflow (size_type n)
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
84 {
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
85 if (eof() || (n > remaining() && n < capacity() - pos()))
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
86 return (ostringstream::overflow (n));
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
87 size_type bw = m_File.write (cdata(), pos());
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
88 clear (m_File.rdstate());
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
89 erase (begin(), bw);
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
90 if (remaining() < n)
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
91 ostringstream::overflow (n);
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
92 return (remaining());
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
93 }
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
94
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
95 //----------------------------------------------------------------------
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
96
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
97 /// Constructs a stream to read from \p Fd.
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
98 ifstream::ifstream (int Fd)
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
99 : istringstream (),
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
100 m_Buffer (255),
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
101 m_File (Fd)
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
102 {
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
103 link (m_Buffer.data(), streamsize(0));
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
104 }
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
105
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
106 /// Constructs a stream to read from \p filename.
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
107 ifstream::ifstream (const char* filename, openmode mode)
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
108 : istringstream (),
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
109 m_Buffer (255),
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
110 m_File (filename, mode)
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
111 {
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
112 clear (m_File.rdstate());
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
113 link (m_Buffer.data(), streamsize(0));
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
114 }
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
115
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
116 /// Reads at least \p n more bytes and returns available bytes.
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
117 ifstream::size_type ifstream::underflow (size_type n)
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
118 {
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
119 if (eof())
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
120 return (istringstream::underflow (n));
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
121
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
122 const ssize_t freeSpace = m_Buffer.size() - pos();
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
123 const ssize_t neededFreeSpace = max (n, m_Buffer.size() / 2);
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
124 const size_t oughtToErase = Align (max (0, neededFreeSpace - freeSpace));
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
125 const size_type nToErase = min (pos(), oughtToErase);
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
126 m_Buffer.memlink::erase (m_Buffer.begin(), nToErase);
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
127 const uoff_t oldPos (pos() - nToErase);
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
128
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
129 size_type br = oldPos;
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
130 if (m_Buffer.size() - br < n) {
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
131 m_Buffer.resize (br + neededFreeSpace);
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
132 link (m_Buffer.data(), streamsize(0));
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
133 }
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
134 cout.flush();
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
135
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
136 size_type brn = 1;
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
137 for (; br < oldPos + n && brn && m_File.good(); br += brn)
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
138 brn = m_File.readsome (m_Buffer.begin() + br, m_Buffer.size() - br);
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
139 clear (m_File.rdstate());
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
140
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
141 m_Buffer[br] = 0;
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
142 link (m_Buffer.data(), br);
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
143 seek (oldPos);
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
144 return (remaining());
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
145 }
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
146
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
147 /// Flushes the input.
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
148 int ifstream::sync (void)
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
149 {
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
150 istringstream::sync();
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
151 underflow (0U);
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
152 m_File.sync();
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
153 clear (m_File.rdstate());
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
154 return (-good());
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
155 }
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
156
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
157 /// Seeks to \p p based on \p d.
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
158 ifstream& ifstream::seekg (off_t p, seekdir d)
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
159 {
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
160 m_Buffer.clear();
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
161 link (m_Buffer);
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
162 m_File.seekg (p, d);
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
163 clear (m_File.rdstate());
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
164 return (*this);
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
165 }
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
166
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
167 //----------------------------------------------------------------------
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
168
88af52c64ce4 * ecos.db: Add uSTL library package record.
jld
parents:
diff changeset
169 } // namespace ustl