blob: 10c2026c5faf879b45250859c7231e52fef09430 [file] [log] [blame]
/*
* Copyright (C) 2012 Patrick Gansterer <paroga@paroga.com>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef WTF_UnicodeWchar_h
#define WTF_UnicodeWchar_h
#include <stdint.h>
#include <wchar.h>
#include <wtf/unicode/ScriptCodesFromICU.h>
#include <wtf/unicode/UnicodeMacrosFromICU.h>
typedef wchar_t UChar;
typedef uint32_t UChar32;
namespace WTF {
namespace Unicode {
enum Direction {
LeftToRight,
RightToLeft,
EuropeanNumber,
EuropeanNumberSeparator,
EuropeanNumberTerminator,
ArabicNumber,
CommonNumberSeparator,
BlockSeparator,
SegmentSeparator,
WhiteSpaceNeutral,
OtherNeutral,
LeftToRightEmbedding,
LeftToRightOverride,
RightToLeftArabic,
RightToLeftEmbedding,
RightToLeftOverride,
PopDirectionalFormat,
NonSpacingMark,
BoundaryNeutral
};
enum DecompositionType {
DecompositionNone,
DecompositionCanonical,
DecompositionCompat,
DecompositionCircle,
DecompositionFinal,
DecompositionFont,
DecompositionFraction,
DecompositionInitial,
DecompositionIsolated,
DecompositionMedial,
DecompositionNarrow,
DecompositionNoBreak,
DecompositionSmall,
DecompositionSquare,
DecompositionSub,
DecompositionSuper,
DecompositionVertical,
DecompositionWide
};
enum CharCategory {
NoCategory = 0,
Other_NotAssigned = U_MASK(0),
Letter_Uppercase = U_MASK(1),
Letter_Lowercase = U_MASK(2),
Letter_Titlecase = U_MASK(3),
Letter_Modifier = U_MASK(4),
Letter_Other = U_MASK(5),
Mark_NonSpacing = U_MASK(6),
Mark_Enclosing = U_MASK(7),
Mark_SpacingCombining = U_MASK(8),
Number_DecimalDigit = U_MASK(9),
Number_Letter = U_MASK(10),
Number_Other = U_MASK(11),
Separator_Space = U_MASK(12),
Separator_Line = U_MASK(13),
Separator_Paragraph = U_MASK(14),
Other_Control = U_MASK(15),
Other_Format = U_MASK(16),
Other_PrivateUse = U_MASK(17),
Other_Surrogate = U_MASK(18),
Punctuation_Dash = U_MASK(19),
Punctuation_Open = U_MASK(20),
Punctuation_Close = U_MASK(21),
Punctuation_Connector = U_MASK(22),
Punctuation_Other = U_MASK(23),
Symbol_Math = U_MASK(24),
Symbol_Currency = U_MASK(25),
Symbol_Modifier = U_MASK(26),
Symbol_Other = U_MASK(27),
Punctuation_InitialQuote = U_MASK(28),
Punctuation_FinalQuote = U_MASK(29)
};
WTF_EXPORT_PRIVATE CharCategory category(UChar32);
WTF_EXPORT_PRIVATE unsigned char combiningClass(UChar32);
WTF_EXPORT_PRIVATE Direction direction(UChar32);
WTF_EXPORT_PRIVATE DecompositionType decompositionType(UChar32);
WTF_EXPORT_PRIVATE bool hasLineBreakingPropertyComplexContext(UChar32);
WTF_EXPORT_PRIVATE UChar32 mirroredChar(UChar32);
inline bool isAlphanumeric(UChar c) { return !!iswalnum(c); }
inline bool isDigit(UChar c) { return !!iswdigit(c); }
inline bool isLetter(UChar c) { return !!iswalpha(c); }
inline bool isLower(UChar c) { return !!iswlower(c); }
inline bool isPrintableChar(UChar c) { return !!iswprint(c); }
inline bool isPunct(UChar c) { return !!iswpunct(c); }
inline bool isSpace(UChar c) { return !!iswspace(c); }
inline bool isUpper(UChar c) { return !!iswupper(c); }
inline bool isArabicChar(UChar32 c) { return c >= 0x0600 && c <= 0x06ff; }
inline bool isSeparatorSpace(UChar32 c) { return category(c) == Separator_Space; }
inline UChar foldCase(UChar c) { return towlower(c); }
inline UChar toLower(UChar c) { return towlower(c); }
inline UChar toUpper(UChar c) { return towupper(c); }
inline UChar toTitleCase(UChar c) { return towupper(c); }
WTF_EXPORT_PRIVATE int foldCase(UChar* result, int resultLength, const UChar* source, int sourceLength, bool* isError);
WTF_EXPORT_PRIVATE int toLower(UChar* result, int resultLength, const UChar* source, int sourceLength, bool* isError);
WTF_EXPORT_PRIVATE int toUpper(UChar* result, int resultLength, const UChar* source, int sourceLength, bool* isError);
inline int umemcasecmp(const UChar* a, const UChar* b, int len)
{
for (int i = 0; i < len; ++i) {
UChar c1 = foldCase(a[i]);
UChar c2 = foldCase(b[i]);
if (c1 != c2)
return c1 - c2;
}
return 0;
}
} // namespace Unicode
} // namespace WTF
#endif // WTF_UnicodeWchar_h