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
27SafeString::SafeString()
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
132SafeString &SafeString::NestedString::append(const SafeString &str)
133{
134 QString::append(str.get());
135 if (!str.isSafe())
136 m_safeString->m_safety = IsNotSafe;
137
138 return *m_safeString;
139}
140
141SafeString &SafeString::NestedString::append(const QString &str)
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
157SafeString &SafeString::NestedString::append(QLatin1String str)
158{
159 QString::append(str);
160 m_safeString->m_safety = IsNotSafe;
161 return *m_safeString;
162}
163
164SafeString &SafeString::NestedString::append(const QChar ch)
165{
166 QString::append(ch);
167 m_safeString->m_safety = IsNotSafe;
168 return *m_safeString;
169}
170
171void SafeString::NestedString::chop(int n)
172{
173 QString::chop(n);
174 m_safeString->m_safety = IsNotSafe;
175}
176
177SafeString &SafeString::NestedString::fill(QChar ch, int size)
178{
179 QString::fill(ch, size);
180 m_safeString->m_safety = IsNotSafe;
181 return *m_safeString;
182}
183
184SafeString &SafeString::NestedString::insert(int position,
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
200SafeString &SafeString::NestedString::insert(int position,
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
220SafeString SafeString::NestedString::left(int n) const
221{
222 return SafeString(QString::left(n), m_safeString->m_safety);
223}
224
225SafeString SafeString::NestedString::leftJustified(int width, QChar fill,
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
238SafeString::NestedString::normalized(QString::NormalizationForm mode) const
239{
240 return SafeString(QString::normalized(mode), m_safeString->m_safety);
241}
242
244SafeString::NestedString::normalized(QString::NormalizationForm mode,
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
259SafeString &SafeString::NestedString::prepend(const QString &str)
260{
261 QString::prepend(str);
262 m_safeString->m_safety = IsNotSafe;
263 return *m_safeString;
264}
265
266SafeString &SafeString::NestedString::prepend(QLatin1String str)
267{
268 QString::prepend(str);
269 m_safeString->m_safety = IsNotSafe;
270 return *m_safeString;
271}
272
273SafeString &SafeString::NestedString::prepend(QChar ch)
274{
275 QString::prepend(ch);
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
292SafeString &SafeString::NestedString::remove(int position, int n)
293{
294 QString::remove(position, n);
295 m_safeString->m_safety = IsNotSafe;
296 return *m_safeString;
297}
298
299SafeString &SafeString::NestedString::remove(QChar ch, Qt::CaseSensitivity cs)
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,
307 Qt::CaseSensitivity cs)
308{
309 QString::remove(str, cs);
310 m_safeString->m_safety = IsNotSafe;
311 return *m_safeString;
312}
313
314SafeString &SafeString::NestedString::remove(const QString &str,
315 Qt::CaseSensitivity cs)
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
329SafeString SafeString::NestedString::repeated(int times) const
330{
331 return SafeString(QString::repeated(times), m_safeString->m_safety);
332}
333
334SafeString &SafeString::NestedString::replace(int position, int n,
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
342SafeString &SafeString::NestedString::replace(int position, int n,
343 const QString &after)
344{
345 QString::replace(position, n, after);
346 m_safeString->m_safety = IsNotSafe;
347 return *m_safeString;
348}
349
350SafeString &SafeString::NestedString::replace(int position, int n,
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,
368 Qt::CaseSensitivity cs)
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,
377 Qt::CaseSensitivity cs)
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,
395 Qt::CaseSensitivity cs)
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,
404 Qt::CaseSensitivity cs)
405{
406 QString::replace(before, blen, after, alen, cs);
407 m_safeString->m_safety = IsNotSafe;
408 return *m_safeString;
409}
410
411SafeString &SafeString::NestedString::replace(QChar ch, const SafeString &after,
412 Qt::CaseSensitivity cs)
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,
420 Qt::CaseSensitivity cs)
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,
428 Qt::CaseSensitivity cs)
429{
430 QString::replace(before, after, cs);
431 m_safeString->m_safety = IsNotSafe;
432 return *m_safeString;
433}
434
435SafeString &SafeString::NestedString::replace(QLatin1String before,
436 QLatin1String after,
437 Qt::CaseSensitivity cs)
438{
439 QString::replace(before, after, cs);
440 m_safeString->m_safety = IsNotSafe;
441 return *m_safeString;
442}
443
444SafeString &SafeString::NestedString::replace(QLatin1String before,
445 const Cutelee::SafeString &after,
446 Qt::CaseSensitivity cs)
447{
448 QString::replace(before, after.get(), cs);
449 m_safeString->m_safety = after.m_safety;
450 return *m_safeString;
451}
452
453SafeString &SafeString::NestedString::replace(QLatin1String before,
454 const QString &after,
455 Qt::CaseSensitivity cs)
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,
465 Qt::CaseSensitivity cs)
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,
474 Qt::CaseSensitivity cs)
475{
476 QString::replace(before, after, cs);
477 m_safeString->m_safety = IsNotSafe;
478 return *m_safeString;
479}
480
481SafeString &SafeString::NestedString::replace(QChar c,
482 QLatin1String after,
483 Qt::CaseSensitivity cs)
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
506SafeString SafeString::NestedString::right(int n) const
507{
508 return SafeString(QString::right(n), m_safeString->m_safety);
509}
510
511SafeString SafeString::NestedString::rightJustified(int width, QChar fill,
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
549SafeString &SafeString::NestedString::setNum(int n, int base)
550{
551 QString::setNum(n, base);
552 m_safeString->m_safety = IsNotSafe;
553 return *m_safeString;
554}
555
556SafeString &SafeString::NestedString::setNum(uint n, int base)
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
570SafeString &SafeString::NestedString::setNum(ulong n, int base)
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
598SafeString &SafeString::NestedString::setNum(ushort n, int base)
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
635SafeString SafeString::NestedString::simplified() const
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
698SafeString SafeString::NestedString::toLower() const
699{
700 return SafeString(QString::toLower(), IsNotSafe);
701}
702
703SafeString SafeString::NestedString::toUpper() const
704{
705 return SafeString(QString::toUpper(), IsNotSafe);
706}
707
708SafeString SafeString::NestedString::trimmed() const
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