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 
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)
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 
194 SafeString &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 
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 
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 
232 SafeString 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 
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 {
275  QString::prepend(ch);
276  m_safeString->m_safety = IsNotSafe;
277  return *m_safeString;
278 }
279 
281 {
282  QString::push_back(other.get());
283  m_safeString->m_safety = other.m_safety;
284 }
285 
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 
300 {
301  QString::remove(ch, cs);
302  m_safeString->m_safety = IsNotSafe;
303  return *m_safeString;
304 }
305 
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 
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 
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 &
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 
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 
384 SafeString &
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 
394  const QString &after,
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,
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 
421 {
422  QString::replace(ch, after, cs);
423  m_safeString->m_safety = IsNotSafe;
424  return *m_safeString;
425 }
426 
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 
462 SafeString &
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 
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 
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 
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 
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 
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 
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 
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 
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 
636 {
637  return SafeString(QString::simplified(), m_safeString->m_safety);
638 }
639 
640 #if QT_VERSION < QT_VERSION_CHECK(5, 14, 0)
642  QString::SplitBehavior behavior,
643  Qt::CaseSensitivity cs) const
644 {
645  return QString::split(sep.get(), behavior, cs);
646 }
647 
649  QString::SplitBehavior behavior,
650  Qt::CaseSensitivity cs) const
651 {
652  return QString::split(sep, behavior, cs);
653 }
654 
656  QString::SplitBehavior behavior,
657  Qt::CaseSensitivity cs) const
658 {
659  return QString::split(sep, behavior, cs);
660 }
661 
664  QString::SplitBehavior behavior) const
665 {
666  return QString::split(rx, behavior);
667 }
668 #else
670  Qt::SplitBehavior behavior,
671  Qt::CaseSensitivity cs) const
672 {
673  return QString::split(sep.get(), behavior, cs);
674 }
675 
677  Qt::SplitBehavior behavior,
678  Qt::CaseSensitivity cs) const
679 {
680  return QString::split(sep, behavior, cs);
681 }
682 
684  Qt::SplitBehavior behavior,
685  Qt::CaseSensitivity cs) const
686 {
687  return QString::split(sep, behavior, cs);
688 }
689 
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 }
QString & append(QChar ch)
QString toUpper() const const
QString & fill(QChar ch, qsizetype size)
The Cutelee namespace holds all public Cutelee API.
Definition: Mainpage.dox:7
SafeString & operator+=(const QString &str)
Definition: safestring.cpp:103
QString & prepend(QChar ch)
bool operator==(const SafeString &other) const
Definition: safestring.cpp:120
QString simplified() const const
void chop(qsizetype n)
QString normalized(NormalizationForm mode, QChar::UnicodeVersion version) const const
SafeString & operator=(const SafeString &str)
Definition: safestring.cpp:76
QString & insert(qsizetype position, QChar ch)
QString rightJustified(qsizetype width, QChar fill, bool truncate) const const
CaseSensitivity
QString trimmed() const const
A QString wrapper class for containing whether a string is safe or needs to be escaped.
Definition: safestring.h:91
QString right(qsizetype n) const const
void push_back(QChar ch)
QString toLower() const const
typedef SplitBehavior
QString & remove(QChar ch, Qt::CaseSensitivity cs)
QString & replace(QChar before, QChar after, Qt::CaseSensitivity cs)
SafeString operator+(const QString &str)
Definition: safestring.cpp:87
QString mid(qsizetype position, qsizetype n) const const
QStringList split(QChar sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const const
typedef SectionFlags
QString & setNum(double n, char format, int precision)
void push_front(QChar ch)
QString leftJustified(qsizetype width, QChar fill, bool truncate) const const
QString section(QChar sep, qsizetype start, qsizetype end, SectionFlags flags) const const
QString left(qsizetype n) const const
UnicodeVersion
bool isSafe() const
Definition: safestring.cpp:63
QString & setUtf16(const ushort *unicode, qsizetype size)
bool needsEscape() const
Definition: safestring.cpp:56
QString repeated(qsizetype times) const const
const NestedString & get() const
Definition: safestring.h:340
QString & setUnicode(const QChar *unicode, qsizetype size)
The string is safe and requires no further escaping.
Definition: safestring.h:98