Cutelee 6.1.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
148#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 2)
149SafeString &SafeString::NestedString::append(QStringView reference)
150{
151 QString::append(reference);
152 m_safeString->m_safety = IsNotSafe;
153 return *m_safeString;
154}
155#endif
156
158{
159 QString::append(str);
160 m_safeString->m_safety = IsNotSafe;
161 return *m_safeString;
162}
163
165{
166 QString::append(ch);
167 m_safeString->m_safety = IsNotSafe;
168 return *m_safeString;
169}
170
172{
173 QString::chop(n);
174 m_safeString->m_safety = IsNotSafe;
175}
176
178{
179 QString::fill(ch, size);
180 m_safeString->m_safety = IsNotSafe;
181 return *m_safeString;
182}
183
185 const Cutelee::SafeString &str)
186{
187 QString::insert(position, str.get());
188 if (!str.isSafe())
189 m_safeString->m_safety = IsNotSafe;
190
191 return *m_safeString;
192}
193
194SafeString &SafeString::NestedString::insert(int position, const QString &str)
195{
196 QString::insert(position, str);
197 return *m_safeString;
198}
199
201 QLatin1String str)
202{
203 QString::insert(position, str);
204 return *m_safeString;
205}
206
207SafeString &SafeString::NestedString::insert(int position, const QChar *unicode,
208 int size)
209{
210 QString::insert(position, unicode, size);
211 return *m_safeString;
212}
213
214SafeString &SafeString::NestedString::insert(int position, QChar ch)
215{
216 QString::insert(position, ch);
217 return *m_safeString;
218}
219
221{
222 return SafeString(QString::left(n), m_safeString->m_safety);
223}
224
226 bool truncate) const
227{
228 return SafeString(QString::leftJustified(width, fill, truncate),
229 m_safeString->m_safety);
230}
231
232SafeString SafeString::NestedString::mid(int position, int n) const
233{
234 return SafeString(QString::mid(position, n), m_safeString->m_safety);
235}
236
239{
240 return SafeString(QString::normalized(mode), m_safeString->m_safety);
241}
242
245 QChar::UnicodeVersion version) const
246{
247 return SafeString(QString::normalized(mode, version), m_safeString->m_safety);
248}
249
250SafeString &SafeString::NestedString::prepend(const Cutelee::SafeString &str)
251{
252 QString::prepend(str.get());
253 if (!str.isSafe())
254 m_safeString->m_safety = IsNotSafe;
255
256 return *m_safeString;
257}
258
260{
261 QString::prepend(str);
262 m_safeString->m_safety = IsNotSafe;
263 return *m_safeString;
264}
265
267{
268 QString::prepend(str);
269 m_safeString->m_safety = IsNotSafe;
270 return *m_safeString;
271}
272
274{
276 m_safeString->m_safety = IsNotSafe;
277 return *m_safeString;
278}
279
280void SafeString::NestedString::push_back(const Cutelee::SafeString &other)
281{
282 QString::push_back(other.get());
283 m_safeString->m_safety = other.m_safety;
284}
285
286void SafeString::NestedString::push_front(const Cutelee::SafeString &other)
287{
288 QString::push_front(other.get());
289 m_safeString->m_safety = other.m_safety;
290}
291
293{
294 QString::remove(position, n);
295 m_safeString->m_safety = IsNotSafe;
296 return *m_safeString;
297}
298
300{
301 QString::remove(ch, cs);
302 m_safeString->m_safety = IsNotSafe;
303 return *m_safeString;
304}
305
306SafeString &SafeString::NestedString::remove(const Cutelee::SafeString &str,
308{
309 QString::remove(str, cs);
310 m_safeString->m_safety = IsNotSafe;
311 return *m_safeString;
312}
313
316{
317 QString::remove(str, cs);
318 m_safeString->m_safety = IsNotSafe;
319 return *m_safeString;
320}
321
322SafeString &SafeString::NestedString::remove(const QRegularExpression &rx)
323{
324 QString::remove(rx);
325 m_safeString->m_safety = IsNotSafe;
326 return *m_safeString;
327}
328
330{
331 return SafeString(QString::repeated(times), m_safeString->m_safety);
332}
333
335 const Cutelee::SafeString &after)
336{
337 QString::replace(position, n, after.get());
338 m_safeString->m_safety = after.m_safety;
339 return *m_safeString;
340}
341
343 const QString &after)
344{
345 QString::replace(position, n, after);
346 m_safeString->m_safety = IsNotSafe;
347 return *m_safeString;
348}
349
351 const QChar *unicode, int size)
352{
353 QString::replace(position, n, unicode, size);
354 m_safeString->m_safety = IsNotSafe;
355 return *m_safeString;
356}
357
358SafeString &SafeString::NestedString::replace(int position, int n, QChar after)
359{
360 QString::replace(position, n, after);
361 m_safeString->m_safety = IsNotSafe;
362 return *m_safeString;
363}
364
366SafeString::NestedString::replace(const Cutelee::SafeString &before,
367 const Cutelee::SafeString &after,
369{
370 QString::replace(before.get(), after.get(), cs);
371 m_safeString->m_safety = after.m_safety;
372 return *m_safeString;
373}
374
375SafeString &SafeString::NestedString::replace(const QString &before,
376 const Cutelee::SafeString &after,
378{
379 QString::replace(before, after.get(), cs);
380 m_safeString->m_safety = IsNotSafe;
381 return *m_safeString;
382}
383
385SafeString::NestedString::replace(const Cutelee::SafeString &before,
386 const QString &after, Qt::CaseSensitivity cs)
387{
388 QString::replace(before.get(), after, cs);
389 m_safeString->m_safety = IsNotSafe;
390 return *m_safeString;
391}
392
393SafeString &SafeString::NestedString::replace(const QString &before,
394 const QString &after,
396{
397 QString::replace(before, after, cs);
398 m_safeString->m_safety = IsNotSafe;
399 return *m_safeString;
400}
401
402SafeString &SafeString::NestedString::replace(const QChar *before, int blen,
403 const QChar *after, int alen,
405{
406 QString::replace(before, blen, after, alen, cs);
407 m_safeString->m_safety = IsNotSafe;
408 return *m_safeString;
409}
410
413{
414 QString::replace(ch, after.get(), cs);
415 m_safeString->m_safety = after.m_safety;
416 return *m_safeString;
417}
418
419SafeString &SafeString::NestedString::replace(QChar ch, const QString &after,
421{
422 QString::replace(ch, after, cs);
423 m_safeString->m_safety = IsNotSafe;
424 return *m_safeString;
425}
426
427SafeString &SafeString::NestedString::replace(QChar before, QChar after,
429{
430 QString::replace(before, after, cs);
431 m_safeString->m_safety = IsNotSafe;
432 return *m_safeString;
433}
434
436 QLatin1String after,
438{
439 QString::replace(before, after, cs);
440 m_safeString->m_safety = IsNotSafe;
441 return *m_safeString;
442}
443
445 const Cutelee::SafeString &after,
447{
448 QString::replace(before, after.get(), cs);
449 m_safeString->m_safety = after.m_safety;
450 return *m_safeString;
451}
452
454 const QString &after,
456{
457 QString::replace(before, after, cs);
458 m_safeString->m_safety = IsNotSafe;
459 return *m_safeString;
460}
461
463SafeString::NestedString::replace(const Cutelee::SafeString &before,
464 QLatin1String after,
466{
467 QString::replace(before.get(), after, cs);
468 m_safeString->m_safety = before.m_safety;
469 return *m_safeString;
470}
471
472SafeString &SafeString::NestedString::replace(const QString &before,
473 QLatin1String after,
475{
476 QString::replace(before, after, cs);
477 m_safeString->m_safety = IsNotSafe;
478 return *m_safeString;
479}
480
482 QLatin1String after,
484{
485 QString::replace(c, after, cs);
486 m_safeString->m_safety = IsNotSafe;
487 return *m_safeString;
488}
489
490SafeString &SafeString::NestedString::replace(const QRegularExpression &rx,
491 const Cutelee::SafeString &after)
492{
493 QString::replace(rx, after.get());
494 m_safeString->m_safety = after.m_safety;
495 return *m_safeString;
496}
497
498SafeString &SafeString::NestedString::replace(const QRegularExpression &rx,
499 const QString &after)
500{
501 QString::replace(rx, after);
502 m_safeString->m_safety = IsNotSafe;
503 return *m_safeString;
504}
505
507{
508 return SafeString(QString::right(n), m_safeString->m_safety);
509}
510
512 bool truncate) const
513{
514 return SafeString(QString::rightJustified(width, fill, truncate),
515 m_safeString->m_safety);
516}
517
518SafeString SafeString::NestedString::section(const QRegularExpression &reg,
519 int start, int end,
520 QString::SectionFlags flags) const
521{
522 return SafeString(QString::section(reg, start, end, flags),
523 m_safeString->m_safety);
524}
525
526SafeString SafeString::NestedString::section(QChar sep, int start, int end,
527 QString::SectionFlags flags) const
528{
529 return SafeString(QString::section(sep, start, end, flags),
530 m_safeString->m_safety);
531}
532
533SafeString SafeString::NestedString::section(const Cutelee::SafeString &sep,
534 int start, int end,
535 QString::SectionFlags flags) const
536{
537 return SafeString(QString::section(sep, start, end, flags),
538 m_safeString->m_safety);
539}
540
541SafeString SafeString::NestedString::section(const QString &sep, int start,
542 int end,
543 QString::SectionFlags flags) const
544{
545 return SafeString(QString::section(sep, start, end, flags),
546 m_safeString->m_safety);
547}
548
550{
551 QString::setNum(n, base);
552 m_safeString->m_safety = IsNotSafe;
553 return *m_safeString;
554}
555
557{
558 QString::setNum(n, base);
559 m_safeString->m_safety = IsNotSafe;
560 return *m_safeString;
561}
562
563SafeString &SafeString::NestedString::setNum(long int n, int base)
564{
565 QString::setNum(n, base);
566 m_safeString->m_safety = IsNotSafe;
567 return *m_safeString;
568}
569
571{
572 QString::setNum(n, base);
573 m_safeString->m_safety = IsNotSafe;
574 return *m_safeString;
575}
576
577SafeString &SafeString::NestedString::setNum(qlonglong n, int base)
578{
579 QString::setNum(n, base);
580 m_safeString->m_safety = IsNotSafe;
581 return *m_safeString;
582}
583
584SafeString &SafeString::NestedString::setNum(qulonglong n, int base)
585{
586 QString::setNum(n, base);
587 m_safeString->m_safety = IsNotSafe;
588 return *m_safeString;
589}
590
591SafeString &SafeString::NestedString::setNum(short int n, int base)
592{
593 QString::setNum(n, base);
594 m_safeString->m_safety = IsNotSafe;
595 return *m_safeString;
596}
597
599{
600 QString::setNum(n, base);
601 m_safeString->m_safety = IsNotSafe;
602 return *m_safeString;
603}
604
605SafeString &SafeString::NestedString::setNum(double n, char format,
606 int precision)
607{
608 QString::setNum(n, format, precision);
609 m_safeString->m_safety = IsNotSafe;
610 return *m_safeString;
611}
612
613SafeString &SafeString::NestedString::setNum(float n, char format,
614 int precision)
615{
616 QString::setNum(n, format, precision);
617 m_safeString->m_safety = IsNotSafe;
618 return *m_safeString;
619}
620
621SafeString &SafeString::NestedString::setUnicode(const QChar *unicode, int size)
622{
623 QString::setUnicode(unicode, size);
624 m_safeString->m_safety = IsNotSafe;
625 return *m_safeString;
626}
627
628SafeString &SafeString::NestedString::setUtf16(const ushort *unicode, int size)
629{
630 QString::setUtf16(unicode, size);
631 m_safeString->m_safety = IsNotSafe;
632 return *m_safeString;
633}
634
636{
637 return SafeString(QString::simplified(), m_safeString->m_safety);
638}
639
640#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0)
641QStringList SafeString::NestedString::split(const Cutelee::SafeString &sep,
642 QString::SplitBehavior behavior,
643 Qt::CaseSensitivity cs) const
644{
645 return QString::split(sep.get(), behavior, cs);
646}
647
648QStringList SafeString::NestedString::split(const QString &sep,
649 QString::SplitBehavior behavior,
650 Qt::CaseSensitivity cs) const
651{
652 return QString::split(sep, behavior, cs);
653}
654
655QStringList SafeString::NestedString::split(const QChar &sep,
656 QString::SplitBehavior behavior,
657 Qt::CaseSensitivity cs) const
658{
659 return QString::split(sep, behavior, cs);
660}
661
662QStringList
663SafeString::NestedString::split(const QRegularExpression &rx,
664 QString::SplitBehavior behavior) const
665{
666 return QString::split(rx, behavior);
667}
668#else
669QStringList SafeString::NestedString::split(const Cutelee::SafeString &sep,
670 Qt::SplitBehavior behavior,
671 Qt::CaseSensitivity cs) const
672{
673 return QString::split(sep.get(), behavior, cs);
674}
675
676QStringList SafeString::NestedString::split(const QString &sep,
677 Qt::SplitBehavior behavior,
678 Qt::CaseSensitivity cs) const
679{
680 return QString::split(sep, behavior, cs);
681}
682
683QStringList SafeString::NestedString::split(const QChar &sep,
684 Qt::SplitBehavior behavior,
685 Qt::CaseSensitivity cs) const
686{
687 return QString::split(sep, behavior, cs);
688}
689
690QStringList
691SafeString::NestedString::split(const QRegularExpression &rx,
692 Qt::SplitBehavior behavior) const
693{
694 return QString::split(rx, behavior);
695}
696#endif
697
699{
701}
702
704{
706}
707
709{
710 return SafeString(QString::trimmed(), m_safeString->m_safety);
711}
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:340
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
QStringList split(const QString &sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const const
typedef SectionFlags
QString & append(QChar ch)
void chop(int n)
QString & fill(QChar ch, int size)
QString & insert(int position, QChar ch)
QString left(int n) const const
QString leftJustified(int width, QChar fill, bool truncate) const const
QString mid(int position, int n) const const
QString normalized(NormalizationForm mode, QChar::UnicodeVersion version) const const
QString & prepend(QChar ch)
void push_back(QChar ch)
void push_front(QChar ch)
QString & remove(int position, int n)
QString repeated(int times) const const
QString & replace(int position, int n, QChar after)
QString right(int n) const const
QString rightJustified(int width, QChar fill, bool truncate) const const
QString section(QChar sep, int start, int end, SectionFlags flags) const const
QString & setNum(short n, int base)
QString & setUnicode(const QChar *unicode, int size)
QString & setUtf16(const ushort *unicode, int size)
QString simplified() const const
QString toLower() const const
QString toUpper() const const
QString trimmed() const const
CaseSensitivity
typedef SplitBehavior