package com.jediterm.terminal.emulator.charset; /** * Provides the (graphical) character sets. */ public final class CharacterSets { private static final int C0_START = 0; private static final int C0_END = 31; private static final int C1_START = 128; private static final int C1_END = 159; private static final int GL_START = 32; private static final int GL_END = 127; private static final int GR_START = 160; private static final int GR_END = 255; public static final String[] ASCII_NAMES = {"<nul>", "<soh>", "<stx>", "<etx>", "<eot>", "<enq>", "<ack>", "<bell>", "\b", "\t", "\n", "<vt>", "<ff>", "\r", "<so>", "<si>", "<dle>", "<dc1>", "<dc2>", "<dc3>", "<dc4>", "<nak>", "<syn>", "<etb>", "<can>", "<em>", "<sub>", "<esc>", "<fs>", "<gs>", "<rs>", "<us>", " ", "!", "\"", "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "<del>"}; /** * Denotes the mapping for C0 characters. */ public final static Object[][] C0_CHARS = {{0, "nul"}, // {0, "soh"}, // {0, "stx"}, // {0, "etx"}, // {0, "eot"}, // {0, "enq"}, // {0, "ack"}, // {0, "bel"}, // {(int) '\b', "bs"}, // {(int) '\t', "ht"}, // {(int) '\n', "lf"}, // {0, "vt"}, // {0, "ff"}, // {(int) '\r', "cr"}, // {0, "so"}, // {0, "si"}, // {0, "dle"}, // {0, "dc1"}, // {0, "dc2"}, // {0, "dc3"}, // {0, "dc4"}, // {0, "nak"}, // {0, "syn"}, // {0, "etb"}, // {0, "can"}, // {0, "em"}, // {0, "sub"}, // {0, "esq"}, // {0, "fs"}, // {0, "gs"}, // {0, "rs"}, // {0, "us"}}; /** * Denotes the mapping for C1 characters. */ public static final Object[][] C1_CHARS = {{0, null}, // {0, null}, // {0, null}, // {0, null}, // {0, "ind"}, // {0, "nel"}, // {0, "ssa"}, // {0, "esa"}, // {0, "hts"}, // {0, "htj"}, // {0, "vts"}, // {0, "pld"}, // {0, "plu"}, // {0, "ri"}, // {0, "ss2"}, // {0, "ss3"}, // {0, "dcs"}, // {0, "pu1"}, // {0, "pu2"}, // {0, "sts"}, // {0, "cch"}, // {0, "mw"}, // {0, "spa"}, // {0, "epa"}, // {0, null}, // {0, null}, // {0, null}, // {0, "csi"}, // {0, "st"}, // {0, "osc"}, // {0, "pm"}, // {0, "apc"}}; /** * The DEC special characters (only the last 32 characters). * Contains [light][heavy] flavors for box drawing */ public static final Object[][] DEC_SPECIAL_CHARS = {{'\u25c6', null}, // black_diamond {'\u2592', null}, // Medium Shade {'\u2409', null}, // Horizontal tab (HT) {'\u240c', null}, // Form Feed (FF) {'\u240d', null}, // Carriage Return (CR) {'\u240a', null}, // Line Feed (LF) {'\u00b0', null}, // Degree sign {'\u00b1', null}, // Plus/minus sign {'\u2424', null}, // New Line (NL) {'\u240b', null}, // Vertical Tab (VT) {'\u2518', '\u251b'}, // Forms up and left {'\u2510', '\u2513'}, // Forms down and left {'\u250c', '\u250f'}, // Forms down and right {'\u2514', '\u2517'}, // Forms up and right {'\u253c', '\u254b'}, // Forms vertical and horizontal {'\u23ba', null}, // Scan 1 {'\u23bb', null}, // Scan 3 {'\u2500', '\u2501'}, // Scan 5 / Horizontal bar {'\u23bc', null}, // Scan 7 {'\u23bd', null}, // Scan 9 {'\u251c', '\u2523'}, // Forms vertical and right {'\u2524', '\u252b'}, // Forms vertical and left {'\u2534', '\u253b'}, // Forms up and horizontal {'\u252c', '\u2533'}, // Forms down and horizontal {'\u2502', '\u2503'}, // vertical bar {'\u2264', null}, // less than or equal sign {'\u2265', null}, // greater than or equal sign {'\u03c0', null}, // pi {'\u2260', null}, // not equal sign {'\u00a3', null}, // pound sign {'\u00b7', null}, // middle dot {' ', null}, // }; public static boolean isDecSpecialChar(char c) { for (Object[] o : DEC_SPECIAL_CHARS) { if (c == (Character) o[0]) { return true; } } return false; } public static char getHeavyDecSpecialChar(char c) { for (Object[] o : DEC_SPECIAL_CHARS) { if (c == (Character) o[0]) { return o[1] != null ? (Character) o[1] : c; } } return c; } /** * Creates a new {@link CharacterSets} instance, never used. */ private CharacterSets() { // Nop } // METHODS /** * Returns the character mapping for a given original value using the given * graphic sets GL and GR. * * @param original the original character to map; * @param gl the GL graphic set, cannot be <code>null</code>; * @param gr the GR graphic set, cannot be <code>null</code>. * @return the mapped character. */ public static char getChar(char original, GraphicSet gl, GraphicSet gr) { Object[] mapping = getMapping(original, gl, gr); int ch = (Integer) mapping[0]; if (ch > 0) { return (char)ch; } return ' '; } /** * Returns the name for the given character using the given graphic sets GL * and GR. * * @param original the original character to return the name for; * @param gl the GL graphic set, cannot be <code>null</code>; * @param gr the GR graphic set, cannot be <code>null</code>. * @return the character name. */ public static String getCharName(char original, GraphicSet gl, GraphicSet gr) { Object[] mapping = getMapping(original, gl, gr); String name = (String)mapping[1]; if (name == null) { name = String.format("<%d>", (int)original); } return name; } /** * Returns the mapping for a given character using the given graphic sets GL * and GR. * * @param original the original character to map; * @param gl the GL graphic set, cannot be <code>null</code>; * @param gr the GR graphic set, cannot be <code>null</code>. * @return the mapped character. */ private static Object[] getMapping(char original, GraphicSet gl, GraphicSet gr) { int mappedChar = original; if (original >= C0_START && original <= C0_END) { int idx = original - C0_START; return C0_CHARS[idx]; } else if (original >= C1_START && original <= C1_END) { int idx = original - C1_START; return C1_CHARS[idx]; } else if (original >= GL_START && original <= GL_END) { int idx = original - GL_START; mappedChar = gl.map(original, idx); } //To support UTF-8 we don't use GR table //TODO: verify that approach //else if (original >= GR_START && original <= GR_END) { // int idx = original - GR_START; // mappedChar = gr.map(original, idx); //} return new Object[]{mappedChar, null}; } }