i Implemented rendering of diacriticals.
[WebKit-https.git] / WebCore / kwq / KWQChar.mm
1 /*
2  * Copyright (C) 2001, 2002 Apple Computer, Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #import "KWQString.h"
27 #import "KWQLogging.h"
28 #import "WebCoreUnicode.h"
29
30 #import <Foundation/Foundation.h>
31
32 #import <CoreFoundation/CFBidi.h>
33
34
35 static UniChar scratchUniChar;
36
37 static CFMutableStringRef GetScratchUniCharString()
38 {
39     static CFMutableStringRef s = NULL;
40     if (!s)
41         s = CFStringCreateMutableWithExternalCharactersNoCopy(kCFAllocatorDefault, &scratchUniChar, 1, 1, kCFAllocatorNull);
42     return s;
43 }
44
45 const QChar QChar::null;
46
47 bool QChar::isSpace() const
48 {
49     // Without this first quick case, this function was showing up in profiles.
50     if (c <= 0x7F) {
51         return isspace(c);
52     }
53     static CFCharacterSetRef set = CFCharacterSetGetPredefined(kCFCharacterSetWhitespaceAndNewline);
54     return CFCharacterSetIsCharacterMember(set, c);
55 }
56
57 bool QChar::isDigit() const
58 {
59     static CFCharacterSetRef set = CFCharacterSetGetPredefined(kCFCharacterSetDecimalDigit);
60     return CFCharacterSetIsCharacterMember(set, c);
61 }
62
63 bool QChar::isLetter() const
64 {
65     static CFCharacterSetRef set = CFCharacterSetGetPredefined(kCFCharacterSetLetter);
66     return CFCharacterSetIsCharacterMember(set, c);
67 }
68
69 bool QChar::isNumber() const
70 {
71     return isLetterOrNumber() && !isLetter();
72 }
73
74 bool QChar::isLetterOrNumber() const
75 {
76     static CFCharacterSetRef set = CFCharacterSetGetPredefined(kCFCharacterSetAlphaNumeric);
77     return CFCharacterSetIsCharacterMember(set, c);
78 }
79
80 bool QChar::isPunct() const
81 {
82     static CFCharacterSetRef set = CFCharacterSetGetPredefined(kCFCharacterSetPunctuation);
83     return CFCharacterSetIsCharacterMember(set, c);
84 }
85
86 QChar QChar::lower() const
87 {
88     // Without this first quick case, this function was showing up in profiles.
89     if (c <= 0x7F) {
90         return (char)tolower(c);
91     }
92     scratchUniChar = c;
93     CFStringLowercase(GetScratchUniCharString(), NULL);
94     return scratchUniChar;
95 }
96
97 QChar QChar::upper() const
98 {
99     // Without this first quick case, this function was showing up in profiles.
100     if (c <= 0x7F) {
101         return (char)toupper(c);
102     }
103     scratchUniChar = c;
104     CFStringUppercase(GetScratchUniCharString(), NULL);
105     return scratchUniChar;
106 }
107
108 QChar::Direction QChar::direction() const
109 {
110     return (QChar::Direction)WebCoreUnicodeDirectionFunction(c);
111 }
112
113 bool QChar::mirrored() const
114 {
115     return WebCoreUnicodeMirroredFunction(c);
116 }
117
118 QChar QChar::mirroredChar() const
119 {
120     return QChar(WebCoreUnicodeMirroredCharFunction(c));
121 }
122
123 int QChar::digitValue() const
124 {
125     if (c < '0' || c > '9')
126         return -1;
127     else
128         return c - '0';
129 }