/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the  "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#if !defined(XALANUNICODE_HEADER_GUARD_1357924680)
#define XALANUNICODE_HEADER_GUARD_1357924680



// Base include file.  Must be first.
#include <xalanc/PlatformSupport/PlatformSupportDefinitions.hpp>



namespace XALAN_CPP_NAMESPACE {



namespace XalanUnicode
{
    static const XalanDOMChar   charHTab                = 0x09;
    static const XalanDOMChar   charLF                  = 0x0A;
    static const XalanDOMChar   charCR                  = 0x0D;
    static const XalanDOMChar   charFF                  = 0x0C;
    static const XalanDOMChar   charSpace               = 0x20;

    static const XalanDOMChar   charExclamationMark     = 0x21;

    static const XalanDOMChar   charQuoteMark           = 0x22;

    static const XalanDOMChar   charNumberSign          = 0x23;

    static const XalanDOMChar   charDollarSign          = 0x24;

    static const XalanDOMChar   charPercentSign         = 0x25;

    static const XalanDOMChar   charAmpersand           = 0x26;

    static const XalanDOMChar   charApostrophe          = 0x27;

    static const XalanDOMChar   charLeftParenthesis     = 0x28;
    static const XalanDOMChar   charRightParenthesis    = 0x29;

    static const XalanDOMChar   charAsterisk            = 0x2A;

    static const XalanDOMChar   charPlusSign            = 0x2B;

    static const XalanDOMChar   charComma               = 0x2C;

    static const XalanDOMChar   charHyphenMinus         = 0x2D;

    static const XalanDOMChar   charFullStop            = 0x2E;

    static const XalanDOMChar   charSolidus             = 0x2F;

    static const XalanDOMChar   charDigit_0             = 0x30;
    static const XalanDOMChar   charDigit_1             = 0x31;
    static const XalanDOMChar   charDigit_2             = 0x32;
    static const XalanDOMChar   charDigit_3             = 0x33;
    static const XalanDOMChar   charDigit_4             = 0x34;
    static const XalanDOMChar   charDigit_5             = 0x35;
    static const XalanDOMChar   charDigit_6             = 0x36;
    static const XalanDOMChar   charDigit_7             = 0x37;
    static const XalanDOMChar   charDigit_8             = 0x38;
    static const XalanDOMChar   charDigit_9             = 0x39;

    static const XalanDOMChar   charColon               = 0x3A;
    static const XalanDOMChar   charSemicolon           = 0x3B;

    static const XalanDOMChar   charLessThanSign        = 0x3C;

    static const XalanDOMChar   charEqualsSign          = 0x3D;

    static const XalanDOMChar   charGreaterThanSign     = 0x3E;

    static const XalanDOMChar   charQuestionMark        = 0x3F;

    static const XalanDOMChar   charCommercialAt        = 0x40;

    static const XalanDOMChar   charLetter_A            = 0x41;
    static const XalanDOMChar   charLetter_B            = 0x42;
    static const XalanDOMChar   charLetter_C            = 0x43;
    static const XalanDOMChar   charLetter_D            = 0x44;
    static const XalanDOMChar   charLetter_E            = 0x45;
    static const XalanDOMChar   charLetter_F            = 0x46;
    static const XalanDOMChar   charLetter_G            = 0x47;
    static const XalanDOMChar   charLetter_H            = 0x48;
    static const XalanDOMChar   charLetter_I            = 0x49;
    static const XalanDOMChar   charLetter_J            = 0x4A;
    static const XalanDOMChar   charLetter_K            = 0x4B;
    static const XalanDOMChar   charLetter_L            = 0x4C;
    static const XalanDOMChar   charLetter_M            = 0x4D;
    static const XalanDOMChar   charLetter_N            = 0x4E;
    static const XalanDOMChar   charLetter_O            = 0x4F;
    static const XalanDOMChar   charLetter_P            = 0x50;
    static const XalanDOMChar   charLetter_Q            = 0x51;
    static const XalanDOMChar   charLetter_R            = 0x52;
    static const XalanDOMChar   charLetter_S            = 0x53;
    static const XalanDOMChar   charLetter_T            = 0x54;
    static const XalanDOMChar   charLetter_U            = 0x55;
    static const XalanDOMChar   charLetter_V            = 0x56;
    static const XalanDOMChar   charLetter_W            = 0x57;
    static const XalanDOMChar   charLetter_X            = 0x58;
    static const XalanDOMChar   charLetter_Y            = 0x59;
    static const XalanDOMChar   charLetter_Z            = 0x5A;

    static const XalanDOMChar   charLeftSquareBracket   = 0x5B;

    static const XalanDOMChar   charReverseSolidus      = 0x5C;

    static const XalanDOMChar   charRightSquareBracket  = 0x5D;

    static const XalanDOMChar   charCircumflexAccent    = 0x5E;

    static const XalanDOMChar   charLowLine             = 0x5F;
    static const XalanDOMChar   charGraveAccent         = 0x60;

    static const XalanDOMChar   charLetter_a            = 0x61;
    static const XalanDOMChar   charLetter_b            = 0x62;
    static const XalanDOMChar   charLetter_c            = 0x63;
    static const XalanDOMChar   charLetter_d            = 0x64;
    static const XalanDOMChar   charLetter_e            = 0x65;
    static const XalanDOMChar   charLetter_f            = 0x66;
    static const XalanDOMChar   charLetter_g            = 0x67;
    static const XalanDOMChar   charLetter_h            = 0x68;
    static const XalanDOMChar   charLetter_i            = 0x69;
    static const XalanDOMChar   charLetter_j            = 0x6A;
    static const XalanDOMChar   charLetter_k            = 0x6B;
    static const XalanDOMChar   charLetter_l            = 0x6C;
    static const XalanDOMChar   charLetter_m            = 0x6D;
    static const XalanDOMChar   charLetter_n            = 0x6E;
    static const XalanDOMChar   charLetter_o            = 0x6F;
    static const XalanDOMChar   charLetter_p            = 0x70;
    static const XalanDOMChar   charLetter_q            = 0x71;
    static const XalanDOMChar   charLetter_r            = 0x72;
    static const XalanDOMChar   charLetter_s            = 0x73;
    static const XalanDOMChar   charLetter_t            = 0x74;
    static const XalanDOMChar   charLetter_u            = 0x75;
    static const XalanDOMChar   charLetter_v            = 0x76;
    static const XalanDOMChar   charLetter_w            = 0x77;
    static const XalanDOMChar   charLetter_x            = 0x78;
    static const XalanDOMChar   charLetter_y            = 0x79;
    static const XalanDOMChar   charLetter_z            = 0x7A;

    static const XalanDOMChar   charLeftCurlyBracket    = 0x7B;

    static const XalanDOMChar   charVerticalLine        = 0x7C;

    static const XalanDOMChar   charRightCurlyBracket   = 0x7D;

    static const XalanDOMChar   charNEL                 = 0x85;

    static const XalanDOMChar   charLSEP                = 0x2028;

    static const XalanDOMChar   charPerMilleSign        = 0x2030;
}



}



#endif  // XALANUNICODE_HEADER_GUARD_1357924680
