1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the QtCore module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or (at your option) the GNU General
28 ** Public license version 3 or any later version approved by the KDE Free
29 ** Qt Foundation. The licenses are as published by the Free Software
30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31 ** included in the packaging of this file. Please review the following
32 ** information to ensure the GNU General Public License requirements will
33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34 ** https://www.gnu.org/licenses/gpl-3.0.html.
35 **
36 ** $QT_END_LICENSE$
37 **
38 ****************************************************************************/
39 
40 #ifndef QTEXTSTREAM_H
41 #define QTEXTSTREAM_H
42 
43 #include <QtCore/qiodevice.h>
44 #include <QtCore/qstring.h>
45 #include <QtCore/qchar.h>
46 #include <QtCore/qlocale.h>
47 #include <QtCore/qscopedpointer.h>
48 
49 #include <stdio.h>
50 
51 #ifdef Status
52 #error qtextstream.h must be included before any header file that defines Status
53 #endif
54 
55 QT_BEGIN_NAMESPACE
56 
57 
58 class QTextCodec;
59 class QTextDecoder;
60 
61 class QTextStreamPrivate;
62 class Q_CORE_EXPORT QTextStream                                // text stream class
63 {
64     Q_DECLARE_PRIVATE(QTextStream)
65 
66 public:
67     enum RealNumberNotation {
68         SmartNotation,
69         FixedNotation,
70         ScientificNotation
71     };
72     enum FieldAlignment {
73         AlignLeft,
74         AlignRight,
75         AlignCenter,
76         AlignAccountingStyle
77     };
78     enum Status {
79         Ok,
80         ReadPastEnd,
81         ReadCorruptData,
82         WriteFailed
83     };
84     enum NumberFlag {
85         ShowBase = 0x1,
86         ForcePoint = 0x2,
87         ForceSign = 0x4,
88         UppercaseBase = 0x8,
89         UppercaseDigits = 0x10
90     };
91     Q_DECLARE_FLAGS(NumberFlags, NumberFlag)
92 
93     QTextStream();
94     explicit QTextStream(QIODevice *device);
95     explicit QTextStream(FILE *fileHandle, QIODevice::OpenMode openMode = QIODevice::ReadWrite);
96     explicit QTextStream(QString *string, QIODevice::OpenMode openMode = QIODevice::ReadWrite);
97     explicit QTextStream(QByteArray *array, QIODevice::OpenMode openMode = QIODevice::ReadWrite);
98     explicit QTextStream(const QByteArray &array, QIODevice::OpenMode openMode = QIODevice::ReadOnly);
99     virtual ~QTextStream();
100 
101 #if QT_CONFIG(textcodec)
102     void setCodec(QTextCodec *codec);
103     void setCodec(const char *codecName);
104     QTextCodec *codec() const;
105     void setAutoDetectUnicode(bool enabled);
106     bool autoDetectUnicode() const;
107     void setGenerateByteOrderMark(bool generate);
108     bool generateByteOrderMark() const;
109 #endif
110 
111     void setLocale(const QLocale &locale);
112     QLocale locale() const;
113 
114     void setDevice(QIODevice *device);
115     QIODevice *device() const;
116 
117     void setString(QString *string, QIODevice::OpenMode openMode = QIODevice::ReadWrite);
118     QString *string() const;
119 
120     Status status() const;
121     void setStatus(Status status);
122     void resetStatus();
123 
124     bool atEnd() const;
125     void reset();
126     void flush();
127     bool seek(qint64 pos);
128     qint64 pos() const;
129 
130     void skipWhiteSpace();
131 
132     QString readLine(qint64 maxlen = 0);
133     bool readLineInto(QString *line, qint64 maxlen = 0);
134     QString readAll();
135     QString read(qint64 maxlen);
136 
137     void setFieldAlignment(FieldAlignment alignment);
138     FieldAlignment fieldAlignment() const;
139 
140     void setPadChar(QChar ch);
141     QChar padChar() const;
142 
143     void setFieldWidth(int width);
144     int fieldWidth() const;
145 
146     void setNumberFlags(NumberFlags flags);
147     NumberFlags numberFlags() const;
148 
149     void setIntegerBase(int base);
150     int integerBase() const;
151 
152     void setRealNumberNotation(RealNumberNotation notation);
153     RealNumberNotation realNumberNotation() const;
154 
155     void setRealNumberPrecision(int precision);
156     int realNumberPrecision() const;
157 
158     QTextStream &operator>>(QChar &ch);
159     QTextStream &operator>>(char &ch);
160     QTextStream &operator>>(signed short &i);
161     QTextStream &operator>>(unsigned short &i);
162     QTextStream &operator>>(signed int &i);
163     QTextStream &operator>>(unsigned int &i);
164     QTextStream &operator>>(signed long &i);
165     QTextStream &operator>>(unsigned long &i);
166     QTextStream &operator>>(qlonglong &i);
167     QTextStream &operator>>(qulonglong &i);
168     QTextStream &operator>>(float &f);
169     QTextStream &operator>>(double &f);
170     QTextStream &operator>>(QString &s);
171     QTextStream &operator>>(QByteArray &array);
172     QTextStream &operator>>(char *c);
173 
174     QTextStream &operator<<(QChar ch);
175     QTextStream &operator<<(char ch);
176     QTextStream &operator<<(signed short i);
177     QTextStream &operator<<(unsigned short i);
178     QTextStream &operator<<(signed int i);
179     QTextStream &operator<<(unsigned int i);
180     QTextStream &operator<<(signed long i);
181     QTextStream &operator<<(unsigned long i);
182     QTextStream &operator<<(qlonglong i);
183     QTextStream &operator<<(qulonglong i);
184     QTextStream &operator<<(float f);
185     QTextStream &operator<<(double f);
186     QTextStream &operator<<(const QString &s);
187     QTextStream &operator<<(QStringView s);
188     QTextStream &operator<<(QLatin1String s);
189     QTextStream &operator<<(const QStringRef &s);
190     QTextStream &operator<<(const QByteArray &array);
191     QTextStream &operator<<(const char *c);
192     QTextStream &operator<<(const void *ptr);
193 
194 private:
195     Q_DISABLE_COPY(QTextStream)
196     friend class QDebugStateSaverPrivate;
197     friend class QDebug;
198 
199     QScopedPointer<QTextStreamPrivate> d_ptr;
200 };
201 
202 Q_DECLARE_OPERATORS_FOR_FLAGS(QTextStream::NumberFlags)
203 
204 /*****************************************************************************
205   QTextStream manipulators
206  *****************************************************************************/
207 
208 typedef QTextStream & (*QTextStreamFunction)(QTextStream &);// manipulator function
209 typedef void (QTextStream::*QTSMFI)(int); // manipulator w/int argument
210 typedef void (QTextStream::*QTSMFC)(QChar); // manipulator w/QChar argument
211 
212 
213 class Q_CORE_EXPORT QTextStreamManipulator
214 {
215 public:
QTextStreamManipulator(QTSMFI m,int a)216     Q_DECL_CONSTEXPR QTextStreamManipulator(QTSMFI m, int a) noexcept : mf(m), mc(nullptr), arg(a), ch() {}
QTextStreamManipulator(QTSMFC m,QChar c)217     Q_DECL_CONSTEXPR QTextStreamManipulator(QTSMFC m, QChar c) noexcept : mf(nullptr), mc(m), arg(-1), ch(c) {}
exec(QTextStream & s)218     void exec(QTextStream &s) { if (mf) { (s.*mf)(arg); } else { (s.*mc)(ch); } }
219 
220 private:
221     QTSMFI mf;                                        // QTextStream member function
222     QTSMFC mc;                                        // QTextStream member function
223     int arg;                                          // member function argument
224     QChar ch;
225 };
226 
227 inline QTextStream &operator>>(QTextStream &s, QTextStreamFunction f)
228 { return (*f)(s); }
229 
230 inline QTextStream &operator<<(QTextStream &s, QTextStreamFunction f)
231 { return (*f)(s); }
232 
233 inline QTextStream &operator<<(QTextStream &s, QTextStreamManipulator m)
234 { m.exec(s); return s; }
235 
236 namespace Qt {
237 Q_CORE_EXPORT QTextStream &bin(QTextStream &s);
238 Q_CORE_EXPORT QTextStream &oct(QTextStream &s);
239 Q_CORE_EXPORT QTextStream &dec(QTextStream &s);
240 Q_CORE_EXPORT QTextStream &hex(QTextStream &s);
241 
242 Q_CORE_EXPORT QTextStream &showbase(QTextStream &s);
243 Q_CORE_EXPORT QTextStream &forcesign(QTextStream &s);
244 Q_CORE_EXPORT QTextStream &forcepoint(QTextStream &s);
245 Q_CORE_EXPORT QTextStream &noshowbase(QTextStream &s);
246 Q_CORE_EXPORT QTextStream &noforcesign(QTextStream &s);
247 Q_CORE_EXPORT QTextStream &noforcepoint(QTextStream &s);
248 
249 Q_CORE_EXPORT QTextStream &uppercasebase(QTextStream &s);
250 Q_CORE_EXPORT QTextStream &uppercasedigits(QTextStream &s);
251 Q_CORE_EXPORT QTextStream &lowercasebase(QTextStream &s);
252 Q_CORE_EXPORT QTextStream &lowercasedigits(QTextStream &s);
253 
254 Q_CORE_EXPORT QTextStream &fixed(QTextStream &s);
255 Q_CORE_EXPORT QTextStream &scientific(QTextStream &s);
256 
257 Q_CORE_EXPORT QTextStream &left(QTextStream &s);
258 Q_CORE_EXPORT QTextStream &right(QTextStream &s);
259 Q_CORE_EXPORT QTextStream &center(QTextStream &s);
260 
261 Q_CORE_EXPORT QTextStream &endl(QTextStream &s);
262 Q_CORE_EXPORT QTextStream &flush(QTextStream &s);
263 Q_CORE_EXPORT QTextStream &reset(QTextStream &s);
264 
265 Q_CORE_EXPORT QTextStream &bom(QTextStream &s);
266 
267 Q_CORE_EXPORT QTextStream &ws(QTextStream &s);
268 
269 } // namespace Qt
270 
271 #if QT_DEPRECATED_SINCE(5, 15)
272 // This namespace only exists for 'using namespace' declarations.
273 namespace QTextStreamFunctions {
274 Q_CORE_EXPORT QT_DEPRECATED_VERSION_X(5, 15, "Use Qt::bin") QTextStream &bin(QTextStream &s);
275 Q_CORE_EXPORT QT_DEPRECATED_VERSION_X(5, 15, "Use Qt::oct") QTextStream &oct(QTextStream &s);
276 Q_CORE_EXPORT QT_DEPRECATED_VERSION_X(5, 15, "Use Qt::dec") QTextStream &dec(QTextStream &s);
277 Q_CORE_EXPORT QT_DEPRECATED_VERSION_X(5, 15, "Use Qt::hex") QTextStream &hex(QTextStream &s);
278 Q_CORE_EXPORT QT_DEPRECATED_VERSION_X(5, 15, "Use Qt::showbase") QTextStream &showbase(QTextStream &s);
279 Q_CORE_EXPORT QT_DEPRECATED_VERSION_X(5, 15, "Use Qt::forcesign") QTextStream &forcesign(QTextStream &s);
280 Q_CORE_EXPORT QT_DEPRECATED_VERSION_X(5, 15, "Use Qt::forcepoint") QTextStream &forcepoint(QTextStream &s);
281 Q_CORE_EXPORT QT_DEPRECATED_VERSION_X(5, 15, "Use Qt::noshowbase") QTextStream &noshowbase(QTextStream &s);
282 Q_CORE_EXPORT QT_DEPRECATED_VERSION_X(5, 15, "Use Qt::noforcesign") QTextStream &noforcesign(QTextStream &s);
283 Q_CORE_EXPORT QT_DEPRECATED_VERSION_X(5, 15, "Use Qt::noforcepoint") QTextStream &noforcepoint(QTextStream &s);
284 Q_CORE_EXPORT QT_DEPRECATED_VERSION_X(5, 15, "Use Qt::uppercasebase") QTextStream &uppercasebase(QTextStream &s);
285 Q_CORE_EXPORT QT_DEPRECATED_VERSION_X(5, 15, "Use Qt::uppercasedigits") QTextStream &uppercasedigits(QTextStream &s);
286 Q_CORE_EXPORT QT_DEPRECATED_VERSION_X(5, 15, "Use Qt::lowercasebase") QTextStream &lowercasebase(QTextStream &s);
287 Q_CORE_EXPORT QT_DEPRECATED_VERSION_X(5, 15, "Use Qt::lowercasedigits") QTextStream &lowercasedigits(QTextStream &s);
288 Q_CORE_EXPORT QT_DEPRECATED_VERSION_X(5, 15, "Use Qt::fixed") QTextStream &fixed(QTextStream &s);
289 Q_CORE_EXPORT QT_DEPRECATED_VERSION_X(5, 15, "Use Qt::scientific") QTextStream &scientific(QTextStream &s);
290 Q_CORE_EXPORT QT_DEPRECATED_VERSION_X(5, 15, "Use Qt::left") QTextStream &left(QTextStream &s);
291 Q_CORE_EXPORT QT_DEPRECATED_VERSION_X(5, 15, "Use Qt::right") QTextStream &right(QTextStream &s);
292 Q_CORE_EXPORT QT_DEPRECATED_VERSION_X(5, 15, "Use Qt::center") QTextStream &center(QTextStream &s);
293 Q_CORE_EXPORT QT_DEPRECATED_VERSION_X(5, 15, "Use Qt::endl") QTextStream &endl(QTextStream &s);
294 Q_CORE_EXPORT QT_DEPRECATED_VERSION_X(5, 15, "Use Qt::flush") QTextStream &flush(QTextStream &s);
295 Q_CORE_EXPORT QT_DEPRECATED_VERSION_X(5, 15, "Use Qt::reset") QTextStream &reset(QTextStream &s);
296 Q_CORE_EXPORT QT_DEPRECATED_VERSION_X(5, 15, "Use Qt::bom") QTextStream &bom(QTextStream &s);
297 Q_CORE_EXPORT QT_DEPRECATED_VERSION_X(5, 15, "Use Qt::ws") QTextStream &ws(QTextStream &s);
298 } // namespace QTextStreamFunctions
299 
300 QT_WARNING_PUSH
301 QT_WARNING_DISABLE_CLANG("-Wheader-hygiene")
302 // We use 'using namespace' as that doesn't cause
303 // conflicting definitions compiler errors.
304 using namespace QTextStreamFunctions;
305 QT_WARNING_POP
306 #endif // QT_DEPRECATED_SINCE(5, 15)
307 
qSetFieldWidth(int width)308 inline QTextStreamManipulator qSetFieldWidth(int width)
309 {
310     QTSMFI func = &QTextStream::setFieldWidth;
311     return QTextStreamManipulator(func,width);
312 }
313 
qSetPadChar(QChar ch)314 inline QTextStreamManipulator qSetPadChar(QChar ch)
315 {
316     QTSMFC func = &QTextStream::setPadChar;
317     return QTextStreamManipulator(func, ch);
318 }
319 
qSetRealNumberPrecision(int precision)320 inline QTextStreamManipulator qSetRealNumberPrecision(int precision)
321 {
322     QTSMFI func = &QTextStream::setRealNumberPrecision;
323     return QTextStreamManipulator(func, precision);
324 }
325 
326 QT_END_NAMESPACE
327 
328 #endif // QTEXTSTREAM_H
329