qunicodetools.cpp

Absolute File Name:/home/qt/qt5_coco/qt5/qtbase/src/corelib/tools/qunicodetools.cpp
Switch to Source codePreprocessed file
LineSourceCount
1-
2-
3-
4-
5-
6-
7-
8__attribute__((visibility("default"))) int qt_initcharattributes_default_algorithm_only = 0;-
9-
10namespace QUnicodeTools {-
11namespace GB {-
12-
13static const uchar breakTable[QUnicodeTables::GraphemeBreak_LVT + 1][QUnicodeTables::GraphemeBreak_LVT + 1] = {-
14-
15 { true , true , true , true , false, true , true , false, true , true , true , true , true },-
16 { true , true , false, true , true , true , true , true , true , true , true , true , true },-
17 { true , true , true , true , true , true , true , true , true , true , true , true , true },-
18 { true , true , true , true , true , true , true , true , true , true , true , true , true },-
19 { true , true , true , true , false, true , true , false, true , true , true , true , true },-
20 { true , true , true , true , false, false, true , false, true , true , true , true , true },-
21 { false, true , true , true , false, false, false, false, false, false, false, false, false },-
22 { true , true , true , true , false, true , true , false, true , true , true , true , true },-
23 { true , true , true , true , false, true , true , false, false, false, true , false, false },-
24 { true , true , true , true , false, true , true , false, true , false, false, true , true },-
25 { true , true , true , true , false, true , true , false, true , true , false, true , true },-
26 { true , true , true , true , false, true , true , false, true , false, false, true , true },-
27 { true , true , true , true , false, true , true , false, true , true , false, true , true },-
28};-
29-
30}-
31-
32static void getGraphemeBreaks(const ushort *string, quint32 len, QCharAttributes *attributes)-
33{-
34 QUnicodeTables::GraphemeBreakClass lcls = QUnicodeTables::GraphemeBreak_LF;-
35 for (quint32 i = 0; i != len; ++i) {-
36 quint32 pos = i;-
37 uint ucs4 = string[i];-
38 if (QChar::isHighSurrogate(ucs4) && i + 1 != len) {-
39 ushort low = string[i + 1];-
40 if (QChar::isLowSurrogate(low)) {-
41 ucs4 = QChar::surrogateToUcs4(ucs4, low);-
42 ++i;-
43 }-
44 }-
45-
46 const QUnicodeTables::Properties *prop = QUnicodeTables::properties(ucs4);-
47 QUnicodeTables::GraphemeBreakClass cls = (QUnicodeTables::GraphemeBreakClass) prop->graphemeBreakClass;-
48-
49 if (__builtin_expect(!!(GB::breakTable[lcls][cls]), true))-
50 attributes[pos].graphemeBoundary = true;-
51-
52 lcls = cls;-
53 }-
54-
55 attributes[len].graphemeBoundary = true;-
56}-
57-
58-
59namespace WB {-
60-
61enum Action {-
62 NoBreak,-
63 Break,-
64 Lookup,-
65 LookupW-
66};-
67-
68static const uchar breakTable[QUnicodeTables::WordBreak_ExtendNumLet + 1][QUnicodeTables::WordBreak_ExtendNumLet + 1] = {-
69-
70 { Break , Break , Break , Break , NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break },-
71 { Break , Break , NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break },-
72 { Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break },-
73 { Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break },-
74 { Break , Break , Break , Break , NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break },-
75 { Break , Break , Break , Break , NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break },-
76 { Break , Break , Break , Break , NoBreak, Break , NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , NoBreak },-
77 { Break , Break , Break , Break , NoBreak, Break , Break , NoBreak, NoBreak, LookupW, Lookup , LookupW, LookupW, Break , NoBreak, NoBreak },-
78 { Break , Break , Break , Break , NoBreak, Break , Break , NoBreak, NoBreak, LookupW, Break , LookupW, LookupW, Break , NoBreak, NoBreak },-
79 { Break , Break , Break , Break , NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break },-
80 { Break , Break , Break , Break , NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break },-
81 { Break , Break , Break , Break , NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break },-
82 { Break , Break , Break , Break , NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break },-
83 { Break , Break , Break , Break , NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break },-
84 { Break , Break , Break , Break , NoBreak, Break , Break , NoBreak, NoBreak, Lookup , Break , Lookup , Break , Lookup , NoBreak, NoBreak },-
85 { Break , Break , Break , Break , NoBreak, Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , NoBreak, NoBreak },-
86};-
87-
88}-
89-
90static void getWordBreaks(const ushort *string, quint32 len, QCharAttributes *attributes)-
91{-
92 enum WordType {-
93 WordTypeNone, WordTypeAlphaNumeric, WordTypeHiraganaKatakana-
94 } currentWordType = WordTypeNone;-
95-
96 QUnicodeTables::WordBreakClass cls = QUnicodeTables::WordBreak_LF;-
97 for (quint32 i = 0; i != len; ++i) {-
98 quint32 pos = i;-
99 uint ucs4 = string[i];-
100 if (QChar::isHighSurrogate(ucs4) && i + 1 != len) {-
101 ushort low = string[i + 1];-
102 if (QChar::isLowSurrogate(low)) {-
103 ucs4 = QChar::surrogateToUcs4(ucs4, low);-
104 ++i;-
105 }-
106 }-
107-
108 const QUnicodeTables::Properties *prop = QUnicodeTables::properties(ucs4);-
109 QUnicodeTables::WordBreakClass ncls = (QUnicodeTables::WordBreakClass) prop->wordBreakClass;-
110-
111 if (qt_initcharattributes_default_algorithm_only) {-
112-
113-
114-
115-
116 if (ucs4 == 0x002E)-
117 ncls = QUnicodeTables::WordBreak_MidNumLet;-
118 else if (ucs4 == 0x003A)-
119 ncls = QUnicodeTables::WordBreak_MidLetter;-
120 }-
121-
122-
123 uchar action = WB::breakTable[cls][ncls];-
124 switch (action) {-
125 case WB::Break:-
126 break;-
127 case WB::NoBreak:-
128 if (__builtin_expect(!!(ncls == QUnicodeTables::WordBreak_Extend), false)) {-
129-
130 continue;-
131 }-
132 break;-
133 case WB::Lookup:-
134 case WB::LookupW:-
135 for (quint32 lookahead = i + 1; lookahead < len; ++lookahead) {-
136 ucs4 = string[lookahead];-
137 if (QChar::isHighSurrogate(ucs4) && lookahead + 1 != len) {-
138 ushort low = string[lookahead + 1];-
139 if (QChar::isLowSurrogate(low)) {-
140 ucs4 = QChar::surrogateToUcs4(ucs4, low);-
141 ++lookahead;-
142 }-
143 }-
144-
145 prop = QUnicodeTables::properties(ucs4);-
146 QUnicodeTables::WordBreakClass tcls = (QUnicodeTables::WordBreakClass) prop->wordBreakClass;-
147-
148 if (__builtin_expect(!!(tcls == QUnicodeTables::WordBreak_Extend), false)) {-
149-
150 continue;-
151 }-
152-
153 if (__builtin_expect(!!(tcls == cls || (action == WB::LookupW && (tcls == QUnicodeTables::WordBreak_HebrewLetter || tcls == QUnicodeTables::WordBreak_ALetter))), true)-
154 ) {-
155 i = lookahead;-
156 ncls = tcls;-
157 action = WB::NoBreak;-
158 }-
159 break;-
160 }-
161 if (action != WB::NoBreak) {-
162 action = WB::Break;-
163 if (__builtin_expect(!!(ncls == QUnicodeTables::WordBreak_SingleQuote && cls == QUnicodeTables::WordBreak_HebrewLetter), false))-
164 action = WB::NoBreak;-
165 }-
166 break;-
167 }-
168-
169 cls = ncls;-
170 if (action == WB::Break) {-
171 attributes[pos].wordBreak = true;-
172 if (currentWordType != WordTypeNone)-
173 attributes[pos].wordEnd = true;-
174 switch (cls) {-
175 case QUnicodeTables::WordBreak_Katakana:-
176 currentWordType = WordTypeHiraganaKatakana;-
177 attributes[pos].wordStart = true;-
178 break;-
179 case QUnicodeTables::WordBreak_HebrewLetter:-
180 case QUnicodeTables::WordBreak_ALetter:-
181 case QUnicodeTables::WordBreak_Numeric:-
182 currentWordType = WordTypeAlphaNumeric;-
183 attributes[pos].wordStart = true;-
184 break;-
185 default:-
186 currentWordType = WordTypeNone;-
187 break;-
188 }-
189 }-
190 }-
191-
192 if (currentWordType != WordTypeNone)-
193 attributes[len].wordEnd = true;-
194 attributes[len].wordBreak = true;-
195}-
196-
197-
198namespace SB {-
199-
200enum State {-
201 Initial,-
202 Lower,-
203 Upper,-
204 LUATerm,-
205 ATerm,-
206 ATermC,-
207 ACS,-
208 STerm,-
209 STermC,-
210 SCS,-
211 BAfterC,-
212 BAfter,-
213 Break,-
214 Lookup-
215};-
216-
217static const uchar breakTable[BAfter + 1][QUnicodeTables::SentenceBreak_Close + 1] = {-
218-
219 { Initial, BAfterC, BAfter , BAfter , Initial, Initial, Lower , Upper , Initial, Initial, ATerm , Initial, STerm , Initial },-
220 { Initial, BAfterC, BAfter , BAfter , Lower , Initial, Initial, Initial, Initial, Initial, LUATerm, Initial, STerm , Initial },-
221 { Initial, BAfterC, BAfter , BAfter , Upper , Initial, Initial, Upper , Initial, Initial, LUATerm, STerm , STerm , Initial },-
222-
223 { Lookup , BAfterC, BAfter , BAfter , LUATerm, ACS , Initial, Upper , Break , Initial, ATerm , STerm , STerm , ATermC },-
224 { Lookup , BAfterC, BAfter , BAfter , ATerm , ACS , Initial, Break , Break , Initial, ATerm , STerm , STerm , ATermC },-
225 { Lookup , BAfterC, BAfter , BAfter , ATermC , ACS , Initial, Break , Break , Lookup , ATerm , STerm , STerm , ATermC },-
226 { Lookup , BAfterC, BAfter , BAfter , ACS , ACS , Initial, Break , Break , Lookup , ATerm , STerm , STerm , Lookup },-
227-
228 { Break , BAfterC, BAfter , BAfter , STerm , SCS , Break , Break , Break , Break , ATerm , STerm , STerm , STermC },-
229 { Break , BAfterC, BAfter , BAfter , STermC , SCS , Break , Break , Break , Break , ATerm , STerm , STerm , STermC },-
230 { Break , BAfterC, BAfter , BAfter , SCS , SCS , Break , Break , Break , Break , ATerm , STerm , STerm , Break },-
231 { Break , Break , BAfter , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break },-
232 { Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break },-
233};-
234-
235}-
236-
237static void getSentenceBreaks(const ushort *string, quint32 len, QCharAttributes *attributes)-
238{-
239 uchar state = SB::BAfter;-
240 for (quint32 i = 0; i != len; ++i) {-
241 quint32 pos = i;-
242 uint ucs4 = string[i];-
243 if (QChar::isHighSurrogate(ucs4) && i + 1 != len) {-
244 ushort low = string[i + 1];-
245 if (QChar::isLowSurrogate(low)) {-
246 ucs4 = QChar::surrogateToUcs4(ucs4, low);-
247 ++i;-
248 }-
249 }-
250-
251 const QUnicodeTables::Properties *prop = QUnicodeTables::properties(ucs4);-
252 QUnicodeTables::SentenceBreakClass ncls = (QUnicodeTables::SentenceBreakClass) prop->sentenceBreakClass;-
253-
254 ((!(state <= SB::BAfter)) ? qt_assert("state <= SB::BAfter",__FILE__,299305) : qt_noop());-
255 state = SB::breakTable[state][ncls];-
256 if (__builtin_expect(!!(state == SB::Lookup), false)) {-
257 state = SB::Break;-
258 for (quint32 lookahead = i + 1; lookahead < len; ++lookahead) {-
259 ucs4 = string[lookahead];-
260 if (QChar::isHighSurrogate(ucs4) && lookahead + 1 != len) {-
261 ushort low = string[lookahead + 1];-
262 if (QChar::isLowSurrogate(low)) {-
263 ucs4 = QChar::surrogateToUcs4(ucs4, low);-
264 ++lookahead;-
265 }-
266 }-
267-
268 prop = QUnicodeTables::properties(ucs4);-
269 QUnicodeTables::SentenceBreakClass tcls = (QUnicodeTables::SentenceBreakClass) prop->sentenceBreakClass;-
270 switch (tcls) {-
271 case QUnicodeTables::SentenceBreak_Other:-
272 case QUnicodeTables::SentenceBreak_Extend:-
273 case QUnicodeTables::SentenceBreak_Sp:-
274 case QUnicodeTables::SentenceBreak_Numeric:-
275 case QUnicodeTables::SentenceBreak_SContinue:-
276 case QUnicodeTables::SentenceBreak_Close:-
277 continue;-
278 case QUnicodeTables::SentenceBreak_Lower:-
279 i = lookahead;-
280 state = SB::Initial;-
281 break;-
282 default:-
283 break;-
284 }-
285 break;-
286 }-
287 }-
288 if (__builtin_expect(!!(state == SB::Break), false)) {-
289 attributes[pos].sentenceBoundary = true;-
290 state = SB::breakTable[SB::Initial][ncls];-
291 }-
292 }-
293-
294 attributes[len].sentenceBoundary = true;-
295}-
296namespace LB {-
297-
298namespace NS {-
299-
300-
301-
302-
303-
304enum Action {-
305 None,-
306 Start,-
307 Continue,-
308 Break-
309};-
310-
311enum Class {-
312 XX,-
313 PRPO,-
314 OPHY,-
315 NU,-
316 SYIS,-
317 CLCP-
318};-
319-
320static const uchar actionTable[CLCP + 1][CLCP + 1] = {-
321-
322 { None , Start , Start , Start , None , None },-
323 { None , Start , Continue, Continue, None , None },-
324 { None , Start , Start , Continue, None , None },-
325 { Break , Break , Break , Continue, Continue, Continue },-
326 { Break , Break , Break , Continue, Continue, Continue },-
327 { Break , Continue, Break , Break , Break , Break },-
328};-
329-
330inline Class toClass(QUnicodeTables::LineBreakClass lbc, QChar::Category category)-
331{-
332 switch (lbc) {-
333 case QUnicodeTables::LineBreak_AL:-
334-
335 if (category == QChar::Symbol_Math)-
336 return SYIS;-
337 break;-
338 case QUnicodeTables::LineBreak_PR: case QUnicodeTables::LineBreak_PO:-
339 return PRPO;-
340 case QUnicodeTables::LineBreak_OP: case QUnicodeTables::LineBreak_HY:-
341 return OPHY;-
342 case QUnicodeTables::LineBreak_NU:-
343 return NU;-
344 case QUnicodeTables::LineBreak_SY: case QUnicodeTables::LineBreak_IS:-
345 return SYIS;-
346 case QUnicodeTables::LineBreak_CL: case QUnicodeTables::LineBreak_CP:-
347 return CLCP;-
348 default:-
349 break;-
350 }-
351 return XX;-
352}-
353-
354}-
355enum Action {-
356 ProhibitedBreak, PB = ProhibitedBreak,-
357 DirectBreak, DB = DirectBreak,-
358 IndirectBreak, IB = IndirectBreak,-
359 CombiningIndirectBreak, CI = CombiningIndirectBreak,-
360 CombiningProhibitedBreak, CP = CombiningProhibitedBreak,-
361 ProhibitedBreakAfterHebrewPlusHyphen, HH = ProhibitedBreakAfterHebrewPlusHyphen-
362};-
363-
364static const uchar breakTable[QUnicodeTables::LineBreak_CB + 1][QUnicodeTables::LineBreak_CB + 1] = {-
365-
366 { PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, CP, PB, PB, PB, PB, PB, PB, PB, PB },-
367 { DB, PB, PB, IB, IB, PB, PB, PB, PB, DB, DB, DB, DB, DB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB },-
368 { DB, PB, PB, IB, IB, PB, PB, PB, PB, DB, DB, IB, IB, IB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB },-
369 { PB, PB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB, IB, IB },-
370 { IB, PB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB, IB, IB },-
371 { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB },-
372 { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB },-
373 { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, DB, IB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB },-
374 { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, IB, IB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB },-
375 { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, IB, IB, IB, IB, DB, IB, IB, DB, DB, PB, CI, PB, IB, IB, IB, IB, IB, DB, DB },-
376 { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, IB, IB, IB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB },-
377 { IB, PB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB },-
378 { IB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, IB, IB, IB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB },-
379 { IB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, IB, IB, IB, DB, IB, CI, CI, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB },-
380 { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB },-
381 { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB },-
382 { HH, PB, PB, IB, HH, IB, PB, PB, PB, HH, HH, IB, HH, HH, HH, HH, IB, IB, HH, HH, PB, CI, PB, HH, HH, HH, HH, HH, HH, DB },-
383 { HH, PB, PB, IB, HH, IB, PB, PB, PB, HH, HH, HH, HH, HH, HH, HH, IB, IB, HH, HH, PB, CI, PB, HH, HH, HH, HH, HH, HH, DB },-
384 { IB, PB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB, IB, DB },-
385 { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, DB, IB, IB, DB, PB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB },-
386 { DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB },-
387 { IB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, IB, IB, IB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB },-
388 { IB, PB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB, IB, IB },-
389 { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, IB, IB, DB, DB },-
390 { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, IB, DB, DB },-
391 { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, IB, IB, IB, IB, DB, DB, DB },-
392 { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, IB, IB, DB, DB },-
393 { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, IB, DB, DB },-
394 { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, IB, DB },-
395 { DB, PB, PB, IB, IB, DB, PB, PB, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB }-
396};-
397-
398-
399-
400-
401-
402}-
403-
404static void getLineBreaks(const ushort *string, quint32 len, QCharAttributes *attributes)-
405{-
406 quint32 nestart = 0;-
407 LB::NS::Class nelast = LB::NS::XX;-
408-
409 QUnicodeTables::LineBreakClass lcls = QUnicodeTables::LineBreak_LF;-
410 QUnicodeTables::LineBreakClass cls = lcls;-
411 for (quint32 i = 0; i != len; ++i) {-
412 quint32 pos = i;-
413 uint ucs4 = string[i];-
414 if (QChar::isHighSurrogate(ucs4) && i + 1 != len) {-
415 ushort low = string[i + 1];-
416 if (QChar::isLowSurrogate(low)) {-
417 ucs4 = QChar::surrogateToUcs4(ucs4, low);-
418 ++i;-
419 }-
420 }-
421-
422 const QUnicodeTables::Properties *prop = QUnicodeTables::properties(ucs4);-
423 QUnicodeTables::LineBreakClass ncls = (QUnicodeTables::LineBreakClass) prop->lineBreakClass;-
424-
425 if (__builtin_expect(!!(ncls == QUnicodeTables::LineBreak_SA), false)) {-
426-
427 static const int test = (1 << (QChar::Mark_NonSpacing)) | (1 << (QChar::Mark_SpacingCombining));-
428 if ((1 << (prop->category)) & test)-
429 ncls = QUnicodeTables::LineBreak_CM;-
430 }-
431 if (__builtin_expect(!!(ncls == QUnicodeTables::LineBreak_CM), false)) {-
432-
433 if (lcls == QUnicodeTables::LineBreak_ZW || lcls >= QUnicodeTables::LineBreak_SP)-
434 ncls = QUnicodeTables::LineBreak_AL;-
435 }-
436-
437 if (__builtin_expect(!!(ncls != QUnicodeTables::LineBreak_CM), true)) {-
438-
439 LB::NS::Class necur = LB::NS::toClass(ncls, (QChar::Category)prop->category);-
440 switch (LB::NS::actionTable[nelast][necur]) {-
441 case LB::NS::Break:-
442-
443 for (quint32 j = nestart + 1; j < pos; ++j)-
444 attributes[j].lineBreak = false;-
445-
446 case LB::NS::None:-
447 nelast = LB::NS::XX;-
448 break;-
449 case LB::NS::Start:-
450 nestart = i;-
451-
452 default:-
453 nelast = necur;-
454 break;-
455 }-
456 }-
457-
458 if (__builtin_expect(!!(lcls >= QUnicodeTables::LineBreak_CR), false)) {-
459-
460 if (lcls > QUnicodeTables::LineBreak_CR || ncls != QUnicodeTables::LineBreak_LF)-
461 attributes[pos].lineBreak = attributes[pos].mandatoryBreak = true;-
462 goto next;-
463 }-
464-
465 if (__builtin_expect(!!(ncls >= QUnicodeTables::LineBreak_SP), false)) {-
466 if (ncls > QUnicodeTables::LineBreak_SP)-
467 goto next;-
468 goto next_no_cls_update;-
469 }-
470-
471-
472-
473 if (__builtin_expect(!!(cls >= QUnicodeTables::LineBreak_SA), false))-
474 cls = QUnicodeTables::LineBreak_AL;-
475-
476 switch (LB::breakTable[cls][ncls < QUnicodeTables::LineBreak_SA ? ncls : QUnicodeTables::LineBreak_AL]) {-
477 case LB::DirectBreak:-
478 attributes[pos].lineBreak = true;-
479 break;-
480 case LB::IndirectBreak:-
481 if (lcls == QUnicodeTables::LineBreak_SP)-
482 attributes[pos].lineBreak = true;-
483 break;-
484 case LB::CombiningIndirectBreak:-
485 if (lcls != QUnicodeTables::LineBreak_SP)-
486 goto next_no_cls_update;-
487 attributes[pos].lineBreak = true;-
488 break;-
489 case LB::CombiningProhibitedBreak:-
490 if (lcls != QUnicodeTables::LineBreak_SP)-
491 goto next_no_cls_update;-
492 break;-
493 case LB::ProhibitedBreakAfterHebrewPlusHyphen:-
494 if (lcls != QUnicodeTables::LineBreak_HL)-
495 attributes[pos].lineBreak = true;-
496 break;-
497 case LB::ProhibitedBreak:-
498-
499 default:-
500 break;-
501 }-
502-
503 next:-
504 cls = ncls;-
505 next_no_cls_update:-
506 lcls = ncls;-
507 }-
508-
509 if (__builtin_expect(!!(LB::NS::actionTable[nelast][LB::NS::XX] == LB::NS::Break), false)) {-
510-
511 for (quint32 j = nestart + 1; j < len; ++j)-
512 attributes[j].lineBreak = false;-
513 }-
514-
515 attributes[0].lineBreak = attributes[0].mandatoryBreak = false;-
516 attributes[len].lineBreak = attributes[len].mandatoryBreak = true;-
517}-
518-
519-
520static void getWhiteSpaces(const ushort *string, quint32 len, QCharAttributes *attributes)-
521{-
522 for (quint32 i = 0; i != len; ++i) {-
523 uint ucs4 = string[i];-
524 if (QChar::isHighSurrogate(ucs4) && i + 1 != len) {-
525 ushort low = string[i + 1];-
526 if (QChar::isLowSurrogate(low)) {-
527 ucs4 = QChar::surrogateToUcs4(ucs4, low);-
528 ++i;-
529 }-
530 }-
531-
532 if (__builtin_expect(!!(QChar::isSpace(ucs4)), false))-
533 attributes[i].whiteSpace = true;-
534 }-
535}-
536-
537-
538__attribute__((visibility("default"))) void initCharAttributes(const ushort *string, int length,-
539 const ScriptItem *items, int numItems,-
540 QCharAttributes *attributes, CharAttributeOptions options)-
541{-
542 if (length <= 0)-
543 return;-
544-
545 if (!(options & DontClearAttributes))-
546 ::memset(attributes, 0, (length + 1) * sizeof(QCharAttributes));-
547-
548 if (options & GraphemeBreaks)-
549 getGraphemeBreaks(string, length, attributes);-
550 if (options & WordBreaks)-
551 getWordBreaks(string, length, attributes);-
552 if (options & SentenceBreaks)-
553 getSentenceBreaks(string, length, attributes);-
554 if (options & LineBreaks)-
555 getLineBreaks(string, length, attributes);-
556 if (options & WhiteSpaces)-
557 getWhiteSpaces(string, length, attributes);-
558-
559 if (!qt_initcharattributes_default_algorithm_only) {-
560 if (!items || numItems <= 0)-
561 return;-
562-
563 QVarLengthArray<HB_ScriptItem, 64> scriptItems;-
564 scriptItems.reserve(numItems);-
565 int start = 0;-
566 HB_Script startScript = script_to_hbscript(items[start].script);-
567 if (__builtin_expect(!!(startScript == HB_Script_Inherited), false))-
568 startScript = HB_Script_Common;-
569 for (int i = start + 1; i < numItems; ++i) {-
570 HB_Script script = script_to_hbscript(items[i].script);-
571 if (__builtin_expect(!!(script == startScript || script == HB_Script_Inherited), true))-
572 continue;-
573 ((!(items[i].position > items[start].position)) ? qt_assert("items[i].position > items[start].position",__FILE__,647653) : qt_noop());-
574 HB_ScriptItem item;-
575 item.pos = items[start].position;-
576 item.length = items[i].position - items[start].position;-
577 item.script = startScript;-
578 item.bidiLevel = 0;-
579 scriptItems.append(item);-
580 start = i;-
581 startScript = script;-
582 }-
583 if (items[start].position + 1 < length) {-
584 HB_ScriptItem item;-
585 item.pos = items[start].position;-
586 item.length = length - items[start].position;-
587 item.script = startScript;-
588 item.bidiLevel = 0;-
589 scriptItems.append(item);-
590 }-
591 static_assert(bool(sizeof(QCharAttributes) == sizeof(HB_CharAttributes)), "sizeof(QCharAttributes) == sizeof(HB_CharAttributes)");-
592 HB_GetTailoredCharAttributes(string, length,-
593 scriptItems.constData(), scriptItems.size(),-
594 reinterpret_cast<HB_CharAttributes *>(attributes));-
595 }-
596}-
597__attribute__((visibility("default"))) void initScripts(const ushort *string, int length, uchar *scripts)-
598{-
599 int sor = 0;-
600 int eor = -10;-
601 uchar script = QChar::Script_Common;-
602-
603 for (int i = 0; i < length
i < lengthDescription
TRUEevaluated 6067506 times by 116 tests
Evaluated by:
  • tst_QAbstractButton
  • tst_QAbstractItemView
  • tst_QAbstractSpinBox
  • tst_QAbstractTextDocumentLayout
  • tst_QAccessibility
  • tst_QApplication
  • tst_QBoxLayout
  • tst_QButtonGroup
  • tst_QCalendarWidget
  • tst_QCheckBox
  • tst_QColorDialog
  • tst_QColumnView
  • tst_QComboBox
  • tst_QCommandLinkButton
  • tst_QCompleter
  • tst_QComplexText
  • tst_QDataWidgetMapper
  • tst_QDateTimeEdit
  • tst_QDialog
  • tst_QDialogButtonBox
  • tst_QDockWidget
  • tst_QDoubleSpinBox
  • tst_QErrorMessage
  • tst_QFileDialog2
  • tst_QFileSystemModel
  • ...
FALSEevaluated 257027 times by 116 tests
Evaluated by:
  • tst_QAbstractButton
  • tst_QAbstractItemView
  • tst_QAbstractSpinBox
  • tst_QAbstractTextDocumentLayout
  • tst_QAccessibility
  • tst_QApplication
  • tst_QBoxLayout
  • tst_QButtonGroup
  • tst_QCalendarWidget
  • tst_QCheckBox
  • tst_QColorDialog
  • tst_QColumnView
  • tst_QComboBox
  • tst_QCommandLinkButton
  • tst_QCompleter
  • tst_QComplexText
  • tst_QDataWidgetMapper
  • tst_QDateTimeEdit
  • tst_QDialog
  • tst_QDialogButtonBox
  • tst_QDockWidget
  • tst_QDoubleSpinBox
  • tst_QErrorMessage
  • tst_QFileDialog2
  • tst_QFileSystemModel
  • ...
; ++i) {, eor = i;) {
257027-6067506
604 uint ucs4 = string[i];-
605 if (QChar::isHighSurrogate(ucs4)
QChar::isHighSurrogate(ucs4)Description
TRUEevaluated 921 times by 2 tests
Evaluated by:
  • tst_QTextBoundaryFinder
  • tst_QTextLayout
FALSEevaluated 6066585 times by 116 tests
Evaluated by:
  • tst_QAbstractButton
  • tst_QAbstractItemView
  • tst_QAbstractSpinBox
  • tst_QAbstractTextDocumentLayout
  • tst_QAccessibility
  • tst_QApplication
  • tst_QBoxLayout
  • tst_QButtonGroup
  • tst_QCalendarWidget
  • tst_QCheckBox
  • tst_QColorDialog
  • tst_QColumnView
  • tst_QComboBox
  • tst_QCommandLinkButton
  • tst_QCompleter
  • tst_QComplexText
  • tst_QDataWidgetMapper
  • tst_QDateTimeEdit
  • tst_QDialog
  • tst_QDialogButtonBox
  • tst_QDockWidget
  • tst_QDoubleSpinBox
  • tst_QErrorMessage
  • tst_QFileDialog2
  • tst_QFileSystemModel
  • ...
&& i + 1 < length
i + 1 < lengthDescription
TRUEevaluated 893 times by 2 tests
Evaluated by:
  • tst_QTextBoundaryFinder
  • tst_QTextLayout
FALSEevaluated 28 times by 1 test
Evaluated by:
  • tst_QTextBoundaryFinder
) {
28-6066585
606 ushort low = string[i + 1];-
607 if (QChar::isLowSurrogate(low)
QChar::isLowSurrogate(low)Description
TRUEevaluated 865 times by 2 tests
Evaluated by:
  • tst_QTextBoundaryFinder
  • tst_QTextLayout
FALSEevaluated 28 times by 1 test
Evaluated by:
  • tst_QTextBoundaryFinder
) {
28-865
608 ucs4 = QChar::surrogateToUcs4(ucs4, low);-
609 ++i;-
610 }
executed 865 times by 2 tests: end of block
Executed by:
  • tst_QTextBoundaryFinder
  • tst_QTextLayout
865
611 }
executed 893 times by 2 tests: end of block
Executed by:
  • tst_QTextBoundaryFinder
  • tst_QTextLayout
893
612-
613 const QUnicodeTables::Properties *prop = QUnicodeTables::properties(ucs4);-
614-
615 uchar nscript = prop->script;-
616-
617 if (__builtin_expect(!!(prop->scriptnscript == script || prop->scriptnscript <= QChar::Script_InheritedScript_Common), true)
__builtin_expe...Common), true)Description
TRUEevaluated 5966042 times by 116 tests
Evaluated by:
  • tst_QAbstractButton
  • tst_QAbstractItemView
  • tst_QAbstractSpinBox
  • tst_QAbstractTextDocumentLayout
  • tst_QAccessibility
  • tst_QApplication
  • tst_QBoxLayout
  • tst_QButtonGroup
  • tst_QCalendarWidget
  • tst_QCheckBox
  • tst_QColorDialog
  • tst_QColumnView
  • tst_QComboBox
  • tst_QCommandLinkButton
  • tst_QCompleter
  • tst_QComplexText
  • tst_QDataWidgetMapper
  • tst_QDateTimeEdit
  • tst_QDialog
  • tst_QDialogButtonBox
  • tst_QDockWidget
  • tst_QDoubleSpinBox
  • tst_QErrorMessage
  • tst_QFileDialog2
  • tst_QFileSystemModel
  • ...
FALSEevaluated 101464 times by 112 tests
Evaluated by:
  • tst_QAbstractButton
  • tst_QAbstractItemView
  • tst_QAbstractTextDocumentLayout
  • tst_QAccessibility
  • tst_QApplication
  • tst_QBoxLayout
  • tst_QButtonGroup
  • tst_QCalendarWidget
  • tst_QCheckBox
  • tst_QColorDialog
  • tst_QColumnView
  • tst_QComboBox
  • tst_QCommandLinkButton
  • tst_QCompleter
  • tst_QComplexText
  • tst_QDataWidgetMapper
  • tst_QDateTimeEdit
  • tst_QDialog
  • tst_QDialogButtonBox
  • tst_QDockWidget
  • tst_QDoubleSpinBox
  • tst_QErrorMessage
  • tst_QFileDialog2
  • tst_QFileSystemModel
  • tst_QFiledialog
  • ...
)
101464-5966042
618 continue;
executed 5966042 times by 116 tests: continue;
Executed by:
  • tst_QAbstractButton
  • tst_QAbstractItemView
  • tst_QAbstractSpinBox
  • tst_QAbstractTextDocumentLayout
  • tst_QAccessibility
  • tst_QApplication
  • tst_QBoxLayout
  • tst_QButtonGroup
  • tst_QCalendarWidget
  • tst_QCheckBox
  • tst_QColorDialog
  • tst_QColumnView
  • tst_QComboBox
  • tst_QCommandLinkButton
  • tst_QCompleter
  • tst_QComplexText
  • tst_QDataWidgetMapper
  • tst_QDateTimeEdit
  • tst_QDialog
  • tst_QDialogButtonBox
  • tst_QDockWidget
  • tst_QDoubleSpinBox
  • tst_QErrorMessage
  • tst_QFileDialog2
  • tst_QFileSystemModel
  • ...
5966042
619-
620-
621 if (__builtin_expect(!!(script <= QChar::Script_Common), false
__builtin_expe...ommon), false)Description
TRUEevaluated 100737 times by 112 tests
Evaluated by:
  • tst_QAbstractButton
  • tst_QAbstractItemView
  • tst_QAbstractTextDocumentLayout
  • tst_QAccessibility
  • tst_QApplication
  • tst_QBoxLayout
  • tst_QButtonGroup
  • tst_QCalendarWidget
  • tst_QCheckBox
  • tst_QColorDialog
  • tst_QColumnView
  • tst_QComboBox
  • tst_QCommandLinkButton
  • tst_QCompleter
  • tst_QComplexText
  • tst_QDataWidgetMapper
  • tst_QDateTimeEdit
  • tst_QDialog
  • tst_QDialogButtonBox
  • tst_QDockWidget
  • tst_QDoubleSpinBox
  • tst_QErrorMessage
  • tst_QFileDialog2
  • tst_QFileSystemModel
  • tst_QFiledialog
  • ...
FALSEevaluated 727 times by 7 tests
Evaluated by:
  • tst_QComplexText
  • tst_QGlyphRun
  • tst_QLineEdit
  • tst_QStaticText
  • tst_QTextBoundaryFinder
  • tst_QTextEdit
  • tst_QTextLayout
__builtin_expe...ommon), false)Description
TRUEevaluated 100737 times by 112 tests
Evaluated by:
  • tst_QAbstractButton
  • tst_QAbstractItemView
  • tst_QAbstractTextDocumentLayout
  • tst_QAccessibility
  • tst_QApplication
  • tst_QBoxLayout
  • tst_QButtonGroup
  • tst_QCalendarWidget
  • tst_QCheckBox
  • tst_QColorDialog
  • tst_QColumnView
  • tst_QComboBox
  • tst_QCommandLinkButton
  • tst_QCompleter
  • tst_QComplexText
  • tst_QDataWidgetMapper
  • tst_QDateTimeEdit
  • tst_QDialog
  • tst_QDialogButtonBox
  • tst_QDockWidget
  • tst_QDoubleSpinBox
  • tst_QErrorMessage
  • tst_QFileDialog2
  • tst_QFileSystemModel
  • tst_QFiledialog
  • ...
FALSEevaluated 727 times by 7 tests
Evaluated by:
  • tst_QComplexText
  • tst_QGlyphRun
  • tst_QLineEdit
  • tst_QStaticText
  • tst_QTextBoundaryFinder
  • tst_QTextEdit
  • tst_QTextLayout
)
__builtin_expe...ommon), false)Description
TRUEevaluated 100737 times by 112 tests
Evaluated by:
  • tst_QAbstractButton
  • tst_QAbstractItemView
  • tst_QAbstractTextDocumentLayout
  • tst_QAccessibility
  • tst_QApplication
  • tst_QBoxLayout
  • tst_QButtonGroup
  • tst_QCalendarWidget
  • tst_QCheckBox
  • tst_QColorDialog
  • tst_QColumnView
  • tst_QComboBox
  • tst_QCommandLinkButton
  • tst_QCompleter
  • tst_QComplexText
  • tst_QDataWidgetMapper
  • tst_QDateTimeEdit
  • tst_QDialog
  • tst_QDialogButtonBox
  • tst_QDockWidget
  • tst_QDoubleSpinBox
  • tst_QErrorMessage
  • tst_QFileDialog2
  • tst_QFileSystemModel
  • tst_QFiledialog
  • ...
FALSEevaluated 727 times by 7 tests
Evaluated by:
  • tst_QComplexText
  • tst_QGlyphRun
  • tst_QLineEdit
  • tst_QStaticText
  • tst_QTextBoundaryFinder
  • tst_QTextEdit
  • tst_QTextLayout
) {
727-100737
622-
623-
624 script = nscript;-
625 continue;
executed 100737 times by 112 tests: continue;
Executed by:
  • tst_QAbstractButton
  • tst_QAbstractItemView
  • tst_QAbstractTextDocumentLayout
  • tst_QAccessibility
  • tst_QApplication
  • tst_QBoxLayout
  • tst_QButtonGroup
  • tst_QCalendarWidget
  • tst_QCheckBox
  • tst_QColorDialog
  • tst_QColumnView
  • tst_QComboBox
  • tst_QCommandLinkButton
  • tst_QCompleter
  • tst_QComplexText
  • tst_QDataWidgetMapper
  • tst_QDateTimeEdit
  • tst_QDialog
  • tst_QDialogButtonBox
  • tst_QDockWidget
  • tst_QDoubleSpinBox
  • tst_QErrorMessage
  • tst_QFileDialog2
  • tst_QFileSystemModel
  • tst_QFiledialog
  • ...
100737
626 }-
627-
628-
629-
630-
631 static const int test = ((1 << (QChar::Mark_NonSpacing)) | (1 << (QChar::Mark_SpacingCombining)) | (1 << (QChar::Mark_Enclosing)));-
632 if (__builtin_expect(!!((1 << (prop->category)) & test), false)
__builtin_expe... test), false)Description
TRUEevaluated 10 times by 1 test
Evaluated by:
  • tst_QTextBoundaryFinder
FALSEevaluated 717 times by 7 tests
Evaluated by:
  • tst_QComplexText
  • tst_QGlyphRun
  • tst_QLineEdit
  • tst_QStaticText
  • tst_QTextBoundaryFinder
  • tst_QTextEdit
  • tst_QTextLayout
)
10-717
633 {10
if (__builtin_expect(!!(continue;
executed 10 times by 1 test: continue;
Executed by:
  • tst_QTextBoundaryFinder
634-
635 ((!(script > QChar::Script_Common|| prop->script <=)) ? qt_assert("script > QChar::Script_Common), trueScript_Common",__FILE__,723) : qt_noop());-
636 ((!(sor < eor)) continue;-
script = QChar? qt_assert("sor < eor",__FILE__,724) : qt_noop());
637 ::Scriptmemset(prop->scripts + sor, script);-
}
while, (sor <eor - sor) scripts[* sizeof(uchar));
638 sor ++]= scripteor;-
639-
640 script = prop->scriptnscript;-
641 }
executed 717 times by 7 tests: end of block
Executed by:
  • tst_QComplexText
  • tst_QGlyphRun
  • tst_QLineEdit
  • tst_QStaticText
  • tst_QTextBoundaryFinder
  • tst_QTextEdit
  • tst_QTextLayout
717
642-
643 ((!(script >= QChar::Script_Common)) ? qt_assert("script >= QChar::Script_Common",__FILE__,731) : qt_noop());-
644 ((!(eor === length;-
while)) ? qt_assert(sor < eor"eor == length",__FILE__,732) : qt_noop());
645 ::memset(scripts [+ sor++] =, script;, (eor - sor) * sizeof(uchar));-
646}
executed 257027 times by 116 tests: end of block
Executed by:
  • tst_QAbstractButton
  • tst_QAbstractItemView
  • tst_QAbstractSpinBox
  • tst_QAbstractTextDocumentLayout
  • tst_QAccessibility
  • tst_QApplication
  • tst_QBoxLayout
  • tst_QButtonGroup
  • tst_QCalendarWidget
  • tst_QCheckBox
  • tst_QColorDialog
  • tst_QColumnView
  • tst_QComboBox
  • tst_QCommandLinkButton
  • tst_QCompleter
  • tst_QComplexText
  • tst_QDataWidgetMapper
  • tst_QDateTimeEdit
  • tst_QDialog
  • tst_QDialogButtonBox
  • tst_QDockWidget
  • tst_QDoubleSpinBox
  • tst_QErrorMessage
  • tst_QFileDialog2
  • tst_QFileSystemModel
  • ...
257027
647-
648}-
649-
650-
Switch to Source codePreprocessed file

Generated by Squish Coco Non-Commercial 4.3.0-BETA-master-30-08-2018-4cb69e9