1187469Sed/*-
2187469Sed * Copyright (c) 2009 Ed Schouten <ed@FreeBSD.org>
3187469Sed * All rights reserved.
4187469Sed *
5187469Sed * Redistribution and use in source and binary forms, with or without
6187469Sed * modification, are permitted provided that the following conditions
7187469Sed * are met:
8187469Sed * 1. Redistributions of source code must retain the above copyright
9187469Sed *    notice, this list of conditions and the following disclaimer.
10187469Sed * 2. Redistributions in binary form must reproduce the above copyright
11187469Sed *    notice, this list of conditions and the following disclaimer in the
12187469Sed *    documentation and/or other materials provided with the distribution.
13187469Sed *
14187469Sed * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15187469Sed * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16187469Sed * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17187469Sed * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18187469Sed * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19187469Sed * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20187469Sed * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21187469Sed * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22187469Sed * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23187469Sed * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24187469Sed * SUCH DAMAGE.
25187469Sed *
26187469Sed * $FreeBSD$
27187469Sed */
28187469Sed
29197520Sedstatic inline teken_char_t
30187469Sedteken_scs_process(teken_t *t, teken_char_t c)
31187469Sed{
32187469Sed
33197470Sed	return (t->t_scs[t->t_curscs](t, c));
34187469Sed}
35187469Sed
36187469Sed/* Unicode points for VT100 box drawing. */
37197470Sedstatic const uint16_t teken_boxdrawing_unicode[31] = {
38187469Sed    0x25c6, 0x2592, 0x2409, 0x240c, 0x240d, 0x240a, 0x00b0, 0x00b1,
39187469Sed    0x2424, 0x240b, 0x2518, 0x2510, 0x250c, 0x2514, 0x253c, 0x23ba,
40187469Sed    0x23bb, 0x2500, 0x23bc, 0x23bd, 0x251c, 0x2524, 0x2534, 0x252c,
41187469Sed    0x2502, 0x2264, 0x2265, 0x03c0, 0x2260, 0x00a3, 0x00b7
42187469Sed};
43187469Sed
44203659Sed/* ASCII points for VT100 box drawing. */
45197470Sedstatic const uint8_t teken_boxdrawing_8bit[31] = {
46203659Sed    '?', '?', 'H', 'F', 'C', 'L', '?', '?',
47203659Sed    'N', 'V', '+', '+', '+', '+', '+', '-',
48203659Sed    '-', '-', '-', '-', '+', '+', '+', '+',
49203659Sed    '|', '?', '?', '?', '?', '?', '?',
50197470Sed};
51197470Sed
52187469Sedstatic teken_char_t
53197470Sedteken_scs_special_graphics(teken_t *t, teken_char_t c)
54187469Sed{
55187469Sed
56187469Sed	/* Box drawing. */
57187469Sed	if (c >= '`' && c <= '~')
58197470Sed		return (t->t_stateflags & TS_8BIT ?
59197470Sed		    teken_boxdrawing_8bit[c - '`'] :
60197470Sed		    teken_boxdrawing_unicode[c - '`']);
61187469Sed	return (c);
62187469Sed}
63187469Sed
64187469Sedstatic teken_char_t
65197470Sedteken_scs_uk_national(teken_t *t, teken_char_t c)
66187469Sed{
67187469Sed
68187469Sed	/* Pound sign. */
69187469Sed	if (c == '#')
70197470Sed		return (t->t_stateflags & TS_8BIT ? 0x9c : 0xa3);
71187469Sed	return (c);
72187469Sed}
73187469Sed
74187469Sedstatic teken_char_t
75197471Sedteken_scs_us_ascii(teken_t *t __unused, teken_char_t c)
76187469Sed{
77187469Sed
78187469Sed	/* No processing. */
79187469Sed	return (c);
80187469Sed}
81