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 
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 
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 
192 SafeString &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 
205 SafeString &SafeString::NestedString::insert(int position, const QChar *unicode,
206  int size)
207 {
208  QString::insert(position, unicode, size);
209  return *m_safeString;
210 }
211 
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 
230 SafeString 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 
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 {
273  QString::prepend(ch);
274  m_safeString->m_safety = IsNotSafe;
275  return *m_safeString;
276 }
277 
279 {
280  QString::push_back(other.get());
281  m_safeString->m_safety = other.m_safety;
282 }
283 
285 {
286  QString::push_front(other.get());
287  m_safeString->m_safety = other.m_safety;
288 }
289 
290 SafeString &SafeString::NestedString::remove(int position, int n)
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 
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 
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 
332 SafeString &SafeString::NestedString::replace(int position, int n,
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 
340 SafeString &SafeString::NestedString::replace(int position, int n,
341  const QString &after)
342 {
343  QString::replace(position, n, after);
344  m_safeString->m_safety = IsNotSafe;
345  return *m_safeString;
346 }
347 
348 SafeString &SafeString::NestedString::replace(int position, int n,
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 
356 SafeString &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 
363 SafeString &
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 
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 
382 SafeString &
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 
392  const QString &after,
394 {
395  QString::replace(before, after, cs);
396  m_safeString->m_safety = IsNotSafe;
397  return *m_safeString;
398 }
399 
400 SafeString &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 
419 {
420  QString::replace(ch, after, cs);
421  m_safeString->m_safety = IsNotSafe;
422  return *m_safeString;
423 }
424 
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 
460 SafeString &
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 
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 
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 
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 
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 
524 SafeString 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 
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 
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 
561 SafeString &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 
575 SafeString &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 
582 SafeString &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 
589 SafeString &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 
596 SafeString &SafeString::NestedString::setNum(ushort n, int base)
597 {
598  QString::setNum(n, base);
599  m_safeString->m_safety = IsNotSafe;
600  return *m_safeString;
601 }
602 
603 SafeString &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 
611 SafeString &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 
619 SafeString &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 
626 SafeString &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 
639  Qt::SplitBehavior behavior,
640  Qt::CaseSensitivity cs) const
641 {
642  return QString::split(sep.get(), behavior, cs);
643 }
644 
646  Qt::SplitBehavior behavior,
647  Qt::CaseSensitivity cs) const
648 {
649  return QString::split(sep, behavior, cs);
650 }
651 
653  Qt::SplitBehavior behavior,
654  Qt::CaseSensitivity cs) const
655 {
656  return QString::split(sep, behavior, cs);
657 }
658 
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 }
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:325
QString & setUnicode(const QChar *unicode, qsizetype size)
The string is safe and requires no further escaping.
Definition: safestring.h:98