Cutelee 6.2.0
safestring.cpp
1/*
2 This file is part of the Cutelee template system.
3
4 Copyright (c) 2009,2010 Stephen Kelly <steveire@gmail.com>
5
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either version
9 2.1 of the Licence, or (at your option) any later version.
10
11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public
17 License along with this library. If not, see <http://www.gnu.org/licenses/>.
18
19*/
20
21#include "safestring.h"
22
23#include <QtCore/QStringList>
24
25using namespace Cutelee;
26
28 : m_nestedString(this), m_safety(IsNotSafe), m_needsescape(false)
29{
30}
31
33 : m_nestedString(safeString.get(), this), m_safety(safeString.m_safety),
34 m_needsescape(safeString.m_needsescape)
35{
36}
37
38SafeString::SafeString(const QString &str, bool safe)
39 : m_nestedString(str, this), m_safety(safe ? IsSafe : IsNotSafe),
40 m_needsescape(false)
41{
42}
43
45 : m_nestedString(str, this), m_safety(safety), m_needsescape(false)
46{
47}
48
50
51void SafeString::setNeedsEscape(bool needsEscape)
52{
53 m_needsescape = needsEscape;
54}
55
56bool SafeString::needsEscape() const { return m_needsescape; }
57
58void SafeString::setSafety(Cutelee::SafeString::Safety safety)
59{
60 m_safety = safety;
61}
62
63bool SafeString::isSafe() const { return m_safety == IsSafe; }
64
65SafeString::NestedString::NestedString(SafeString *safeString)
66 : m_safeString(safeString)
67{
68}
69
70SafeString::NestedString::NestedString(const QString &content,
71 SafeString *safeString)
72 : QString(content), m_safeString(safeString)
73{
74}
75
77{
78 if (&str == this)
79 return *this;
80 m_nestedString = str.m_nestedString;
81 m_nestedString.m_safeString = this;
82 m_safety = str.m_safety;
83 m_needsescape = str.m_needsescape;
84 return *this;
85}
86
88{
89 return SafeString(static_cast<QString>(m_nestedString) + str, IsNotSafe);
90}
91
93{
94 if (!str.isSafe())
95 return SafeString(static_cast<QString>(m_nestedString)
96 + static_cast<QString>(str.get()),
97 IsNotSafe);
98 return SafeString(static_cast<QString>(m_nestedString)
99 + static_cast<QString>(str.get()),
100 m_safety);
101}
102
104{
105 m_safety = IsNotSafe;
106
107 m_nestedString += str;
108 return *this;
109}
110
112{
113 if (!str.isSafe())
114 m_safety = IsNotSafe;
115
116 m_nestedString += str.get();
117 return *this;
118}
119
121{
122 // Don't compare safety or account for future escaping here.
123 // See TestBuiltins testEscaping
124 return m_nestedString == other.get();
125}
126
127bool SafeString::operator==(const QString &other) const
128{
129 return m_nestedString == other;
130}
131
133{
134 QString::append(str.get());
135 if (!str.isSafe())
136 m_safeString->m_safety = IsNotSafe;
137
138 return *m_safeString;
139}
140
142{
143 QString::append(str);
144 m_safeString->m_safety = IsNotSafe;
145 return *m_safeString;
146}
147
148SafeString &SafeString::NestedString::append(QStringView reference)
149{
150 QString::append(reference);
151 m_safeString->m_safety = IsNotSafe;
152 return *m_safeString;
153}
154
156{
157 QString::append(str);
158 m_safeString->m_safety = IsNotSafe;
159 return *m_safeString;
160}
161
163{
164 QString::append(ch);
165 m_safeString->m_safety = IsNotSafe;
166 return *m_safeString;
167}
168
170{
171 QString::chop(n);
172 m_safeString->m_safety = IsNotSafe;
173}
174
176{
177 QString::fill(ch, size);
178 m_safeString->m_safety = IsNotSafe;
179 return *m_safeString;
180}
181
183 const Cutelee::SafeString &str)
184{
185 QString::insert(position, str.get());
186 if (!str.isSafe())
187 m_safeString->m_safety = IsNotSafe;
188
189 return *m_safeString;
190}
191
192SafeString &SafeString::NestedString::insert(int position, const QString &str)
193{
194 QString::insert(position, str);
195 return *m_safeString;
196}
197
199 QLatin1String str)
200{
201 QString::insert(position, str);
202 return *m_safeString;
203}
204
205SafeString &SafeString::NestedString::insert(int position, const QChar *unicode,
206 int size)
207{
208 QString::insert(position, unicode, size);
209 return *m_safeString;
210}
211
212SafeString &SafeString::NestedString::insert(int position, QChar ch)
213{
214 QString::insert(position, ch);
215 return *m_safeString;
216}
217
219{
220 return SafeString(QString::left(n), m_safeString->m_safety);
221}
222
224 bool truncate) const
225{
226 return SafeString(QString::leftJustified(width, fill, truncate),
227 m_safeString->m_safety);
228}
229
230SafeString SafeString::NestedString::mid(int position, int n) const
231{
232 return SafeString(QString::mid(position, n), m_safeString->m_safety);
233}
234
237{
238 return SafeString(QString::normalized(mode), m_safeString->m_safety);
239}
240
243 QChar::UnicodeVersion version) const
244{
245 return SafeString(QString::normalized(mode, version), m_safeString->m_safety);
246}
247
248SafeString &SafeString::NestedString::prepend(const Cutelee::SafeString &str)
249{
250 QString::prepend(str.get());
251 if (!str.isSafe())
252 m_safeString->m_safety = IsNotSafe;
253
254 return *m_safeString;
255}
256
258{
259 QString::prepend(str);
260 m_safeString->m_safety = IsNotSafe;
261 return *m_safeString;
262}
263
265{
266 QString::prepend(str);
267 m_safeString->m_safety = IsNotSafe;
268 return *m_safeString;
269}
270
272{
274 m_safeString->m_safety = IsNotSafe;
275 return *m_safeString;
276}
277
278void SafeString::NestedString::push_back(const Cutelee::SafeString &other)
279{
280 QString::push_back(other.get());
281 m_safeString->m_safety = other.m_safety;
282}
283
284void SafeString::NestedString::push_front(const Cutelee::SafeString &other)
285{
286 QString::push_front(other.get());
287 m_safeString->m_safety = other.m_safety;
288}
289
291{
292 QString::remove(position, n);
293 m_safeString->m_safety = IsNotSafe;
294 return *m_safeString;
295}
296
298{
299 QString::remove(ch, cs);
300 m_safeString->m_safety = IsNotSafe;
301 return *m_safeString;
302}
303
304SafeString &SafeString::NestedString::remove(const Cutelee::SafeString &str,
306{
307 QString::remove(str, cs);
308 m_safeString->m_safety = IsNotSafe;
309 return *m_safeString;
310}
311
314{
315 QString::remove(str, cs);
316 m_safeString->m_safety = IsNotSafe;
317 return *m_safeString;
318}
319
320SafeString &SafeString::NestedString::remove(const QRegularExpression &rx)
321{
322 QString::remove(rx);
323 m_safeString->m_safety = IsNotSafe;
324 return *m_safeString;
325}
326
328{
329 return SafeString(QString::repeated(times), m_safeString->m_safety);
330}
331
333 const Cutelee::SafeString &after)
334{
335 QString::replace(position, n, after.get());
336 m_safeString->m_safety = after.m_safety;
337 return *m_safeString;
338}
339
341 const QString &after)
342{
343 QString::replace(position, n, after);
344 m_safeString->m_safety = IsNotSafe;
345 return *m_safeString;
346}
347
349 const QChar *unicode, int size)
350{
351 QString::replace(position, n, unicode, size);
352 m_safeString->m_safety = IsNotSafe;
353 return *m_safeString;
354}
355
356SafeString &SafeString::NestedString::replace(int position, int n, QChar after)
357{
358 QString::replace(position, n, after);
359 m_safeString->m_safety = IsNotSafe;
360 return *m_safeString;
361}
362
364SafeString::NestedString::replace(const Cutelee::SafeString &before,
365 const Cutelee::SafeString &after,
367{
368 QString::replace(before.get(), after.get(), cs);
369 m_safeString->m_safety = after.m_safety;
370 return *m_safeString;
371}
372
373SafeString &SafeString::NestedString::replace(const QString &before,
374 const Cutelee::SafeString &after,
376{
377 QString::replace(before, after.get(), cs);
378 m_safeString->m_safety = IsNotSafe;
379 return *m_safeString;
380}
381
383SafeString::NestedString::replace(const Cutelee::SafeString &before,
384 const QString &after, Qt::CaseSensitivity cs)
385{
386 QString::replace(before.get(), after, cs);
387 m_safeString->m_safety = IsNotSafe;
388 return *m_safeString;
389}
390
391SafeString &SafeString::NestedString::replace(const QString &before,
392 const QString &after,
394{
395 QString::replace(before, after, cs);
396 m_safeString->m_safety = IsNotSafe;
397 return *m_safeString;
398}
399
400SafeString &SafeString::NestedString::replace(const QChar *before, int blen,
401 const QChar *after, int alen,
403{
404 QString::replace(before, blen, after, alen, cs);
405 m_safeString->m_safety = IsNotSafe;
406 return *m_safeString;
407}
408
411{
412 QString::replace(ch, after.get(), cs);
413 m_safeString->m_safety = after.m_safety;
414 return *m_safeString;
415}
416
417SafeString &SafeString::NestedString::replace(QChar ch, const QString &after,
419{
420 QString::replace(ch, after, cs);
421 m_safeString->m_safety = IsNotSafe;
422 return *m_safeString;
423}
424
425SafeString &SafeString::NestedString::replace(QChar before, QChar after,
427{
428 QString::replace(before, after, cs);
429 m_safeString->m_safety = IsNotSafe;
430 return *m_safeString;
431}
432
434 QLatin1String after,
436{
437 QString::replace(before, after, cs);
438 m_safeString->m_safety = IsNotSafe;
439 return *m_safeString;
440}
441
443 const Cutelee::SafeString &after,
445{
446 QString::replace(before, after.get(), cs);
447 m_safeString->m_safety = after.m_safety;
448 return *m_safeString;
449}
450
452 const QString &after,
454{
455 QString::replace(before, after, cs);
456 m_safeString->m_safety = IsNotSafe;
457 return *m_safeString;
458}
459
461SafeString::NestedString::replace(const Cutelee::SafeString &before,
462 QLatin1String after,
464{
465 QString::replace(before.get(), after, cs);
466 m_safeString->m_safety = before.m_safety;
467 return *m_safeString;
468}
469
470SafeString &SafeString::NestedString::replace(const QString &before,
471 QLatin1String after,
473{
474 QString::replace(before, after, cs);
475 m_safeString->m_safety = IsNotSafe;
476 return *m_safeString;
477}
478
480 QLatin1String after,
482{
483 QString::replace(c, after, cs);
484 m_safeString->m_safety = IsNotSafe;
485 return *m_safeString;
486}
487
488SafeString &SafeString::NestedString::replace(const QRegularExpression &rx,
489 const Cutelee::SafeString &after)
490{
491 QString::replace(rx, after.get());
492 m_safeString->m_safety = after.m_safety;
493 return *m_safeString;
494}
495
496SafeString &SafeString::NestedString::replace(const QRegularExpression &rx,
497 const QString &after)
498{
499 QString::replace(rx, after);
500 m_safeString->m_safety = IsNotSafe;
501 return *m_safeString;
502}
503
505{
506 return SafeString(QString::right(n), m_safeString->m_safety);
507}
508
510 bool truncate) const
511{
512 return SafeString(QString::rightJustified(width, fill, truncate),
513 m_safeString->m_safety);
514}
515
516SafeString SafeString::NestedString::section(const QRegularExpression &reg,
517 int start, int end,
518 QString::SectionFlags flags) const
519{
520 return SafeString(QString::section(reg, start, end, flags),
521 m_safeString->m_safety);
522}
523
524SafeString SafeString::NestedString::section(QChar sep, int start, int end,
525 QString::SectionFlags flags) const
526{
527 return SafeString(QString::section(sep, start, end, flags),
528 m_safeString->m_safety);
529}
530
531SafeString SafeString::NestedString::section(const Cutelee::SafeString &sep,
532 int start, int end,
533 QString::SectionFlags flags) const
534{
535 return SafeString(QString::section(sep, start, end, flags),
536 m_safeString->m_safety);
537}
538
539SafeString SafeString::NestedString::section(const QString &sep, int start,
540 int end,
541 QString::SectionFlags flags) const
542{
543 return SafeString(QString::section(sep, start, end, flags),
544 m_safeString->m_safety);
545}
546
548{
549 QString::setNum(n, base);
550 m_safeString->m_safety = IsNotSafe;
551 return *m_safeString;
552}
553
555{
556 QString::setNum(n, base);
557 m_safeString->m_safety = IsNotSafe;
558 return *m_safeString;
559}
560
561SafeString &SafeString::NestedString::setNum(long int n, int base)
562{
563 QString::setNum(n, base);
564 m_safeString->m_safety = IsNotSafe;
565 return *m_safeString;
566}
567
569{
570 QString::setNum(n, base);
571 m_safeString->m_safety = IsNotSafe;
572 return *m_safeString;
573}
574
575SafeString &SafeString::NestedString::setNum(qlonglong n, int base)
576{
577 QString::setNum(n, base);
578 m_safeString->m_safety = IsNotSafe;
579 return *m_safeString;
580}
581
582SafeString &SafeString::NestedString::setNum(qulonglong n, int base)
583{
584 QString::setNum(n, base);
585 m_safeString->m_safety = IsNotSafe;
586 return *m_safeString;
587}
588
589SafeString &SafeString::NestedString::setNum(short int n, int base)
590{
591 QString::setNum(n, base);
592 m_safeString->m_safety = IsNotSafe;
593 return *m_safeString;
594}
595
597{
598 QString::setNum(n, base);
599 m_safeString->m_safety = IsNotSafe;
600 return *m_safeString;
601}
602
603SafeString &SafeString::NestedString::setNum(double n, char format,
604 int precision)
605{
606 QString::setNum(n, format, precision);
607 m_safeString->m_safety = IsNotSafe;
608 return *m_safeString;
609}
610
611SafeString &SafeString::NestedString::setNum(float n, char format,
612 int precision)
613{
614 QString::setNum(n, format, precision);
615 m_safeString->m_safety = IsNotSafe;
616 return *m_safeString;
617}
618
619SafeString &SafeString::NestedString::setUnicode(const QChar *unicode, int size)
620{
621 QString::setUnicode(unicode, size);
622 m_safeString->m_safety = IsNotSafe;
623 return *m_safeString;
624}
625
626SafeString &SafeString::NestedString::setUtf16(const ushort *unicode, int size)
627{
628 QString::setUtf16(unicode, size);
629 m_safeString->m_safety = IsNotSafe;
630 return *m_safeString;
631}
632
634{
635 return SafeString(QString::simplified(), m_safeString->m_safety);
636}
637
638QStringList SafeString::NestedString::split(const Cutelee::SafeString &sep,
639 Qt::SplitBehavior behavior,
640 Qt::CaseSensitivity cs) const
641{
642 return QString::split(sep.get(), behavior, cs);
643}
644
645QStringList SafeString::NestedString::split(const QString &sep,
646 Qt::SplitBehavior behavior,
647 Qt::CaseSensitivity cs) const
648{
649 return QString::split(sep, behavior, cs);
650}
651
652QStringList SafeString::NestedString::split(const QChar &sep,
653 Qt::SplitBehavior behavior,
654 Qt::CaseSensitivity cs) const
655{
656 return QString::split(sep, behavior, cs);
657}
658
659QStringList
660SafeString::NestedString::split(const QRegularExpression &rx,
661 Qt::SplitBehavior behavior) const
662{
663 return QString::split(rx, behavior);
664}
665
667{
669}
670
672{
674}
675
677{
678 return SafeString(QString::trimmed(), m_safeString->m_safety);
679}
A QString wrapper class for containing whether a string is safe or needs to be escaped.
Definition safestring.h:92
const NestedString & get() const
Definition safestring.h:325
SafeString & operator+=(const QString &str)
bool needsEscape() const
bool isSafe() const
SafeString operator+(const QString &str)
SafeString & operator=(const SafeString &str)
bool operator==(const SafeString &other) const
@ IsSafe
The string is safe and requires no further escaping.
Definition safestring.h:98
The Cutelee namespace holds all public Cutelee API.
Definition Mainpage.dox:8
UnicodeVersion
typedef SectionFlags
QString & append(QChar ch)
void chop(qsizetype n)
QString & fill(QChar ch, qsizetype size)
QString & insert(qsizetype position, QChar ch)
QString left(qsizetype n) &&
QString leftJustified(qsizetype width, QChar fill, bool truncate) const const
QString mid(qsizetype position, qsizetype n) &&
QString normalized(QString::NormalizationForm mode, QChar::UnicodeVersion version) const const
QString & prepend(QChar ch)
void push_back(QChar ch)
void push_front(QChar ch)
QString & remove(QChar ch, Qt::CaseSensitivity cs)
QString repeated(qsizetype times) const const
QString & replace(QChar before, QChar after, Qt::CaseSensitivity cs)
QString right(qsizetype n) &&
QString rightJustified(qsizetype width, QChar fill, bool truncate) const const
QString section(QChar sep, qsizetype start, qsizetype end, QString::SectionFlags flags) const const
QString & setNum(double n, char format, int precision)
QString & setUnicode(const QChar *unicode, qsizetype size)
QString & setUtf16(const char16_t *unicode, qsizetype size)
QString simplified() const const
QStringList split(QChar sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const const
QString toLower() const const
QString toUpper() const const
QString trimmed() const const
CaseSensitivity
typedef SplitBehavior