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 
25 using 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 
38 SafeString::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 
51 void SafeString::setNeedsEscape(bool needsEscape)
52 {
53  m_needsescape = needsEscape;
54 }
55 
56 bool SafeString::needsEscape() const { return m_needsescape; }
57 
58 void SafeString::setSafety(Cutelee::SafeString::Safety safety)
59 {
60  m_safety = safety;
61 }
62 
63 bool SafeString::isSafe() const { return m_safety == IsSafe; }
64 
65 SafeString::NestedString::NestedString(SafeString *safeString)
66  : m_safeString(safeString)
67 {
68 }
69 
70 SafeString::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 
127 bool SafeString::operator==(const QString &other) const
128 {
129  return m_nestedString == other;
130 }
131 
132 SafeString &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 
141 SafeString &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)
149 SafeString &SafeString::NestedString::append(QStringView reference)
150 {
151  QString::append(reference);
152  m_safeString->m_safety = IsNotSafe;
153  return *m_safeString;
154 }
155 #endif
156 
157 SafeString &SafeString::NestedString::append(QLatin1String str)
158 {
159  QString::append(str);
160  m_safeString->m_safety = IsNotSafe;
161  return *m_safeString;
162 }
163 
164 SafeString &SafeString::NestedString::append(const QChar ch)
165 {
166  QString::append(ch);
167  m_safeString->m_safety = IsNotSafe;
168  return *m_safeString;
169 }
170 
171 void SafeString::NestedString::chop(int n)
172 {
173  QString::chop(n);
174  m_safeString->m_safety = IsNotSafe;
175 }
176 
177 SafeString &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 
184 SafeString &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 
194 SafeString &SafeString::NestedString::insert(int position, const QString &str)
195 {
196  QString::insert(position, str);
197  return *m_safeString;
198 }
199 
200 SafeString &SafeString::NestedString::insert(int position,
201  QLatin1String str)
202 {
203  QString::insert(position, str);
204  return *m_safeString;
205 }
206 
207 SafeString &SafeString::NestedString::insert(int position, const QChar *unicode,
208  int size)
209 {
210  QString::insert(position, unicode, size);
211  return *m_safeString;
212 }
213 
214 SafeString &SafeString::NestedString::insert(int position, QChar ch)
215 {
216  QString::insert(position, ch);
217  return *m_safeString;
218 }
219 
220 SafeString SafeString::NestedString::left(int n) const
221 {
222  return SafeString(QString::left(n), m_safeString->m_safety);
223 }
224 
225 SafeString 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 
232 SafeString SafeString::NestedString::mid(int position, int n) const
233 {
234  return SafeString(QString::mid(position, n), m_safeString->m_safety);
235 }
236 
238 SafeString::NestedString::normalized(QString::NormalizationForm mode) const
239 {
240  return SafeString(QString::normalized(mode), m_safeString->m_safety);
241 }
242 
244 SafeString::NestedString::normalized(QString::NormalizationForm mode,
245  QChar::UnicodeVersion version) const
246 {
247  return SafeString(QString::normalized(mode, version), m_safeString->m_safety);
248 }
249 
250 SafeString &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 
259 SafeString &SafeString::NestedString::prepend(const QString &str)
260 {
261  QString::prepend(str);
262  m_safeString->m_safety = IsNotSafe;
263  return *m_safeString;
264 }
265 
266 SafeString &SafeString::NestedString::prepend(QLatin1String str)
267 {
268  QString::prepend(str);
269  m_safeString->m_safety = IsNotSafe;
270  return *m_safeString;
271 }
272 
273 SafeString &SafeString::NestedString::prepend(QChar ch)
274 {
275  QString::prepend(ch);
276  m_safeString->m_safety = IsNotSafe;
277  return *m_safeString;
278 }
279 
280 void 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 
286 void 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 
292 SafeString &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 
299 SafeString &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 
306 SafeString &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 
314 SafeString &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 
322 SafeString &SafeString::NestedString::remove(const QRegularExpression &rx)
323 {
324  QString::remove(rx);
325  m_safeString->m_safety = IsNotSafe;
326  return *m_safeString;
327 }
328 
329 SafeString SafeString::NestedString::repeated(int times) const
330 {
331  return SafeString(QString::repeated(times), m_safeString->m_safety);
332 }
333 
334 SafeString &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 
342 SafeString &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 
350 SafeString &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 
358 SafeString &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 
365 SafeString &
366 SafeString::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 
375 SafeString &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 
384 SafeString &
385 SafeString::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 
393 SafeString &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 
402 SafeString &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 
411 SafeString &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 
419 SafeString &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 
427 SafeString &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 
435 SafeString &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 
444 SafeString &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 
453 SafeString &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 
462 SafeString &
463 SafeString::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 
472 SafeString &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 
481 SafeString &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 
490 SafeString &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 
498 SafeString &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 
506 SafeString SafeString::NestedString::right(int n) const
507 {
508  return SafeString(QString::right(n), m_safeString->m_safety);
509 }
510 
511 SafeString 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 
518 SafeString 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 
526 SafeString 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 
533 SafeString 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 
541 SafeString 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 
549 SafeString &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 
556 SafeString &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 
563 SafeString &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 
570 SafeString &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 
577 SafeString &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 
584 SafeString &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 
591 SafeString &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 
598 SafeString &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 
605 SafeString &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 
613 SafeString &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 
621 SafeString &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 
628 SafeString &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 
635 SafeString 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)
641 QStringList 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 
648 QStringList 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 
655 QStringList 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 
662 QStringList
663 SafeString::NestedString::split(const QRegularExpression &rx,
664  QString::SplitBehavior behavior) const
665 {
666  return QString::split(rx, behavior);
667 }
668 #else
669 QStringList 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 
676 QStringList 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 
683 QStringList 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 
690 QStringList
691 SafeString::NestedString::split(const QRegularExpression &rx,
692  Qt::SplitBehavior behavior) const
693 {
694  return QString::split(rx, behavior);
695 }
696 #endif
697 
698 SafeString SafeString::NestedString::toLower() const
699 {
700  return SafeString(QString::toLower(), IsNotSafe);
701 }
702 
703 SafeString SafeString::NestedString::toUpper() const
704 {
705  return SafeString(QString::toUpper(), IsNotSafe);
706 }
707 
708 SafeString 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
SafeString & operator+=(const QString &str)
Definition: safestring.cpp:103
bool needsEscape() const
Definition: safestring.cpp:56
bool isSafe() const
Definition: safestring.cpp:63
const NestedString & get() const
Definition: safestring.h:340
SafeString operator+(const QString &str)
Definition: safestring.cpp:87
SafeString & operator=(const SafeString &str)
Definition: safestring.cpp:76
bool operator==(const SafeString &other) const
Definition: safestring.cpp:120
@ 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