1/****************************************************************************
2**
3** Copyright (C) 2016 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the QtXmlPatterns module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU Lesser General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU Lesser
19** General Public License version 3 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPL3 included in the
21** packaging of this file. Please review the following information to
22** ensure the GNU Lesser General Public License version 3 requirements
23** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24**
25** GNU General Public License Usage
26** Alternatively, this file may be used under the terms of the GNU
27** General Public License version 2.0 or (at your option) the GNU General
28** Public license version 3 or any later version approved by the KDE Free
29** Qt Foundation. The licenses are as published by the Free Software
30** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31** included in the packaging of this file. Please review the following
32** information to ensure the GNU General Public License requirements will
33** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34** https://www.gnu.org/licenses/gpl-3.0.html.
35**
36** $QT_END_LICENSE$
37**
38****************************************************************************/
39
40#include "qcommonvalues_p.h"
41#include "qpatternistlocale_p.h"
42#include "qschemanumeric_p.h"
43#include "qatomicstring_p.h"
44#include "qtocodepointsiterator_p.h"
45
46#include "qassemblestringfns_p.h"
47
48QT_BEGIN_NAMESPACE
49
50using namespace QPatternist;
51
52/*
53 * Determines whether @p cp is a valid XML 1.0 character.
54 *
55 * @see <a href="http://www.w3.org/TR/REC-xml/#charsets">Extensible Markup
56 * Language (XML) 1.0 (Third Edition)2.2 Characters</a>
57 */
58static inline bool isValidXML10Char(const qint32 cp)
59{
60 /* [2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] |
61 * [#xE000-#xFFFD] | [#x10000-#x10FFFF]
62 */
63 return (cp == 0x9 ||
64 cp == 0xA ||
65 cp == 0xD ||
66 (0x20 <= cp && cp <= 0xD7FF) ||
67 (0xE000 <= cp && cp <= 0xFFFD) ||
68 (0x10000 <= cp && cp <= 0x10FFFF));
69}
70
71Item CodepointsToStringFN::evaluateSingleton(const DynamicContext::Ptr &context) const
72{
73 const Item::Iterator::Ptr it(m_operands.first()->evaluateSequence(context));
74
75 if(!it)
76 return CommonValues::EmptyString;
77
78 QString retval;
79 Item item(it->next());
80 while(item)
81 {
82 const qint32 cp = static_cast<qint32>(item.as<Numeric>()->toInteger());
83
84 if(!isValidXML10Char(cp))
85 {
86 context->error(message: QtXmlPatterns::tr(sourceText: "%1 is not a valid XML 1.0 character.")
87 .arg(a: formatData(data: QLatin1String("0x") +
88 QString::number(cp, base: 16))),
89 errorCode: ReportContext::FOCH0001, reflection: this);
90
91 return CommonValues::EmptyString;
92 }
93 retval.append(c: QChar(cp));
94 item = it->next();
95 }
96
97 return AtomicString::fromValue(value: retval);
98}
99
100Item::Iterator::Ptr StringToCodepointsFN::evaluateSequence(const DynamicContext::Ptr &context) const
101{
102 const Item item(m_operands.first()->evaluateSingleton(context));
103 if(!item)
104 return CommonValues::emptyIterator;
105
106 const QString str(item.stringValue());
107 if(str.isEmpty())
108 return CommonValues::emptyIterator;
109 else
110 return Item::Iterator::Ptr(new ToCodepointsIterator(str));
111}
112
113QT_END_NAMESPACE
114

source code of qtxmlpatterns/src/xmlpatterns/functions/qassemblestringfns.cpp