/*
 *  Copyright (C) 2006 George Staikos <staikos@kde.org>
 *  Copyright (C) 2006 Alexey Proskuryakov <ap@nypop.com>
 *  Copyright (C) 2007 Apple Computer, Inc. All rights reserved.
 *  Copyright (C) 2008 Jürg Billeter <j@bitron.ch>
 *  Copyright (C) 2008 Dominik Röttsches <dominik.roettsches@access-company.com>
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Library General Public
 *  License as published by the Free Software Foundation; either
 *  version 2 of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Library General Public License for more details.
 *
 *  You should have received a copy of the GNU Library General Public License
 *  along with this library; see the file COPYING.LIB.  If not, write to
 *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 *  Boston, MA 02110-1301, USA.
 *
 */

#ifndef UnicodeGLib_h
#define UnicodeGLib_h

#include "UnicodeMacrosFromICU.h"
#include "GOwnPtr.h"

#include <glib.h>
#include <pango/pango.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

typedef uint16_t UChar;
typedef int32_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(G_UNICODE_UNASSIGNED),
    Letter_Uppercase = U_MASK(G_UNICODE_UPPERCASE_LETTER),
    Letter_Lowercase = U_MASK(G_UNICODE_LOWERCASE_LETTER),
    Letter_Titlecase = U_MASK(G_UNICODE_TITLECASE_LETTER),
    Letter_Modifier = U_MASK(G_UNICODE_MODIFIER_LETTER),
    Letter_Other = U_MASK(G_UNICODE_OTHER_LETTER),

    Mark_NonSpacing = U_MASK(G_UNICODE_NON_SPACING_MARK),
    Mark_Enclosing = U_MASK(G_UNICODE_ENCLOSING_MARK),
    Mark_SpacingCombining = U_MASK(G_UNICODE_COMBINING_MARK),

    Number_DecimalDigit = U_MASK(G_UNICODE_DECIMAL_NUMBER),
    Number_Letter = U_MASK(G_UNICODE_LETTER_NUMBER),
    Number_Other = U_MASK(G_UNICODE_OTHER_NUMBER),

    Separator_Space = U_MASK(G_UNICODE_SPACE_SEPARATOR),
    Separator_Line = U_MASK(G_UNICODE_LINE_SEPARATOR),
    Separator_Paragraph = U_MASK(G_UNICODE_PARAGRAPH_SEPARATOR),

    Other_Control = U_MASK(G_UNICODE_CONTROL),
    Other_Format = U_MASK(G_UNICODE_FORMAT),
    Other_PrivateUse = U_MASK(G_UNICODE_PRIVATE_USE),
    Other_Surrogate = U_MASK(G_UNICODE_SURROGATE),

    Punctuation_Dash = U_MASK(G_UNICODE_DASH_PUNCTUATION),
    Punctuation_Open = U_MASK(G_UNICODE_OPEN_PUNCTUATION),
    Punctuation_Close = U_MASK(G_UNICODE_CLOSE_PUNCTUATION),
    Punctuation_Connector = U_MASK(G_UNICODE_CONNECT_PUNCTUATION),
    Punctuation_Other = U_MASK(G_UNICODE_OTHER_PUNCTUATION),

    Symbol_Math = U_MASK(G_UNICODE_MATH_SYMBOL),
    Symbol_Currency = U_MASK(G_UNICODE_CURRENCY_SYMBOL),
    Symbol_Modifier = U_MASK(G_UNICODE_MODIFIER_SYMBOL),
    Symbol_Other = U_MASK(G_UNICODE_OTHER_SYMBOL),

    Punctuation_InitialQuote = U_MASK(G_UNICODE_INITIAL_PUNCTUATION),
    Punctuation_FinalQuote = U_MASK(G_UNICODE_FINAL_PUNCTUATION)
};

UChar32 foldCase(UChar32);

int foldCase(UChar* result, int resultLength, const UChar* src, int srcLength, bool* error);

int toLower(UChar* result, int resultLength, const UChar* src, int srcLength, bool* error);

inline UChar32 toLower(UChar32 c)
{
    return g_unichar_tolower(c);
}

inline UChar32 toUpper(UChar32 c)
{
    return g_unichar_toupper(c);
}

int toUpper(UChar* result, int resultLength, const UChar* src, int srcLength, bool* error);

inline UChar32 toTitleCase(UChar32 c)
{
    return g_unichar_totitle(c);
}

inline bool isArabicChar(UChar32 c)
{
    return c >= 0x0600 && c <= 0x06FF;
}

inline bool isAlphanumeric(UChar32 c)
{
    return g_unichar_isalnum(c);
}

inline bool isFormatChar(UChar32 c)
{
    return g_unichar_type(c) == G_UNICODE_FORMAT;
}

inline bool isSeparatorSpace(UChar32 c)
{
    return g_unichar_type(c) == G_UNICODE_SPACE_SEPARATOR;
}

inline bool isPrintableChar(UChar32 c)
{
    return g_unichar_isprint(c);
}

inline bool isDigit(UChar32 c)
{
    return g_unichar_isdigit(c);
}

inline bool isPunct(UChar32 c)
{
    return g_unichar_ispunct(c);
}

inline bool hasLineBreakingPropertyComplexContext(UChar32 c)
{
    // FIXME
    return false;
}

inline bool hasLineBreakingPropertyComplexContextOrIdeographic(UChar32 c)
{
    // FIXME
    return false;
}

inline UChar32 mirroredChar(UChar32 c)
{
    gunichar mirror = 0;
    g_unichar_get_mirror_char(c, &mirror);
    return mirror;
}

inline CharCategory category(UChar32 c)
{
    if (c > 0xffff)
        return NoCategory;

    return (CharCategory) U_MASK(g_unichar_type(c));
}

Direction direction(UChar32);

inline bool isLower(UChar32 c)
{
    return g_unichar_islower(c);
}

inline int digitValue(UChar32 c)
{
    return g_unichar_digit_value(c);
}

inline uint8_t combiningClass(UChar32 c)
{
    // FIXME
    // return g_unichar_combining_class(c);
    return 0;
}

inline DecompositionType decompositionType(UChar32 c)
{
    // FIXME
    return DecompositionNone;
}

int umemcasecmp(const UChar*, const UChar*, int len);

}
}

#endif

