/*
 * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code 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 General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

package com.sun.tools.doclint;

import java.util.HashMap;
import java.util.Map;

/**
 * Table of entities defined in HTML 4.01.
 *
 * <p> Derived from
 * <a href="http://www.w3.org/TR/html4/sgml/entities.html">Character entity references in HTML 4</a>.
 *
 * The name of the member follows the name of the entity,
 * except when it clashes with a keyword, in which case
 * it is prefixed by '_'.
 *
 * <p><b>This is NOT part of any supported API.
 * If you write code that depends on this, you do so at your own
 * risk.  This code and its internal interfaces are subject to change
 * or deletion without notice.</b></p>
 */
public enum Entity {
    nbsp(160),
    iexcl(161),
    cent(162),
    pound(163),
    curren(164),
    yen(165),
    brvbar(166),
    sect(167),
    uml(168),
    copy(169),
    ordf(170),
    laquo(171),
    not(172),
    shy(173),
    reg(174),
    macr(175),
    deg(176),
    plusmn(177),
    sup2(178),
    sup3(179),
    acute(180),
    micro(181),
    para(182),
    middot(183),
    cedil(184),
    sup1(185),
    ordm(186),
    raquo(187),
    frac14(188),
    frac12(189),
    frac34(190),
    iquest(191),
    Agrave(192),
    Aacute(193),
    Acirc(194),
    Atilde(195),
    Auml(196),
    Aring(197),
    AElig(198),
    Ccedil(199),
    Egrave(200),
    Eacute(201),
    Ecirc(202),
    Euml(203),
    Igrave(204),
    Iacute(205),
    Icirc(206),
    Iuml(207),
    ETH(208),
    Ntilde(209),
    Ograve(210),
    Oacute(211),
    Ocirc(212),
    Otilde(213),
    Ouml(214),
    times(215),
    Oslash(216),
    Ugrave(217),
    Uacute(218),
    Ucirc(219),
    Uuml(220),
    Yacute(221),
    THORN(222),
    szlig(223),
    agrave(224),
    aacute(225),
    acirc(226),
    atilde(227),
    auml(228),
    aring(229),
    aelig(230),
    ccedil(231),
    egrave(232),
    eacute(233),
    ecirc(234),
    euml(235),
    igrave(236),
    iacute(237),
    icirc(238),
    iuml(239),
    eth(240),
    ntilde(241),
    ograve(242),
    oacute(243),
    ocirc(244),
    otilde(245),
    ouml(246),
    divide(247),
    oslash(248),
    ugrave(249),
    uacute(250),
    ucirc(251),
    uuml(252),
    yacute(253),
    thorn(254),
    yuml(255),
    fnof(402),
    Alpha(913),
    Beta(914),
    Gamma(915),
    Delta(916),
    Epsilon(917),
    Zeta(918),
    Eta(919),
    Theta(920),
    Iota(921),
    Kappa(922),
    Lambda(923),
    Mu(924),
    Nu(925),
    Xi(926),
    Omicron(927),
    Pi(928),
    Rho(929),
    Sigma(931),
    Tau(932),
    Upsilon(933),
    Phi(934),
    Chi(935),
    Psi(936),
    Omega(937),
    alpha(945),
    beta(946),
    gamma(947),
    delta(948),
    epsilon(949),
    zeta(950),
    eta(951),
    theta(952),
    iota(953),
    kappa(954),
    lambda(955),
    mu(956),
    nu(957),
    xi(958),
    omicron(959),
    pi(960),
    rho(961),
    sigmaf(962),
    sigma(963),
    tau(964),
    upsilon(965),
    phi(966),
    chi(967),
    psi(968),
    omega(969),
    thetasym(977),
    upsih(978),
    piv(982),
    bull(8226),
    hellip(8230),
    prime(8242),
    Prime(8243),
    oline(8254),
    frasl(8260),
    weierp(8472),
    image(8465),
    real(8476),
    trade(8482),
    alefsym(8501),
    larr(8592),
    uarr(8593),
    rarr(8594),
    darr(8595),
    harr(8596),
    crarr(8629),
    lArr(8656),
    uArr(8657),
    rArr(8658),
    dArr(8659),
    hArr(8660),
    forall(8704),
    part(8706),
    exist(8707),
    empty(8709),
    nabla(8711),
    isin(8712),
    notin(8713),
    ni(8715),
    prod(8719),
    sum(8721),
    minus(8722),
    lowast(8727),
    radic(8730),
    prop(8733),
    infin(8734),
    ang(8736),
    and(8743),
    or(8744),
    cap(8745),
    cup(8746),
    _int(8747),
    there4(8756),
    sim(8764),
    cong(8773),
    asymp(8776),
    ne(8800),
    equiv(8801),
    le(8804),
    ge(8805),
    sub(8834),
    sup(8835),
    nsub(8836),
    sube(8838),
    supe(8839),
    oplus(8853),
    otimes(8855),
    perp(8869),
    sdot(8901),
    lceil(8968),
    rceil(8969),
    lfloor(8970),
    rfloor(8971),
    lang(9001),
    rang(9002),
    loz(9674),
    spades(9824),
    clubs(9827),
    hearts(9829),
    diams(9830),
    quot(34),
    amp(38),
    lt(60),
    gt(62),
    OElig(338),
    oelig(339),
    Scaron(352),
    scaron(353),
    Yuml(376),
    circ(710),
    tilde(732),
    ensp(8194),
    emsp(8195),
    thinsp(8201),
    zwnj(8204),
    zwj(8205),
    lrm(8206),
    rlm(8207),
    ndash(8211),
    mdash(8212),
    lsquo(8216),
    rsquo(8217),
    sbquo(8218),
    ldquo(8220),
    rdquo(8221),
    bdquo(8222),
    dagger(8224),
    Dagger(8225),
    permil(8240),
    lsaquo(8249),
    rsaquo(8250),
    euro(8364);

    public final int code;

    private Entity(int code) {
        this.code = code;
    }

    public static boolean isValid(String name) {
        return names.containsKey(name);
    }

    public static Entity get(String name) {
        return names.get(name);
    }

    public static boolean isValid(int code) {
        // allow numeric codes for standard ANSI characters
        return codes.containsKey(code) || ( 32 <= code && code < 2127);
    }

    private static final Map<String,Entity> names = new HashMap<>();
    private static final Map<Integer,Entity> codes = new HashMap<>();
    static {
        for (Entity e: values()) {
            String name = e.name();
            int code = e.code;
            if (name.startsWith("_")) name = name.substring(1);
            names.put(name, e);
            codes.put(code, e);
        }
    }
}
