summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvi2tty/dvi2tty-src
diff options
context:
space:
mode:
authorTakuji Tanaka <KXD02663@nifty.ne.jp>2016-03-05 08:53:28 +0000
committerTakuji Tanaka <KXD02663@nifty.ne.jp>2016-03-05 08:53:28 +0000
commitc7c20e7f52f7f0b5a903a039c91274cb05ca9b83 (patch)
tree7c25fbc3f80e6b1081ebef7f75366ef0f36b8a9f /Build/source/texk/dvi2tty/dvi2tty-src
parent7c7c985a2e338faf2f18ed1bb1201fc248fb595a (diff)
texk/dvi2tty: dvi2tty-6.0.0
git-svn-id: svn://tug.org/texlive/trunk@39942 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/dvi2tty/dvi2tty-src')
-rw-r--r--Build/source/texk/dvi2tty/dvi2tty-src/COPYING2
-rw-r--r--Build/source/texk/dvi2tty/dvi2tty-src/Changelog6
-rw-r--r--Build/source/texk/dvi2tty/dvi2tty-src/README2
-rw-r--r--Build/source/texk/dvi2tty/dvi2tty-src/dvi2tty.c32
-rw-r--r--Build/source/texk/dvi2tty/dvi2tty-src/dvi2tty.h7
-rw-r--r--Build/source/texk/dvi2tty/dvi2tty-src/dvi2tty.tex9
-rw-r--r--Build/source/texk/dvi2tty/dvi2tty-src/dvistuff.c1257
-rw-r--r--Build/source/texk/dvi2tty/dvi2tty-src/test/table.tex343
-rw-r--r--Build/source/texk/dvi2tty/dvi2tty-src/tex2ucs.h338
9 files changed, 1824 insertions, 172 deletions
diff --git a/Build/source/texk/dvi2tty/dvi2tty-src/COPYING b/Build/source/texk/dvi2tty/dvi2tty-src/COPYING
index 520e7de1d76..04eb7775758 100644
--- a/Build/source/texk/dvi2tty/dvi2tty-src/COPYING
+++ b/Build/source/texk/dvi2tty/dvi2tty-src/COPYING
@@ -1,5 +1,5 @@
dvi2tty
-Copyright (C) 1989-2003 many, including Marcel J.E. Mol <marcel@mesa.nl>
+Copyright (C) 1989-2016 many, including Marcel J.E. Mol <marcel@mesa.nl>
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
diff --git a/Build/source/texk/dvi2tty/dvi2tty-src/Changelog b/Build/source/texk/dvi2tty/dvi2tty-src/Changelog
index c218d592c5a..cd5bed4f917 100644
--- a/Build/source/texk/dvi2tty/dvi2tty-src/Changelog
+++ b/Build/source/texk/dvi2tty/dvi2tty-src/Changelog
@@ -1,4 +1,10 @@
/******************************************************************************
+ * Takuji Tanaka: 20160305 (ttk@t-lab.opal.ne.jp)
+ * Version 6.0.0
+ * Supported T1,TS1,OT2,T2A,T2B,T2C,X2 encodings.
+ * Added utf8 output for the latin, cyrillic encodings and
+ * OML,OMS encodings.
+ * Added option -C not to compose a combining character sequence.
* Takuji Tanaka: 20111119 (KXD02663@nifty.ne.jp)
* Used ptexenc library for Japanese TeX.
* Enabled UTF8 output for Japanese TeX with option -Eu.
diff --git a/Build/source/texk/dvi2tty/dvi2tty-src/README b/Build/source/texk/dvi2tty/dvi2tty-src/README
index 266aa9de1a7..d63f0a7ab17 100644
--- a/Build/source/texk/dvi2tty/dvi2tty-src/README
+++ b/Build/source/texk/dvi2tty/dvi2tty-src/README
@@ -53,7 +53,7 @@ at Paypal marcel@mesa.nl. Thanks
#########################################
# Marcel J.E. Mol #
# #
-# MESA Consulting +31-(0)6-54724868 #
+# MESA Consulting #
# email: marcel@mesa.nl #
# The Netherlands #
# #
diff --git a/Build/source/texk/dvi2tty/dvi2tty-src/dvi2tty.c b/Build/source/texk/dvi2tty/dvi2tty-src/dvi2tty.c
index 2868d90f365..ab44c38e16b 100644
--- a/Build/source/texk/dvi2tty/dvi2tty-src/dvi2tty.c
+++ b/Build/source/texk/dvi2tty/dvi2tty-src/dvi2tty.c
@@ -58,10 +58,10 @@
/*------------------ end of customization constants ---------------------*/
#if defined(MSDOS) || defined(VMS) || defined(AMIGA)
-#define OPTSET "haJweEpPousltvbcANU" /* legal options */
+#define OPTSET "haJweEpPousltvbcANUC" /* legal options */
#define OPTWARG "weEpPovb" /* options with argument */
#else
-#define OPTSET "haJweEpPousqlfFtvbcANU" /* legal options */
+#define OPTSET "haJweEpPousqlfFtvbcANUC" /* legal options */
#define OPTWARG "weEpPoFvb" /* options with argument */
#endif
@@ -79,8 +79,9 @@
#define onepp 8 /* only one page list allowed */
#define noarg 9 /* argument expected */
#define confl 10 /* -J, -N, -A, and -U conflict */
+#define incone 11 /* inconsistent output encoding */
#if defined(THINK_C)
-#define nored 11 /* if no input file, redirect stdin */
+#define nored 100 /* if no input file, redirect stdin */
#endif
@@ -88,7 +89,7 @@
* Variable definitions
*/
-const char *dvi2tty = "@(#) dvi2tty.c " VERSION " 20101030 M.J.E. Mol (c) 1989-2010";
+const char *dvi2tty = "@(#) dvi2tty.c " VERSION " 20160305 M.J.E. Mol (c) 1989-2010, and contributors (c) -2016";
printlisttype * currentpage; /* current page to print */
@@ -267,10 +268,13 @@ void getargs(void)
noffd = FALSE; /* print formfeed between pages */
scascii = DEFSCAND; /* scandinavian, compile time option */
latin1 = DEFLATIN1; /* latin1 support, compile time option */
+ utf8 = FALSE; /* print by utf encoding */
+ noligaturefi = FALSE; /* do not use ligature for ff,fi,fl,ffi,ffl */
ttywidth = 80; /* default terminal width */
espace = 0; /* to fake ttywith calcs */
DVIfound = FALSE;
printfont = FALSE; /* do not print font switches */
+ compose = TRUE; /* try to compose a combining character sequence */
allchar = FALSE; /* do not put out all characters */
#if !defined(MSDOS) && !defined(VMS) && !defined(THINK_C) && !defined(AMIGA)
@@ -418,7 +422,12 @@ void setoption(const char *optarg)
case 'j' :
set_enc_string ("jis", NULL); break;
case 'u' :
- set_enc_string ("utf8", NULL); break;
+ utf8 = TRUE;
+ set_enc_string ("utf8", NULL);
+ if (optarg[1]=='1') {
+ noligaturefi = TRUE; j++;
+ }
+ break;
default :
usage(noarg);
}
@@ -429,6 +438,7 @@ void setoption(const char *optarg)
case 's' : scascii ^= 1; break;
case 'u' : latin1 ^= 1; break;
case 'a' : accent = FALSE; break;
+ case 'C' : compose = FALSE; break;
case 'c' : allchar = TRUE; break;
case 'P' : sequenceon = TRUE; /* fall through */
case 'p' : if (pageswitchon)
@@ -481,6 +491,11 @@ void setoption(const char *optarg)
(jautodetect && (nttj || asciip || uptex))) {
usage(confl);
}
+ if (((jautodetect || asciip || uptex || nttj || utf8)
+ && (scascii || latin1)) ||
+ (scascii && latin1)) {
+ usage(incone);
+ }
return;
@@ -787,6 +802,8 @@ void usage(int uerr)
break;
case confl : fprintf(stderr, "-J, -N, -A, and -U are mutually exclusive");
break;
+ case incone : fprintf(stderr, "output encoding is not consistent");
+ break;
#if defined(THINK_C)
case nored : fprintf(stderr, "\nIf no input file is given in\
command string,\n\Standard Input must be redirected with the radio button.");
@@ -851,7 +868,10 @@ void usage(int uerr)
fprintf(stderr,
" -U Support upTeX dvi.\n");
fprintf(stderr,
- " -Eenc Output Japanese encoding. e:EUC s:SJIS j:JIS, u:UTF8.\n");
+ " -Eenc Output multibyte encoding. u:UTF8, e:EUC-JP s:Shift_JIS j:JIS\n"
+ " u1:UTF8 (do not use ligature for ff,fi,fl,ffi,ffl).\n");
+ fprintf(stderr,
+ " -C Don't try to compose a combining character sequence.\n");
fprintf(stderr,
" -c Override -a -u -s and print all characters 0-255.\n");
fprintf(stderr,
diff --git a/Build/source/texk/dvi2tty/dvi2tty-src/dvi2tty.h b/Build/source/texk/dvi2tty/dvi2tty-src/dvi2tty.h
index e905156300e..c77eaa56c77 100644
--- a/Build/source/texk/dvi2tty/dvi2tty-src/dvi2tty.h
+++ b/Build/source/texk/dvi2tty/dvi2tty-src/dvi2tty.h
@@ -18,7 +18,7 @@
*
*/
-#define VERSION "5.3.4"
+#define VERSION "6.0.0"
#define Progname "dvi2tty"
#define Copyright "Copyright (C) 1984, 1985, 1986 Svante Lindahl.\n\
@@ -123,6 +123,8 @@ extern bool pageswitchon; /* user-set pages to print(dvistuff.c)*/
extern bool sequenceon; /* not TeX pagenrs (dvistuff.c) */
extern bool scascii; /* Scand. nat. chars (dvistuff.c) */
extern bool latin1; /* latin1 chars (dvistuff.c) */
+extern bool utf8; /* print by utf8 encoding (dvistuff.c) */
+extern bool noligaturefi; /* do not use ligature for ff,fi,fl,ffi,ffl (dvistuff.c) */
extern bool accent; /* Output accent stuff(dvistuff.c) */
extern bool ttfont; /* tt font assumed (dvistuff.c) */
extern bool jautodetect; /* Autodetect NTT jTeX, ASCII pTeX and upTeX (dvistuff.c) */
@@ -132,7 +134,8 @@ extern bool uptex; /* upTeX font support (dvistuff.c) */
extern bool japan; /* japanized TeX font support (dvistuff.c) */
extern bool noffd; /* output ^L or formfeed (dvistuff.c) */
extern bool printfont; /* include font switches (dvistuff.c) */
-extern bool allchar; /* output all characters (dvistuff.c */
+extern bool compose; /* try to compose a combining character sequence (dvistuff.c) */
+extern bool allchar; /* output all characters (dvistuff.c) */
extern printlisttype *currentpage; /* current page to print (dvi2tty.c) */
extern printlisttype *firstpage; /* first page selected (dvi2tty.c) */
diff --git a/Build/source/texk/dvi2tty/dvi2tty-src/dvi2tty.tex b/Build/source/texk/dvi2tty/dvi2tty-src/dvi2tty.tex
index 5687d5e013c..606d6b42f64 100644
--- a/Build/source/texk/dvi2tty/dvi2tty-src/dvi2tty.tex
+++ b/Build/source/texk/dvi2tty/dvi2tty-src/dvi2tty.tex
@@ -177,9 +177,13 @@ terminal into this mode as output will probably look somewhat better.
\item[{{\bf -l}}]
Mark page breaks with the two-character sequence ``\^{}L''. The default is
to mark them with a form feed character.
+\item[{{\bf -a}}]
+Remove accents grave etc. from output.
\item[{{\bf -c}}]
Do not attempt to trnaslate any characters (like the Scandinavion mode)
except when running in tt-font.
+\item[{{\bf -C}}]
+Do not attempt to compose a combining character sequence.
\item[{{\bf -bdelim}}]
Print the name of fonts when switching to it (and ending it). The delim
argument is used to delimit the fontname.
@@ -200,8 +204,9 @@ Display ASCII pTeX dvi.
\item[{{\bf -U}}]
Display upTeX dvi.
\item[{{\bf -Eenc}}]
-Set output Japanese encoding. The enc argument 'e', 's', 'j', and 'u'
-denotes EUC-JP, Shift\_JIS, ISO-2022-JP, and UTF-8, respectively.
+Set output multibyte encoding. The enc argument 'e', 's', 'j', 'u', and 'u1'
+denotes EUC-JP, Shift\_JIS, ISO-2022-JP, UTF-8,
+and UTF-8 (do not use ligature for ff, fi, fl, ffi, ffl), respectively.
\end{list}
%
% NOTE --- No other files are used under VMS.
diff --git a/Build/source/texk/dvi2tty/dvi2tty-src/dvistuff.c b/Build/source/texk/dvi2tty/dvi2tty-src/dvistuff.c
index 91d1f2d4c81..ec05239ef18 100644
--- a/Build/source/texk/dvi2tty/dvi2tty-src/dvistuff.c
+++ b/Build/source/texk/dvi2tty/dvi2tty-src/dvistuff.c
@@ -41,7 +41,7 @@
#endif
#include "commands.h"
-
+#include "tex2ucs.h"
/*
@@ -74,6 +74,10 @@
#define DEL 127 /* delete */
#define LASTCHAR 127 /* max dvi character, above are commands */
+#define LASTCHAR8B 255
+
+#define IS_UNICODE 0x400000 /* flag for unicode */
+#define MAX_UNICODE 0x10FFFF /* max unicode */
#define IMIN(a, b) (a<b ? a : b)
#define IMAX(a, b) (a>b ? a : b)
@@ -108,28 +112,38 @@ typedef struct lineptr { /* the lines of text to be output to outfile */
int charactercount; /* pos of last char on line */
struct lineptr *prev; /* preceding line */
struct lineptr *next; /* succeeding line */
- unsigned char text[LINELEN+1]; /* leftmargin...rightmargin */
+ long text[LINELEN+1]; /* leftmargin...rightmargin */
} linetype;
typedef struct _font {
long num;
struct _font * next;
char * name;
- char flags; /* to store font types, to get rid of nttj/asciip/uptex/ttfont/symbolfon/mifont vars */
+ unsigned char flags; /* to store font encoding types */
int fontnum; /* helper for japanese fonts */
+ bool is8bit; /* 8bit fonts */
} font;
-#define SYMFONT 0x01
-#define TTFONT 0x02
-#define MIFONT 0x04
-#define JAPFONT 0x08
-#define JASCFONT 0x10
+#define TTFONT 0x01
+#define SYMFONT 0x02
+#define MIFONT 0x03
+#define T1FONT 0x04
+#define TS1FONT 0x05
+#define OT2FONT 0x10
+#define T2AFONT 0x11
+#define T2BFONT 0x12
+#define T2CFONT 0x13
+#define X2FONT 0x14
+#define JPFONT 0x80
+
bool pageswitchon; /* true if user-set pages to print */
bool sequenceon; /* false if pagesw-nrs refers to TeX-nrs */
bool scascii; /* if true make Scand. nat. chars right */
bool latin1; /* if true make latin1 chars right */
+bool utf8; /* if true print by utf8 encoding */
+bool noligaturefi; /* if true do not use ligature for ff,fi,fl,ffi,ffl */
bool accent; /* if true output accents etc: \'{e} etc. */
bool ttfont = FALSE; /* if true we assumed ttfonts, not cmr */
bool symbolfont = FALSE; /* true if font is a symbol font */
@@ -140,9 +154,11 @@ bool japan = FALSE; /* switch to NTT/ASCII/.. japanese fonts ... */
bool jautodetect = FALSE; /* switch if do auto detection of Japanese TeX */
bool jdetect = FALSE; /* switch if Japanese TeX detection is done */
bool mifont = FALSE; /* ASCII japanese font ??? */
+bool is8bit = FALSE; /* true if 8bit encoding font */
bool noffd; /* if true output ^L instead of formfeed */
const char *delim; /* -bdelim for font switch printing */
bool printfont; /* true if user wants font switches printed */
+bool compose; /* if true try to compose a combining character sequence */
bool allchar; /* true if user sets all characters */
/* overrides sscasci, accent */
@@ -199,14 +215,20 @@ unsigned long num (int);
long snum (int);
void dochar (unsigned char);
void symchar (unsigned char);
-void normchar (unsigned char);
-void outchar (unsigned char);
+void michar (unsigned char);
+void normchar (char, unsigned char);
+void t1char (unsigned char);
+void ts1char (unsigned char);
+void ot2char (unsigned char);
+void t2char (char, unsigned char);
+void outchar (long);
void putcharacter (long);
void setchar (long);
void fontdef (int);
void setfont (long);
void jischar (unsigned long);
int compute_jis (int, unsigned int, unsigned int *, unsigned int *);
+void dounichar (long);
void dokanji (long);
int getjsubfont (char *);
@@ -229,14 +251,20 @@ unsigned long num (int size);
long snum (int size);
void dochar (unsigned char ch);
void symchar (unsigned char ch);
-void normchar (unsigned char ch);
-void outchar (unsigned char ch);
+void michar (unsigned char ch);
+void normchar (char flag, unsigned char ch);
+void t1char (unsigned char ch);
+void ts1char (unsigned char ch);
+void ot2char (unsigned char ch);
+void t2char (char flag, unsigned char ch);
+void outchar (long ch);
void putcharacter (long charnr);
void setchar (long charnr);
void fontdef (int x);
void setfont (long fntnum);
void jischar (unsigned long ch);
void compute_jis (int f, unsigned int c, unsigned int * ku, unsigned int * ten);
+void dounichar (long ch);
void dokanji (long ch);
int getjsubfont (char * s);
#if defined(VMS)
@@ -609,7 +637,7 @@ void skippage(void)
void printpage(void)
{
register int i, j, k;
- register unsigned char ch;
+ register long ch, mbch;
unsigned char buff[4];
if (sptr != 0)
@@ -629,7 +657,7 @@ void printpage(void)
i++, j++) {
ch = currentline->text[i - leftmargin];
- if (japan) {
+ if (japan && !(ch & IS_UNICODE)) {
if (ch > 127) {
for (k = 0; k < 4; k++) {
if (i - leftmargin + k < LINELEN+1)
@@ -650,7 +678,14 @@ void printpage(void)
}
if (ch >= SPACE || allchar) {
- if (japan) {
+ if (utf8 && (ch & IS_UNICODE)) {
+ mbch = UCStoUTF8(ch & MAX_UNICODE);
+ if (BYTE1(mbch) != 0) putc((unsigned char)BYTE1(mbch), output);
+ if (BYTE2(mbch) != 0) putc((unsigned char)BYTE2(mbch), output);
+ if (BYTE3(mbch) != 0) putc((unsigned char)BYTE3(mbch), output);
+ /* always */ putc((unsigned char)BYTE4(mbch), output);
+ }
+ else if (japan) {
for (k = 0; k < kanji1; k++) {
putc2(ch, output);
i++; j++;
@@ -961,22 +996,53 @@ long snum(int size)
/*
+ * DOUNICHAR -- Process a Unicode character
+ */
+
+void dounichar(long ch)
+{
+ unsigned char c[4] = {}, *cc;
+
+ if (noligaturefi && 0xFB00<=ch && ch<=0xFB04) {
+ switch (ch) {
+ case 0xFB00: strcpy(c,"ff"); break;
+ case 0xFB01: strcpy(c,"fi"); break;
+ case 0xFB02: strcpy(c,"fl"); break;
+ case 0xFB03: strcpy(c,"ffi"); break;
+ case 0xFB04: strcpy(c,"ffl"); break;
+ }
+ cc=c;
+ while (*cc) { outchar(*cc); cc++; }
+ return;
+ }
+ if (ch>0x7F)
+ outchar((long)(ch | IS_UNICODE));
+ else {
+ outchar((long)ch);
+ }
+
+ return;
+
+} /* dounichar */
+
+
+/*
* DOKANJI -- Process a kanji character opcode.
*/
void dokanji(long ch)
{
long i;
-
i = toBUFF(fromDVI(ch));
+
kanji1 = 3;
- if (BYTE1(i) != 0) outchar((unsigned char)BYTE1(i));
+ if (BYTE1(i) != 0) outchar((long)BYTE1(i));
kanji1 = 2;
- if (BYTE2(i) != 0) outchar((unsigned char)BYTE2(i));
+ if (BYTE2(i) != 0) outchar((long)BYTE2(i));
kanji1 = 1;
- /* always */ outchar((unsigned char)BYTE3(i));
+ if (BYTE3(i) != 0) outchar((long)BYTE3(i));
kanji1 = 0;
- /* always */ outchar((unsigned char)BYTE4(i));
+ /* always */ outchar((long)BYTE4(i));
return;
@@ -990,13 +1056,26 @@ void dokanji(long ch)
void dochar(unsigned char ch)
{
+ char flag;
+ flag = fnt->flags;
if (nttj && fnt->fontnum)
jischar((long) ch);
- else if (symbolfont == TRUE)
+ else if (symbolfont)
symchar(ch);
+ else if (mifont)
+ michar(ch);
+ else if (flag == T1FONT)
+ t1char(ch);
+ else if (flag == TS1FONT)
+ ts1char(ch);
+ else if (flag == OT2FONT)
+ ot2char(ch);
+ else if (flag == T2AFONT || flag == T2BFONT ||
+ flag == T2CFONT || flag == X2FONT)
+ t2char(flag, ch);
else
- normchar(ch);
+ normchar(flag, ch);
return;
@@ -1010,27 +1089,62 @@ void dochar(unsigned char ch)
void symchar(unsigned char ch)
{
+ unsigned char c[4] = {}, *cc;
+ long ucs;
+
+ ucs = oms_to_ucs[ch];
+ if (utf8) {
+ dounichar(ucs);
+ return;
+ }
+ else if ((latin1 && ucs<0x100) || ucs<0x80) {
+ outchar(ucs);
+ return;
+ }
switch (ch) { /* can do a lot more on MSDOS/latin1/unicode machines ... */
- case 0: ch = '-'; break;
- case 1: ch = '.'; break;
- case 2: ch = 'x'; break;
- case 3: ch = '*'; break;
- case 13: ch = 'O'; break;
- case 14: ch = 'O'; break;
- case 15: ch = 'o'; break;
- case 24: ch = '~'; break;
- case 32: ch = nttj ? '<' : 32; break; /* really only for japan? */
- case 33: ch = nttj ? '>' : 33; break; /* really only for japan? */
- case 102: ch = '{'; break;
- case 103: ch = '}'; break;
- case 104: ch = '<'; break;
- case 105: ch = '>'; break;
- case 106: ch = '|'; break;
- case 110: ch = '\\'; break;
- }
-
- outchar(ch);
+ case 0: c[0] = '-'; break;
+ case 1: c[0] = '.'; break;
+ case 2: c[0] = 'x'; break;
+ case 3: c[0] = '*'; break;
+ case 4: c[0] = '/'; break;
+ case 6: c[0] = '+'; c[1] = '-'; break;
+ case 7: c[0] = '-'; c[1] = '+'; break;
+ case 13: c[0] = 'O'; break;
+ case 14: c[0] = 'O'; break;
+ case 15: c[0] = 'o'; break;
+ case 24: c[0] = '~'; break;
+ case 28: c[0] = '<'; c[1] = '<'; break;
+ case 29: c[0] = '>'; c[1] = '>'; break;
+ case 32: c[0] = '<'; c[1] = '-'; break;
+ case 33: c[0] = '-'; c[1] = '>'; break;
+ case 34: c[0] = '^'; break;
+ case 35: c[0] = 'v'; break;
+ case 36: c[0] = '<'; c[1] = '-'; c[2] = '>'; break;
+ case 40: c[0] = '<'; c[1] = '='; break;
+ case 41: c[0] = '='; c[1] = '>'; break;
+ case 42: c[0] = '^'; break;
+ case 43: c[0] = 'v'; break;
+ case 44: c[0] = '<'; c[1] = '='; c[2] = '>'; break;
+ case 60: c[0] = 'R'; c[1] = 'e'; break;
+ case 61: c[0] = 'I'; c[1] = 'm'; break;
+ case 102: c[0] = '{'; break;
+ case 103: c[0] = '}'; break;
+ case 104: c[0] = '<'; break;
+ case 105: c[0] = '>'; break;
+ case 106: c[0] = '|'; break;
+ case 107: c[0] = '|'; c[1] = '|'; break;
+ case 110: c[0] = '\\'; break;
+ case 120: c[0] = 'S'; break;
+ case 121: c[0] = '*'; break;
+ case 122: c[0] = '*'; c[1] = '*'; break;
+ case 123: c[0] = 'P'; break;
+
+ default: c[0] = '#';
+ }
+
+ cc=c;
+ while (*cc) { outchar(*cc); cc++; }
return;
@@ -1039,136 +1153,824 @@ void symchar(unsigned char ch)
/*
+ * MICHAR -- Process a character opcode for OML font.
+ */
+
+void michar(unsigned char ch)
+{
+ unsigned char c[4] = {}, *cc;
+ long ucs;
+
+ if (allchar) {
+ outchar(ch);
+ return;
+ }
+ ucs = oml_to_ucs[ch];
+ if (utf8) {
+ dounichar(ucs);
+ return;
+ }
+ else if ((latin1 && ucs<0x100) || ucs<0x80) {
+ outchar(ucs);
+ return;
+ }
+
+ switch (ch) {
+ case 0x3a: c[0] = '.'; break; /* . */
+ case 0x3b: c[0] = ','; break; /* , */
+ case 0x3d: c[0] = '/'; break; /* / */
+ case 0x3e: c[0] = '*'; break; /* \star */
+ case 0x40: c[0] = 'd'; break; /* \partial */
+ case 0x60: c[0] = 'l'; break; /* \ell */
+ case 0x7b: c[0] = 'i'; break; /* dotless i */
+ case 0x7c: c[0] = 'j'; break; /* dotless j */
+ case 0x7d: c[0] = 'P'; break; /* \wp */
+
+ default : c[0] = '#';
+ }
+
+ cc=c;
+ while (*cc) { outchar(*cc); cc++; }
+
+ return;
+
+} /* michar */
+
+
+/*
* NORMCHAR -- Process a character opcode for a normal font.
*/
-void normchar(unsigned char ch)
+void normchar(char flag, unsigned char ch)
{
+ unsigned char c[4] = {}, *cc;
+ const unsigned short *tex_to_ucs;
+ long ucs;
+
+ if (allchar) {
+ outchar(ch);
+ return;
+ }
+ if (!accent) {
+ switch (ch) {
+ case 18 : /* grave from \` */
+ case 19 : /* acute from \' */
+ case 20 : /* caron from \v */
+ case 21 : /* breve from \u */
+ case 22 : /* macron from \= */
+ case 23 : /* ring above from \r */
+ case 24 : /* cedilla from \c */
+ case 32 : /* stroke i.e. \L,\l */
+ case 94 : /* circumflex from \^ */
+ case 126 : /* tilde from \~ */
+ case 127 : /* diaeresis from \" */
+ return;
+ case 125 : /* double acute from \H */
+ case 95 : /* dot from \. */
+ if (!ttfont) return;
+ }
+ }
+ switch (flag) {
+ case TTFONT : tex_to_ucs=tt_to_ucs; break;
+ default : tex_to_ucs=ot1_to_ucs;
+ }
+ ucs = tex_to_ucs[ch];
+ if (utf8) {
+ dounichar(ucs);
+ return;
+ }
+ else if ((latin1 && ucs<0x100) || ucs<0x80) {
+ outchar(ucs);
+ return;
+ }
switch (ch) {
case 11 : if (ttfont)
- ch = '^'; /* up symbol */
- else if (!allchar) {
- outchar('f'); ch = 'f'; /* ligature */
+ c[0] = '^'; /* up symbol */
+ else {
+ c[0] = 'f'; c[1] = 'f'; /* ligature */
}
break;
case 12 : if (ttfont)
- ch = 'v'; /* low symbol */
- else if (!allchar) {
- outchar('f'); ch = 'i'; /* ligature */
+ c[0] = 'v'; /* low symbol */
+ else {
+ c[0] = 'f'; c[1] = 'i'; /* ligature */
}
break;
case 13 : if (ttfont)
- ch = '`';
- else if (!allchar) {
- outchar('f'); ch = 'l'; /* ligature */
+ c[0] = '`';
+ else {
+ c[0] = 'f'; c[1] = 'l'; /* ligature */
}
break;
case 14 : if (ttfont)
- ch = 'i'; /* spanish ! */
- else if (!allchar) {
- outchar('f'); outchar('f');
- ch = 'i'; /* ligature */
+ c[0] = 'i'; /* spanish ! */
+ else {
+ c[0] = 'f'; c[1] = 'f';
+ c[2] = 'i'; /* ligature */
}
break;
case 15 : if (ttfont)
- ch = '.'; /* spanish ? */
- else if (!allchar) {
- outchar('f'); outchar('f');
- ch = 'l'; /* ligature */
+ c[0] = '.'; /* spanish ? */
+ else {
+ c[0] = 'f'; c[1] = 'f';
+ c[2] = 'l'; /* ligature */
}
break;
- case 16 : if (!allchar) ch = 'i'; break;
- case 17 : if (!allchar) ch = 'j'; break;
- case 25 : if (!allchar) {
- if (latin1) {
- ch = 0xdf;
- }
- else {
- outchar('s');
- ch = 's';
- }
+ case 16 : c[0] = 'i'; break;
+ case 17 : c[0] = 'j'; break;
+ case 25 : if (latin1)
+ c[0] = 0xdf;
+ else {
+ c[0] = 's'; c[1] = 's';
}
break; /* German double s */
- case 26 : if (!allchar) {
- if (latin1) {
- ch = 0xe6;
- }
- else {
- outchar('a');
- ch = 'e';
- }
+ case 26 : if (latin1)
+ c[0] = 0xe6;
+ else {
+ c[0] = 'a'; c[1] = 'e';
}
break; /* Dane/Norw ae */
- case 27 : if (!allchar) {
- outchar('o');
- ch = 'e';
- }
+ case 27 : c[0] = 'o'; c[1] = 'e';
break; /* Dane/Norw oe */
- case 28 : if (!allchar) {
- if (scascii)
- ch = '|';
- else if (latin1)
- ch = 0xf8;
- else
- ch = 'o';
- }
+ case 28 : if (scascii)
+ c[0] = '|';
+ else if (latin1)
+ c[0] = 0xf8;
+ else
+ c[0] = 'o';
break; /* Dane/Norw /o */
- case 29 : if (!allchar) {
- if (latin1) {
- ch = 0xc6;
- }
- else {
- outchar('A');
- ch = 'E';
- }
+ case 29 : if (latin1)
+ c[0] = 0xc6;
+ else {
+ c[0] = 'A'; c[1] = 'E';
}
break; /* Dane/Norw AE */
- case 30 : if (!allchar) {
- outchar('O');
- ch = 'E';
+ case 30 : c[0] = 'O'; c[1] = 'E';
+ break; /* Dane/Norw OE */
+ case 31 : if (scascii)
+ c[0] = '\\';
+ else if (latin1)
+ c[0] = 0xd8;
+ else
+ c[0] = 'O';
+ break; /* Dane/Norw /O */
+ case 60 : if (ttfont)
+ c[0] = ch; /* '>' */
+ else if (latin1)
+ c[0] = 0xa1;
+ else
+ c[0] = '!';
+ break; /* inverted ! */
+ case 62 : if (ttfont)
+ c[0] = ch; /* '<' */
+ else if (latin1)
+ c[0] = 0xbf;
+ else
+ c[0] = '?';
+ break; /* inverted ? */
+ case 32 : c[0] = ttfont ? ch : '_'; break; /* underlined blank */
+ case 92 : c[0] = ttfont ? ch : '"'; break; /* \ from `` */
+ case 123 : if (ttfont)
+ c[0] = ch; /* { */
+ else {
+ c[0] = '-'; c[1] = '-'; /* -- */
+ }
+ break;
+ case 124 : if (ttfont)
+ c[0] = ch; /* | */
+ else {
+ c[0] = '-'; c[1] = '-'; /* --- */
+ c[2] = '-';
}
+ break;
+ case 125 : if (ttfont)
+ c[0] = ch; /* } */
+ else
+ c[0] = '"'; /* double acute from \H */
+ break;
+ case 34 : /* " */
+ case 39 : /* ' */
+ case 96 : c[0] = ch; break; /* ` */
+
+ /* diacritical marks */
+ case 18 : c[0] = '`' ; break; /* grave from \` */
+ case 19 : c[0] = latin1 ? 0xb4 : '\''; break;
+ /* acute from \' */
+ case 20 : c[0] = '~' ; break; /* caron from \v */
+ case 21 : c[0] = '~' ; break; /* breve from \u */
+ case 22 : c[0] = '~' ; break; /* macron from \= */
+ case 23 : c[0] = latin1 ? 0xb0 : '~'; break;
+ /* ring above from \r */
+ case 24 : c[0] = latin1 ? 0xb8 : ','; break;
+ /* cedilla from \c */
+ case 94 : c[0] = '^' ; break; /* circumflex from \^ */
+ case 95 : c[0] = !ttfont ? '.' : ch; break;
+ /* dot from \. */
+ case 126 : c[0] = '~' ; break; /* tilde from \~ */
+ case 127 : c[0] = '"' ; break; /* diaeresis from \" */
+
+ default : c[0] = '#';
+ }
+
+ cc=c;
+ while (*cc) { outchar(*cc); cc++; }
+
+ return;
+
+} /* normchar */
+
+
+/*
+ * T1CHAR -- Process a character opcode for a T1 encoding font.
+ */
+
+void t1char(unsigned char ch)
+{
+ unsigned char c[4] = {}, *cc;
+ long ucs;
+
+ if (allchar) {
+ outchar(ch);
+ return;
+ }
+ if (!accent) {
+ switch (ch) {
+ case 0x00: /* grave from \` */
+ case 0x01: /* acute from \' */
+ case 0x02: /* circumflex from \^ */
+ case 0x03: /* tilde from \~ */
+ case 0x04: /* diaeresis from \" */
+ case 0x05: /* double acute from \H */
+ case 0x06: /* ring above from \r */
+ case 0x07: /* caron from \v */
+ case 0x08: /* breve from \u */
+ case 0x09: /* macron from \= */
+ case 0x0a: /* dot from \. */
+ case 0x0b: /* cedilla from \c */
+ case 0x0c: /* ogonek from \k */
+ return;
+ }
+ }
+ if (ch==0xdf) {
+ outchar('S'); outchar('S'); /* SS */
+ return;
+ }
+ ucs = t1_to_ucs[ch];
+ if (utf8) {
+ dounichar(ucs);
+ return;
+ }
+ else if ((latin1 && ucs<0x100) || ucs<0x80) {
+ outchar(ucs);
+ return;
+ }
+
+ switch (ch) {
+ case 0x17: return; /* \textcompwordmark */
+ case 0x0d: /* \quotesinglbase */
+ case 0x27: /* \textquoteright */
+ case 0x60: c[0] = '\''; break; /* \textquoteleft */
+ case 0x10: /* \textquotedblleft */
+ case 0x11: /* \textquotedblright */
+ case 0x12: c[0] = '"'; break; /* \quotedblbase */
+ case 0x0e: c[0] = '<'; break; /* \guilsinglleft */
+ case 0x0f: c[0] = '>'; break; /* \guilsinglright */
+ case 0x13: c[0] = '<'; c[1] = '<'; /* \guillemotleft */
+ break;
+ case 0x14: c[0] = '>'; c[1] = '>'; /* \guillemotright */
+ break;
+ case 0x15: c[0] = '-'; c[1] = '-'; /* \textendash */
+ break;
+ case 0x16: c[0] = '-'; c[1] = '-'; /* \textemdash */
+ c[2] = '-'; break;
+ case 0x20: c[0] = '_'; break; /* \textvisiblespace */
+ case 0x7f: c[0] = '-'; break; /* - */
+ case 0x19: c[0] = 'i'; break; /* dotless i */
+ case 0x1a: c[0] = 'j'; break; /* dotless j */
+ case 0x1b: c[0] = 'f'; c[1] = 'f'; /* ligature */
+ break;
+ case 0x1c: c[0] = 'f'; c[1] = 'i'; /* ligature */
+ break;
+ case 0x1d: c[0] = 'f'; c[1] = 'l'; /* ligature */
+ break;
+ case 0x1e: c[0] = 'f'; c[1] = 'f';
+ c[2] = 'i'; /* ligature */
+ break;
+ case 0x1f: c[0] = 'f'; c[1] = 'f';
+ c[2] = 'l'; /* ligature */
+ break;
+ case 0xff: c[0] = 's'; c[1] = 's';
+ break; /* German double s */
+ case 0xe6: c[0] = 'a'; c[1] = 'e';
+ break; /* Dane/Norw ae */
+ case 0xf7: c[0] = 'o'; c[1] = 'e';
+ break; /* Dane/Norw oe */
+ case 0xf8: c[0] = '/'; c[1] = 'o';
+ break; /* Dane/Norw /o */
+ case 0xc6: c[0] = 'A'; c[1] = 'E';
+ break; /* Dane/Norw AE */
+ case 0xd7: c[0] = 'O'; c[1] = 'E';
break; /* Dane/Norw OE */
- case 31 : if (!allchar) {
- if (scascii)
- ch = '\\';
- else if (latin1)
- ch = 0xd8;
- else
- ch = 'O';
+ case 0xd8: c[0] = '/'; c[1] = 'O';
+ break; /* Dane/Norw /O */
+ case 0x9c: c[0] = 'I'; c[1] = 'J';
+ break; /* IJ */
+ case 0xbc: c[0] = 'i'; c[1] = 'j';
+ break; /* ij */
+ case 0x8d: c[0] = 'N'; c[1] = 'G';
+ break; /* ENG */
+ case 0xad: c[0] = 'n'; c[1] = 'g';
+ break; /* eng */
+ case 0xde: c[0] = 'T'; c[1] = 'H';
+ break; /* THORN */
+ case 0xfe: c[0] = 't'; c[1] = 'h';
+ break; /* thorn */
+ case 0x80: c[0] = '~'; c[1] ='A'; break; /* uA */
+ case 0x81: c[0] = ','; c[1] ='A'; break; /* ,A */
+ case 0x82: c[0] = '\''; c[1] ='C'; break; /* 'C */
+ case 0x83: c[0] = '~'; c[1] ='C'; break; /* vC */
+ case 0x84: c[0] = '~'; c[1] ='D'; break; /* vD */
+ case 0x85: c[0] = '~'; c[1] ='E'; break; /* vE */
+ case 0x86: c[0] = ','; c[1] ='E'; break; /* ,E */
+ case 0x87: c[0] = '~'; c[1] ='G'; break; /* uG */
+ case 0x88: c[0] = '\''; c[1] ='L'; break; /* 'L */
+ case 0x89: c[0] = '\''; c[1] ='L'; break; /* 'L */
+ case 0x8a: c[0] = '-'; c[1] ='L'; break; /* -L */
+ case 0x8b: c[0] = '\''; c[1] ='N'; break; /* 'N */
+ case 0x8c: c[0] = '~'; c[1] ='N'; break; /* vN */
+ case 0x8e: c[0] = '"'; c[1] ='O'; break; /* "O */
+ case 0x8f: c[0] = '\''; c[1] ='R'; break; /* 'R */
+ case 0x90: c[0] = '~'; c[1] ='R'; break; /* vR */
+ case 0x91: c[0] = '\''; c[1] ='S'; break; /* 'S */
+ case 0x92: c[0] = '~'; c[1] ='S'; break; /* vS */
+ case 0x93: c[0] = ','; c[1] ='S'; break; /* ,S */
+ case 0x94: c[0] = '~'; c[1] ='T'; break; /* vT */
+ case 0x95: c[0] = ','; c[1] ='T'; break; /* ,T */
+ case 0x96: c[0] = '"'; c[1] ='U'; break; /* "U */
+ case 0x97: c[0] = '\''; c[1] ='U'; break; /* oU */
+ case 0x98: c[0] = '"'; c[1] ='Y'; break; /* "Y */
+ case 0x99: c[0] = '\''; c[1] ='Z'; break; /* 'Z */
+ case 0x9a: c[0] = '~'; c[1] ='Z'; break; /* vZ */
+ case 0x9b: c[0] = '\''; c[1] ='Z'; break; /* .Z */
+ case 0x9d: c[0] = '\''; c[1] ='I'; break; /* .I */
+ case 0x9e: c[0] = '-'; c[1] ='d'; break; /* -d */
+ case 0x9f: c[0] = 'S'; break; /* section sign */
+
+ case 0xa0: c[0] = '~'; c[1] ='a'; break; /* ua */
+ case 0xa1: c[0] = ','; c[1] ='a'; break; /* ,a */
+ case 0xa2: c[0] = '\''; c[1] ='c'; break; /* 'c */
+ case 0xa3: c[0] = '~'; c[1] ='c'; break; /* vc */
+ case 0xa4: c[0] = '\''; c[1] ='d'; break; /* 'd */
+ case 0xa5: c[0] = '~'; c[1] ='e'; break; /* ve */
+ case 0xa6: c[0] = ','; c[1] ='e'; break; /* ,e */
+ case 0xa7: c[0] = '~'; c[1] ='g'; break; /* ug */
+ case 0xa8: c[0] = '\''; c[1] ='l'; break; /* 'l */
+ case 0xa9: c[0] = '\''; c[1] ='l'; break; /* 'l */
+ case 0xaa: c[0] = '-'; c[1] ='l'; break; /* -l */
+ case 0xab: c[0] = '\''; c[1] ='n'; break; /* 'n */
+ case 0xac: c[0] = '~'; c[1] ='n'; break; /* vn */
+ case 0xae: c[0] = '"'; c[1] ='o'; break; /* "o */
+ case 0xaf: c[0] = '\''; c[1] ='r'; break; /* 'r */
+
+ case 0xb0: c[0] = '~'; c[1] ='r'; break; /* vr */
+ case 0xb1: c[0] = '\''; c[1] ='s'; break; /* 's */
+ case 0xb2: c[0] = '~'; c[1] ='s'; break; /* vs */
+ case 0xb3: c[0] = ','; c[1] ='s'; break; /* ,s */
+ case 0xb4: c[0] = '\''; c[1] ='t'; break; /* 't */
+ case 0xb5: c[0] = ','; c[1] ='t'; break; /* ,t */
+ case 0xb6: c[0] = '"'; c[1] ='u'; break; /* "u */
+ case 0xb7: c[0] = '\''; c[1] ='u'; break; /* ou */
+ case 0xb8: c[0] = '"'; c[1] ='y'; break; /* "y */
+ case 0xb9: c[0] = '\''; c[1] ='z'; break; /* 'z */
+ case 0xba: c[0] = '~'; c[1] ='z'; break; /* vz */
+ case 0xbb: c[0] = '\''; c[1] ='z'; break; /* .z */
+
+ case 0xbd: c[0] = '!'; break; /* inversed ! */
+ case 0xbe: c[0] = '?'; break; /* inversed ? */
+ case 0xbf: c[0] = 'L'; break; /* pound sign */
+
+ case 0xc0: c[0] = '`'; c[1] ='A'; break; /* `A */
+ case 0xc1: c[0] = '\''; c[1] ='A'; break; /* 'A */
+ case 0xc2: c[0] = '^'; c[1] ='A'; break; /* ^A */
+ case 0xc3: c[0] = '~'; c[1] ='A'; break; /* ~A */
+ case 0xc4: c[0] = '"'; c[1] ='A'; break; /* "A */
+ case 0xc5: c[0] = 'A'; c[1] ='A'; break; /* oA */
+ case 0xc7: c[0] = ','; c[1] ='C'; break; /* ,C */
+ case 0xc8: c[0] = '`'; c[1] ='E'; break; /* `E */
+ case 0xc9: c[0] = '\''; c[1] ='E'; break; /* 'E */
+ case 0xca: c[0] = '^'; c[1] ='E'; break; /* ^E */
+ case 0xcb: c[0] = '^'; c[1] ='E'; break; /* "E */
+ case 0xcc: c[0] = '`'; c[1] ='I'; break; /* `I */
+ case 0xcd: c[0] = '\''; c[1] ='I'; break; /* 'I */
+ case 0xce: c[0] = '^'; c[1] ='I'; break; /* ^I */
+ case 0xcf: c[0] = '"'; c[1] ='I'; break; /* "I */
+ case 0xd0: c[0] = '-'; c[1] ='D'; break; /* -D */
+ case 0xd1: c[0] = '~'; c[1] ='n'; break; /* ~n */
+ case 0xd2: c[0] = '`'; c[1] ='O'; break; /* `O */
+ case 0xd3: c[0] = '\''; c[1] ='O'; break; /* 'O */
+ case 0xd4: c[0] = '^'; c[1] ='O'; break; /* ^O */
+ case 0xd5: c[0] = '~'; c[1] ='O'; break; /* ~O */
+ case 0xd6: c[0] = '"'; c[1] ='O'; break; /* "O */
+ case 0xd9: c[0] = '`'; c[1] ='U'; break; /* `U */
+ case 0xda: c[0] = '\''; c[1] ='U'; break; /* 'U */
+ case 0xdb: c[0] = '^'; c[1] ='U'; break; /* ^U */
+ case 0xdc: c[0] = '"'; c[1] ='U'; break; /* "U */
+ case 0xdd: c[0] = '\''; c[1] ='Y'; break; /* 'Y */
+ case 0xe0: c[0] = '`'; c[1] ='a'; break; /* `a */
+ case 0xe1: c[0] = '\''; c[1] ='a'; break; /* 'a */
+ case 0xe2: c[0] = '^'; c[1] ='a'; break; /* ^a */
+ case 0xe3: c[0] = '~'; c[1] ='a'; break; /* ~a */
+ case 0xe4: c[0] = '"'; c[1] ='a'; break; /* "a */
+ case 0xe5: c[0] = 'a'; c[1] ='a'; break; /* oa */
+ case 0xe7: c[0] = ','; c[1] ='c'; break; /* ,c */
+ case 0xe8: c[0] = '`'; c[1] ='e'; break; /* `e */
+ case 0xe9: c[0] = '\''; c[1] ='e'; break; /* 'e */
+ case 0xea: c[0] = '^'; c[1] ='e'; break; /* ^e */
+ case 0xeb: c[0] = '^'; c[1] ='e'; break; /* "e */
+ case 0xec: c[0] = '`'; c[1] ='i'; break; /* `i */
+ case 0xed: c[0] = '\''; c[1] ='i'; break; /* 'i */
+ case 0xee: c[0] = '^'; c[1] ='i'; break; /* ^i */
+ case 0xef: c[0] = '"'; c[1] ='i'; break; /* "i */
+ case 0xf0: c[0] = '-'; c[1] ='d'; break; /* -d */
+ case 0xf1: c[0] = '~'; c[1] ='n'; break; /* ~n */
+ case 0xf2: c[0] = '`'; c[1] ='o'; break; /* `o */
+ case 0xf3: c[0] = '\''; c[1] ='o'; break; /* 'o */
+ case 0xf4: c[0] = '^'; c[1] ='o'; break; /* ^o */
+ case 0xf5: c[0] = '~'; c[1] ='o'; break; /* ~o */
+ case 0xf6: c[0] = '"'; c[1] ='o'; break; /* "o */
+ case 0xf9: c[0] = '`'; c[1] ='u'; break; /* `u */
+ case 0xfa: c[0] = '\''; c[1] ='u'; break; /* 'u */
+ case 0xfb: c[0] = '^'; c[1] ='u'; break; /* ^u */
+ case 0xfc: c[0] = '"'; c[1] ='u'; break; /* "u */
+ case 0xfd: c[0] = '\''; c[1] ='y'; break; /* 'y */
+
+ /* diacritical marks */
+ case 0x00: c[0] = '`' ; break; /* grave from \` */
+ case 0x01: c[0] = latin1 ? 0xb4 : '\''; break;
+ /* acute from \' */
+ case 0x02: c[0] = '^' ; break; /* circumflex from \^ */
+ case 0x03: c[0] = '~' ; break; /* tilde from \~ */
+ case 0x04: c[0] = '"' ; break; /* diaeresis from \" */
+ case 0x05: c[0] = '"' ; break; /* double acute from \H */
+ case 0x06: c[0] = latin1 ? 0xb0 : '~'; break;
+ /* ring above from \r */
+ case 0x07: c[0] = '~' ; break; /* caron from \v */
+ case 0x08: c[0] = '~' ; break; /* breve from \u */
+ case 0x09: c[0] = '~' ; break; /* macron from \= */
+ case 0x0a: c[0] = '.' ; break; /* dot from \. */
+ case 0x0b: c[0] = latin1 ? 0xb8 : ','; break;
+ /* cedilla from \c */
+ case 0x0c: c[0] = ',' ; break; /* ogonek from \k */
+
+ default : c[0] = '#';
+ }
+
+ cc=c;
+ while (*cc) { outchar(*cc); cc++; }
+
+ return;
+
+} /* t1char */
+
+
+/*
+ * TS1CHAR -- Process a character opcode for a TS1 encoding font.
+ */
+
+void ts1char(unsigned char ch)
+{
+ unsigned char c[4] = {}, *cc;
+ long ucs;
+
+ if (allchar) {
+ outchar(ch);
+ return;
+ }
+ ucs = ts1_to_ucs[ch];
+ if (utf8) {
+ dounichar(ucs);
+ return;
+ }
+ else if ((latin1 && ucs<0x100) || ucs<0x80) {
+ outchar(ucs);
+ return;
+ }
+
+ switch (ch) {
+ case 0x17: /* \capitalcompwordmark */
+ case 0x1F: return; /* \textascendercompwordmark */
+ case 0x0D: /* \textquotestraightbase */
+ case 0x27: c[0] = '\''; break; /* \textquotesingle */
+ case 0x12: c[0] = '"'; break; /* \textquotestraghtdblbase */
+ case 0x15: c[0] = '-'; break; /* \texttwelveudash */
+ case 0x16: c[0] = '-'; c[1] = '-'; /* \textthreequartersemdash */
+ break;
+ case 0x18: c[0] = '<'; c[1] = '-'; /* \textleftarrow */
+ break;
+ case 0x19: c[0] = '-'; c[1] = '>'; /* \textrightarrow */
+ break;
+ case 0x2A: c[0] = '*'; break; /* \textasteriskcentered */
+ case 0x2D: c[0] = '='; break; /* \textdblhyphen */
+ case 0x2F: c[0] = '/'; break; /* \textfractionsolidus */
+ case 0x3C: c[0] = '<'; break; /* \textlangle */
+ case 0x3D: c[0] = '-'; break; /* \textminus */
+ case 0x3E: c[0] = '>'; break; /* \textrangle */
+ case 0x5B: c[0] = '['; break; /* \textlbrackdbl */
+ case 0x5D: c[0] = ']'; break; /* \textrbrackdbl */
+ case 0x5E: c[0] = '^'; break; /* \textuparrow */
+ case 0x5F: c[0] = 'v'; break; /* \textdownarrow */
+ case 0x7E: c[0] = '~'; break; /* \texttildelow */
+ case 0x7F: c[0] = '='; break; /* \textdblhyphenchar */
+ case 0x84: c[0] = '*'; break; /* \textdagger */
+ case 0x85: c[0] = '*'; c[1] = '*'; /* \textdaggerdbl */
+ break;
+ case 0x86: c[0] = '|'; c[1] = '|'; /* \textbardbl */
+ break;
+ case 0x89: if (latin1) {
+ c[0] = 0xb0; c[1] = 'C';
}
- break; /* Dane/Norw /O */
- case 32 : ch = allchar || ttfont ? ch : '_'; break;
- /* underlined blank */
- case 58 : ch = allchar || !mifont ? ch : '.'; break; /* if japan */
- case 59 : ch = allchar || !mifont ? ch : ','; break; /* if japan */
- case 92 : ch = allchar || ttfont ? ch : '"'; break; /* \ from `` */
- case 123 : ch = allchar || ttfont ? ch : '-'; break; /* { from -- */
- case 124 : ch = allchar || ttfont ? ch : '_'; break; /* | from --- */
- case 125 : ch = allchar || ttfont ? ch : '"'; break; /* } from \H */
- case 126 : ch = allchar || ttfont ? ch : '"'; break; /* ~ from \~ */
- case 127 : if (!allchar) ch = '"'; break; /* DEL from \" */
+ else
+ c[0] = 'C';
+ break; /* \textcelsius */
+ case 0x8B: c[0] = 'c'; break; /* \textcent */
+ case 0x8C: c[0] = 'f'; break; /* \textflorin */
+ case 0x8D: c[0] = 'C'; break; /* \textcentoldstyle */
+ case 0x8E: c[0] = 'W'; break; /* \textwon */
+ case 0x8F: c[0] = 'N'; break; /* \textnaira */
+ case 0x90: c[0] = 'G'; break; /* \textguarani */
+ case 0x91: c[0] = 'P'; break; /* \textpeso */
+ case 0x92: c[0] = 'L'; break; /* \textlira */
+ case 0x93: c[0] = 'R'; break; /* \textrecipe */
+ case 0x94: /* \textinterrobang */
+ case 0x95: c[0] = '!'; c[1] = '?'; /* \textinterrobangdown */
+ break;
+ case 0x97: c[0] = 'T'; c[1] = 'M'; /* \texttrademark */
+ break;
+ case 0x99: c[0] = 'P'; break; /* \textpilcrow */
+ case 0x9B: c[0] = 'N'; c[1] = 'o'; /* \textnumero */
+ break;
+ case 0x9F: c[0] = 'S'; c[1] = 'M'; /* \textservicemark */
+ break;
+ case 0xA0: c[0] = '{'; break; /* \textlquill */
+ case 0xA1: c[0] = '}'; break; /* \textrquill */
+ case 0xA2: c[0] = 'c'; break; /* \textcent */
+ case 0xA3: c[0] = 'L'; break; /* \textsterling */
+ case 0xA5: c[0] = 'Y'; break; /* \textyen */
+ case 0xA6: c[0] = '|'; break; /* \textbrokenbar */
+ case 0xA7: c[0] = 'S'; break; /* \textsection */
+ case 0xA9: c[0] = 'C'; break; /* \textcopyright */
+ case 0xAD: c[0] = 'P'; break; /* \textcircledP */
+ case 0xAE: c[0] = 'R'; break; /* \textregistered */
+ case 0xB6: c[0] = 'P'; break; /* \textparagraph */
+ case 0xB1: c[0] = '+'; c[1] = '-'; /* \textpm */
+ break;
+ case 0xBC: c[0] = '1'; c[1] = '/'; /* \textonequarter */
+ c[2] = '4'; break;
+ case 0xBD: c[0] = '1'; c[1] = '/'; /* \textonehalf */
+ c[2] = '2'; break;
+ case 0xBE: c[0] = '3'; c[1] = '/'; /* \textthreequarters */
+ c[2] = '4'; break;
+ case 0xBF: c[0] = 'E'; break; /* \texteuro */
+ case 0xD6: c[0] = 'x'; break; /* \texttimes */
+ case 0xF6: c[0] = '/'; break; /* \textdiv */
+
+ case 0x30: case 0x31: case 0x32: case 0x33:
+ case 0x34: case 0x35: case 0x36: case 0x37:
+ case 0x38: case 0x39: case 0x3A: case 0x3B:
+ c[0] = ch; break;
+
+ /* diacritical marks */
+ case 0x00: c[0] = '`' ; break; /* grave from \` */
+ case 0x01: c[0] = latin1 ? 0xb4 : '\''; break;
+ /* acute from \' */
+ case 0x02: c[0] = '^' ; break; /* circumflex from \^ */
+ case 0x03: c[0] = '~' ; break; /* tilde from \~ */
+ case 0x04: c[0] = '"' ; break; /* diaeresis from \" */
+ case 0x05: c[0] = '"' ; break; /* double acute from \H */
+ case 0x06: c[0] = latin1 ? 0xb0 : '~'; break;
+ /* ring above from \r */
+ case 0x07: c[0] = '~' ; break; /* caron from \v */
+ case 0x08: c[0] = '~' ; break; /* breve from \u */
+ case 0x09: c[0] = '~' ; break; /* macron from \= */
+ case 0x0a: c[0] = '.' ; break; /* dot from \. */
+ case 0x0b: c[0] = latin1 ? 0xb8 : ','; break;
+ /* cedilla from \c */
+ case 0x0c: c[0] = ',' ; break; /* ogonek from \k */
+
+ default : c[0] = '#';
+ }
+
+ cc=c;
+ while (*cc) { outchar(*cc); cc++; }
+
+ return;
+
+} /* ts1char */
+
+
+/*
+ * T2CHAR -- Process a character opcode for a T2A/T2B/T2C/X2 encoding font.
+ */
+
+void t2char(char flag, unsigned char ch)
+{
+ unsigned char c[4] = {}, *cc;
+ const unsigned short *tex_to_ucs;
+ long ucs;
+
+ if (allchar) {
+ outchar(ch);
+ return;
+ }
+ if (!accent) {
+ switch (ch) {
+ case 0x00: /* grave from \` */
+ case 0x01: /* acute from \' */
+ case 0x02: /* circumflex from \^ */
+ case 0x03: /* tilde from \~ */
+ case 0x04: /* diaeresis from \" */
+ case 0x05: /* double acute from \H */
+ case 0x06: /* ring above from \r */
+ case 0x07: /* caron from \v */
+ case 0x08: /* breve from \u */
+ case 0x09: /* macron from \= */
+ case 0x0a: /* dot from \. */
+ case 0x0b: /* cedilla from \c */
+ case 0x0c: /* ogonek from \k */
+ case 0x12: /* from \f */
+ case 0x13: /* from \C */
+ case 0x14: /* breve from \U */
+ return;
+ }
+ }
+ switch (flag) {
+ case T2AFONT: tex_to_ucs=t2a_to_ucs; break;
+ case T2BFONT: tex_to_ucs=t2b_to_ucs; break;
+ case T2CFONT: tex_to_ucs=t2c_to_ucs; break;
+ case X2FONT : tex_to_ucs=x2_to_ucs; break;
+ default : exit; /* not supported */
+ }
+ ucs = tex_to_ucs[ch];
+ if (utf8) {
+ dounichar(ucs);
+ return;
+ }
+ else if ((latin1 && ucs<0x100) || ucs<0x80) {
+ outchar(ucs);
+ return;
+ }
+
+ switch (ch) {
+ case 0x49: c[0] = 'I'; break; /* \CYRII */
+ case 0x69: c[0] = 'i'; break; /* \cyrii */
+ case 0x4A: c[0] = 'J'; break; /* \CYRJE */
+ case 0x6A: c[0] = 'j'; break; /* \cyrje */
+ case 0x51: c[0] = 'Q'; break; /* \CYRQ */
+ case 0x53: c[0] = 'S'; break; /* \CYRDZE */
+ case 0x57: c[0] = 'W'; break; /* \CYRW */
+ case 0x71: c[0] = 'q'; break; /* \cyrq */
+ case 0x73: c[0] = 's'; break; /* \cyrdze */
+ case 0x77: c[0] = 'w'; break; /* \cyrw */
+ case 0x0E: c[0] = '<'; break; /* \cyrlangle */
+ case 0x0F: c[0] = '>'; break; /* \cyrrangle */
+ case 0x15: c[0] = '-'; c[1] = '-'; /* \textendash */
+ break;
+ case 0x16: c[0] = '-'; c[1] = '-'; /* \textemdash */
+ c[2] = '-'; break;
+ case 0x27: /* \textquoteright */
+ case 0x60: c[0] = '\''; break; /* \textquoteleft */
+ case 0x10: /* \textquotedblleft */
+ case 0x11: /* \textquotedblright */
+ case 0xBD: c[0] = '"'; break; /* \quotedblbase */
+ case 0x20: c[0] = '_'; break; /* \textvisiblespace */
+ case 0x17: return; /* \textcompwordmark */
+ case 0x7E: c[0] = '~'; break; /* \textasciitilde */
+ case 0x9D: c[0] = 'N'; c[1] = 'o'; /* \textnumero */
+ break;
+ case 0x9F: c[0] = 'S'; break; /* \textsection */
+ case 0xBE: c[0] = '<'; c[1] = '<'; /* \guillemotleft */
+ break;
+ case 0xBF: c[0] = '>'; c[1] = '>'; /* \guillemotright */
+ break;
+
+ /* diacritical marks */
+ case 0x00: c[0] = '`' ; break; /* grave from \` */
+ case 0x01: c[0] = latin1 ? 0xb4 : '\''; break;
+ /* acute from \' */
+ case 0x02: c[0] = '^' ; break; /* circumflex from \^ */
+ case 0x03: c[0] = '~' ; break; /* tilde from \~ */
+ case 0x04: c[0] = '"' ; break; /* diaeresis from \" */
+ case 0x05: c[0] = '"' ; break; /* double acute from \H */
+ case 0x06: c[0] = latin1 ? 0xb0 : '~'; break;
+ /* ring above from \r */
+ case 0x07: c[0] = '~' ; break; /* caron from \v */
+ case 0x08: c[0] = '~' ; break; /* breve from \u */
+ case 0x09: c[0] = '~' ; break; /* macron from \= */
+ case 0x0a: c[0] = '.' ; break; /* dot from \. */
+ case 0x0b: c[0] = latin1 ? 0xb8 : ','; break;
+ /* cedilla from \c */
+ case 0x0c: c[0] = ',' ; break; /* ogonek from \k */
+ case 0x14: c[0] = '~' ; break; /* breve from \U */
+
+ default : c[0] = '#';
+ }
+ if (flag != X2FONT) {
+ switch (ch) {
+ case 0x19: c[0] = 'i'; break; /* dotless i */
+ case 0x1A: c[0] = 'j'; break; /* dotless j */
+ case 0x1B: c[0] = 'f'; c[1] = 'f'; /* ligature */
+ break;
+ case 0x1C: c[0] = 'f'; c[1] = 'i'; /* ligature */
+ break;
+ case 0x1D: c[0] = 'f'; c[1] = 'l'; /* ligature */
+ break;
+ case 0x1E: c[0] = 'f'; c[1] = 'f'; /* ligature */
+ c[2] = 'i'; break;
+ case 0x1F: c[0] = 'f'; c[1] = 'f'; /* ligature */
+ c[2] = 'l'; break;
+ }
+ }
+
+ cc=c;
+ while (*cc) { outchar(*cc); cc++; }
+
+ return;
+
+} /* t2char */
+
+
+/*
+ * OT2CHAR -- Process a character opcode for a OT2 encoding font.
+ */
+
+void ot2char(unsigned char ch)
+{
+ unsigned char c[4] = {}, *cc;
+ long ucs;
+
+ if (allchar) {
+ outchar(ch);
+ return;
+ }
+ if (!accent) {
+ switch (ch) {
+ case 0x20: /* diaeresis from \" */
+ case 0x24: /* breve from \U */
+ case 0x26: /* acute from \' */
+ case 0x40: /* breve from \u */
+ return;
+ }
+ }
+ ucs = ot2_to_ucs[ch];
+ if (utf8) {
+ dounichar(ucs);
+ return;
+ }
+ else if ((latin1 && ucs<0x100) || ucs<0x80) {
+ outchar(ucs);
+ return;
+ }
+
+ switch (ch) {
+ case 0x04: c[0] = 'I'; break; /* \CYRII */
+ case 0x0C: c[0] = 'i'; break; /* \cyrii */
+ case 0x4A: c[0] = 'J'; break; /* \CYRJE */
+ case 0x6A: c[0] = 'j'; break; /* \cyrje */
+ case 0x16: c[0] = 'S'; break; /* \CYRDZE */
+ case 0x1E: c[0] = 's'; break; /* \cyrdze */
+ case 0x7B: c[0] = '-'; c[1] = '-'; /* \textendash */
+ break;
+ case 0x7C: c[0] = '-'; c[1] = '-'; /* \textemdash */
+ c[2] = '-'; break;
+ case 0x7D: c[0] = 'N'; c[1] = 'o'; /* \textnumero */
+ break;
+ case 0x3C: c[0] = '<'; c[1] = '<'; /* \guillemotleft */
+ break;
+ case 0x3D: c[0] = 'i'; break; /* dotless i */
+ case 0x3E: c[0] = '>'; c[1] = '>'; /* \guillemotright */
+ break;
+ case 0x27: /* \textquoteright */
+ case 0x60: c[0] = '\''; break; /* \textquoteleft */
+ case 0x22: /* \textquotedblright */
+ case 0x5C: c[0] = '"'; break; /* \textquotedblleft */
- /*
- * Should SPACE be useed for non-accents ???
- * This seems to work ...
- */
- case 18 : ch = !allchar && accent ? '`' : ch; break; /* from \` */
- case 19 : ch = !allchar && accent ? 0x27 : ch; break; /* from \' */
- case 20 : ch = !allchar && accent ? '~' : ch; break; /* from \v */
- case 21 : ch = !allchar && accent ? '~' : ch; break; /* from \u */
- case 22 : ch = !allchar && accent ? '~' : ch; break; /* from \= */
- case 24 : ch = !allchar && accent ? ',' : ch; break; /* from \c */
- case 94 : ch = (!allchar && accent && !ttfont) ? '^' : ch; break;
- /* ^ from \^ */
- case 95 : ch = (!allchar && accent && !ttfont) ? '`' : ch; break;
- /* _ from \. */
- }
- outchar(ch);
+ /* diacritical marks */
+ case 0x20: c[0] = '"' ; break; /* diaeresis from \" */
+ case 0x24: c[0] = '~' ; break; /* breve from \u */
+ case 0x26: c[0] = latin1 ? 0xb4 : '\''; break;
+ /* acute from \' */
+ case 0x40: c[0] = '~' ; break; /* breve from \U */
+
+ default : c[0] = '#';
+ }
+
+ cc=c;
+ while (*cc) { outchar(*cc); cc++; }
return;
-} /* normchar */
+} /* ot2char */
@@ -1180,9 +1982,10 @@ void normchar(unsigned char ch)
* SHOULD BE MOVED OUT.
*/
-void outchar(unsigned char ch)
+void outchar(long ch)
{
register int i, j;
+ register long dia;
/* fprintf(stderr, "hor: %ld, ver: %ld\n", h, v); */
@@ -1217,8 +2020,8 @@ void outchar(unsigned char ch)
* or dots and if one is found the corresponding national char *
* replaces the special character codes. *
*/
- if (!allchar && (scascii || latin1)) {
- if ((ch == 'a') || (ch == 'A') || (ch == 'o') || (ch == 'O') || (ch == 'u') || (ch == 'U')) {
+ if (!allchar && compose && scascii) {
+ if (strchr("aAoO", ch) != NULL) {
for (i = IMAX(leftmargin, j-2);
i <= IMIN(rightmargin, j+2);
i++)
@@ -1232,24 +2035,120 @@ void outchar(unsigned char ch)
case 127 :
case 34 : /* DEL or " */
if (ch == 'a')
- ch = latin1 ? 0xe4 : '{'; /* } vi */
+ ch = '{'; /* } vi */
else if (ch == 'A') /* dots ... */
- ch = latin1 ? 0xc4 : '[';
+ ch = '[';
else if (ch == 'o')
- ch = latin1 ? 0xf6 : '|';
+ ch = '|';
else if (ch == 'O')
- ch = latin1 ? 0xd6 : '\\';
- else if (ch == 'u')
- ch = latin1 ? 0xfc : 'u';
- else if (ch == 'U')
- ch = latin1 ? 0xdc : 'U';
+ ch = '\\';
break;
case 23 : if (ch == 'a')
- ch = latin1 ? 0xe5 : '}'; /* { vi */
+ ch = '}'; /* { vi */
else if (ch == 'A') /* circle */
- ch = latin1 ? 0xc5 : ']';
+ ch = ']';
+ break;
+ }
+ }
+ }
+ }
+ if (!allchar && compose && (latin1 || utf8)) {
+ if (strchr("aAeEiIoOuUnCcNYy", ch) != NULL || (ch & MAX_UNICODE) == 0x131) {
+ for (i = IMAX(leftmargin, j-2);
+ i <= IMIN(rightmargin, j+2);
+ i++) {
+ dia = currentline->text[i - leftmargin] & MAX_UNICODE;
+ if ((dia == 0x60) || /* grave */
+ (dia == 0xB0) || /* ring above */
+ (dia == 0x2DA) || /* ring above */
+ (dia == 0xB4) || /* acute */
+ (dia == 0x5E) || /* circumflex */
+ (dia == 0xA8) || /* diaeresis */
+ (dia == 0xB8) || /* cedilla */
+ (dia == 0x7E) || /* tilde */
+ (dia == 0x2DC)) /* tilde */
+ foo = i;
+ }
+ if (foo >= leftmargin) {
+ j = (int) foo;
+ dia = currentline->text[j - leftmargin] & MAX_UNICODE;
+ switch (dia) {
+ case 0x60: /* grave */
+ if (ch == 'a') ch = 0xe0;
+ else if (ch == 'A') ch = 0xc0;
+ else if (ch == 'e') ch = 0xe8;
+ else if (ch == 'E') ch = 0xc8;
+ else if (ch == 'i') ch = 0xec;
+ else if ((ch & MAX_UNICODE) == 0x131) ch = 0xec;
+ else if (ch == 'I') ch = 0xcc;
+ else if (ch == 'o') ch = 0xf2;
+ else if (ch == 'O') ch = 0xd2;
+ else if (ch == 'u') ch = 0xf9;
+ else if (ch == 'U') ch = 0xd9;
+ break;
+ case 0xB0: /* ring above */
+ case 0x2DA:
+ if (ch == 'a') ch = 0xe5;
+ else if (ch == 'A') ch = 0xc5;
+ break;
+ case 0xB4: /* acute */
+ if (ch == 'a') ch = 0xe1;
+ else if (ch == 'A') ch = 0xc1;
+ else if (ch == 'e') ch = 0xe9;
+ else if (ch == 'E') ch = 0xc9;
+ else if (ch == 'i') ch = 0xed;
+ else if ((ch & MAX_UNICODE) == 0x131) ch = 0xed;
+ else if (ch == 'I') ch = 0xcd;
+ else if (ch == 'o') ch = 0xf3;
+ else if (ch == 'O') ch = 0xd3;
+ else if (ch == 'u') ch = 0xfa;
+ else if (ch == 'U') ch = 0xda;
+ else if (ch == 'y') ch = 0xfd;
+ else if (ch == 'Y') ch = 0xdd;
+ break;
+ case 0x5E: /* circumflex */
+ if (ch == 'a') ch = 0xe2;
+ else if (ch == 'A') ch = 0xc2;
+ else if (ch == 'e') ch = 0xea;
+ else if (ch == 'E') ch = 0xca;
+ else if (ch == 'i') ch = 0xee;
+ else if ((ch & MAX_UNICODE) == 0x131) ch = 0xee;
+ else if (ch == 'I') ch = 0xce;
+ else if (ch == 'o') ch = 0xf4;
+ else if (ch == 'O') ch = 0xd4;
+ else if (ch == 'u') ch = 0xfb;
+ else if (ch == 'U') ch = 0xdb;
+ break;
+ case 0xA8: /* diaeresis */
+ if (ch == 'a') ch = 0xe4;
+ else if (ch == 'A') ch = 0xc4;
+ else if (ch == 'e') ch = 0xeb;
+ else if (ch == 'E') ch = 0xcb;
+ else if (ch == 'i') ch = 0xef;
+ else if ((ch & MAX_UNICODE) == 0x131) ch = 0xef;
+ else if (ch == 'I') ch = 0xcf;
+ else if (ch == 'o') ch = 0xf6;
+ else if (ch == 'O') ch = 0xd6;
+ else if (ch == 'u') ch = 0xfc;
+ else if (ch == 'U') ch = 0xdc;
+ else if (ch == 'y') ch = 0xff;
+ else if (ch == 'Y' && utf8) ch = 0x178;
+ break;
+ case 0xB8: /* cedilla */
+ if (ch == 'c') ch = 0xe7;
+ else if (ch == 'C') ch = 0xc7; /* It does not seem to work */
+ break;
+ case 0x7E: /* tilde */
+ case 0x2DC:
+ if (ch == 'a') ch = 0xe3;
+ else if (ch == 'A') ch = 0xc3;
+ else if (ch == 'o') ch = 0xf5;
+ else if (ch == 'O') ch = 0xd5;
+ else if (ch == 'n') ch = 0xf1;
+ else if (ch == 'N') ch = 0xd1;
break;
}
+ if (utf8 && ch>0x7f) ch |= IS_UNICODE;
}
}
}
@@ -1265,9 +2164,7 @@ void outchar(unsigned char ch)
}
} else {
while (j < rightmargin &&
- ( (currentline->text[j - leftmargin] != SPACE) ||
- (kanji1 && (currentline->text[j+1 - leftmargin] != SPACE))
- ) ) {
+ (currentline->text[j - leftmargin] != SPACE)) {
j++;
h += charwidth;
}
@@ -1302,7 +2199,7 @@ void putcharacter(long charnr)
register long saveh;
saveh = h;
- if (nttj)
+ if (nttj || is8bit)
dochar((unsigned char) charnr);
else if (allchar || ((charnr >= 0) && (charnr <= LASTCHAR)))
outchar((unsigned char) charnr);
@@ -1325,7 +2222,10 @@ void putcharacter(long charnr)
void setchar(long charnr)
{
- outchar((unsigned char)(allchar ? charnr : '#'));
+ if (is8bit)
+ dochar((unsigned char) charnr);
+ else
+ outchar((unsigned char)(allchar ? charnr : '#'));
return;
@@ -1419,6 +2319,7 @@ void fontdef(int x)
* some magic to learn about font types...
*/
fonts->flags = 0;
+ fonts->is8bit = FALSE;
if ((asciip == FALSE && nttj == FALSE && uptex == FALSE)
&& (!jdetect) && jautodetect) {
@@ -1442,7 +2343,7 @@ void fontdef(int x)
nttj = TRUE;
asciip = uptex = FALSE;
japan = jdetect = TRUE;
- fonts->flags |= JAPFONT;
+ fonts->flags |= JPFONT;
set_enc_string (NULL, JTEX_INTERNAL_ENC);
}
}
@@ -1451,12 +2352,47 @@ void fontdef(int x)
else
fonts->fontnum = 0;
+ if ((strncmp(name, "ec", 2)) == 0) {
+ fonts->flags = T1FONT;
+ fonts->is8bit = TRUE;
+ return;
+ }
+ else if ((strncmp(name, "tc", 2)) == 0 ||
+ (strncmp(name, "ts1", 3)) == 0) {
+ fonts->flags = TS1FONT;
+ fonts->is8bit = TRUE;
+ return;
+ }
+ else if ((strncmp(name, "wn", 2)) == 0) {
+ fonts->flags = OT2FONT;
+ return;
+ }
+ else if ((strncmp(name, "la", 2)) == 0) {
+ fonts->flags = T2AFONT;
+ fonts->is8bit = TRUE;
+ return;
+ }
+ else if ((strncmp(name, "lb", 2)) == 0) {
+ fonts->flags = T2BFONT;
+ fonts->is8bit = TRUE;
+ return;
+ }
+ else if ((strncmp(name, "lc", 2)) == 0) {
+ fonts->flags = T2CFONT;
+ fonts->is8bit = TRUE;
+ return;
+ }
+ else if ((strncmp(name, "rx", 2)) == 0) {
+ fonts->flags = X2FONT;
+ fonts->is8bit = TRUE;
+ return;
+ }
if ((strstr(name, "sy")) != NULL)
- fonts->flags |= SYMFONT;
+ fonts->flags = SYMFONT;
if ((strstr(name, "tt")) != NULL)
- fonts->flags |= TTFONT;
+ fonts->flags = TTFONT;
if ((strstr(name, "mi")) != NULL)
- fonts->flags |= MIFONT;
+ fonts->flags = MIFONT;
return;
@@ -1516,9 +2452,10 @@ void setfont(long fntnum)
}
if (fnt->fontnum == 0) {
- symbolfont = fnt->flags & SYMFONT;
- ttfont = fnt->flags & TTFONT;
- mifont = fnt->flags & MIFONT;
+ symbolfont = fnt->flags == SYMFONT;
+ ttfont = fnt->flags == TTFONT;
+ mifont = fnt->flags == MIFONT;
+ is8bit = fnt->is8bit;
}
s = fnt->name;
diff --git a/Build/source/texk/dvi2tty/dvi2tty-src/test/table.tex b/Build/source/texk/dvi2tty/dvi2tty-src/test/table.tex
new file mode 100644
index 00000000000..a69588ce5bd
--- /dev/null
+++ b/Build/source/texk/dvi2tty/dvi2tty-src/test/table.tex
@@ -0,0 +1,343 @@
+% You may freely use, modify and/or distribute this file.
+
+\documentclass{report}
+\topmargin 0mm
+\textheight 210mm
+\usepackage[OT1,OT2,T2A,T2B,T2C,X2,T1]{fontenc}
+\usepackage{textcomp}
+\usepackage{color}
+\parindent0pt
+
+\newcommand\BC[1]{%
+ \textcolor{blue}{%
+ {\usefont{OT1}{cmr}{m}{n}\selectfont(}%
+ \textcolor{black}{#1}%
+ {\usefont{OT1}{cmr}{m}{n}\selectfont)}%
+ }%
+}
+\newcommand\B[2]{%
+ \BC{#1}\BC{#2}%
+}
+\makeatletter
+\newcounter{i} \newcounter{j} \newcounter{s} \newcounter{m}
+
+\newcommand\Mktable[1]{%
+ \c@i=0 \@whilenum\c@i<#1 \do{%
+ {\usefont{OT1}{cmtt}{m}{n}\selectfont
+ "\ifcase\c@i00\or10\or20\or30\or40\or50\or60\or70\or
+ 80\or90\or A0\or B0\or C0\or D0\or E0\or F0\fi:}%
+ \c@m=\c@i \multiply\c@m16
+ \c@j=0 \@whilenum\c@j<16 \do{%
+ \c@s=\c@j \advance\c@s\c@m
+ \BC{\char\c@s}%
+ \advance\c@j1
+ }%
+ \par
+ \advance\c@i1
+ }
+}
+\newcommand\MktableSevenBit{\Mktable{8}}
+\newcommand\MktableEightBit{\Mktable{16}}
+\makeatother
+
+
+\begin{document}
+\chapter{Code Tables}
+\section{OT1}
+\subsection{cmr}
+{
+ \fontencoding{OT1}\selectfont
+ \MktableSevenBit
+}
+\subsection{cmtt}
+{
+ \fontencoding{OT1}\selectfont\ttfamily
+ \MktableSevenBit
+}
+
+\newpage
+\section{OML}
+\subsection{cmmi}
+{
+ \usefont{OML}{cmr}{m}{n}\selectfont
+ \MktableSevenBit
+}
+\section{OMS}
+\subsection{cmsy}
+{
+ \usefont{OMS}{cmr}{m}{n}\selectfont
+ \MktableSevenBit
+}
+
+\newpage
+\section{OT2}
+\subsection{wnr}
+{
+ \fontencoding{OT2}\selectfont
+ \MktableSevenBit
+}
+\subsection{wntt}
+{
+ \fontencoding{OT2}\selectfont\ttfamily
+ \MktableSevenBit
+}
+
+\newpage
+\section{T1}
+\subsection{ecrm}
+{
+ \fontencoding{T1}\selectfont
+ \MktableEightBit
+}
+\subsection{ectt}
+{
+ \fontencoding{T1}\selectfont\ttfamily
+ \MktableEightBit
+}
+
+\newpage
+\section{TS1}
+\subsection{tcrm}
+{
+ \fontencoding{TS1}\selectfont
+ \MktableEightBit
+}
+
+
+\newpage
+\section{T2A}
+\subsection{larm}
+{
+ \fontencoding{T2A}\selectfont
+ \MktableEightBit
+}
+\subsection{latt}
+{
+ \fontencoding{T2A}\selectfont\ttfamily
+ \MktableEightBit
+}
+
+
+\newpage
+\section{T2B}
+\subsection{lbrm}
+{
+ \fontencoding{T2B}\selectfont
+ \MktableEightBit
+}
+\subsection{lbtt}
+{
+ \fontencoding{T2B}\selectfont\ttfamily
+ \MktableEightBit
+}
+
+\newpage
+\section{T2C}
+\subsection{lcrm}
+{
+ \fontencoding{T2C}\selectfont
+ \MktableEightBit
+}
+\subsection{lctt}
+{
+ \fontencoding{T2C}\selectfont\ttfamily
+ \MktableEightBit
+}
+
+\newpage
+\section{X2}
+\subsection{rxrm}
+{
+ \fontencoding{X2}\selectfont
+ \MktableEightBit
+}
+\subsection{rxtt}
+{
+ \fontencoding{X2}\selectfont\ttfamily
+ \MktableEightBit
+}
+
+
+
+\chapter{Composition}
+\section{OT1}
+\subsection{cmr}
+{
+ \fontencoding{OT1}\selectfont
+ in Latin-1:\\
+ ligature \B{\AE}{\ae}\\
+ stroke \B{\O}{\o}\\
+ grave \B{\`A}{\`a} \B{\`E}{\`e} \B{\`I}{\`i} \B{\`O}{\`o} \B{\`U}{\`u}\\
+ acute \B{\'A}{\'a} \B{\'E}{\'e} \B{\'I}{\'i} \B{\'O}{\'o} \B{\'U}{\'u} \B{\'Y}{\'y}\\
+ circumflex \B{\^A}{\^a} \B{\^E}{\^e} \B{\^I}{\^i} \B{\^O}{\^o} \B{\^U}{\^u}\\
+ tilde \B{\~A}{\~a} \B{\~O}{\~o}\\
+ diaeresis \B{\"A}{\"a} \B{\"E}{\"e} \B{\"I}{\"i} \B{\"O}{\"o} \B{\"U}{\"u} \B{-}{\"y}\\
+ ring above \B\AA\aa\\
+ cedilla \B{\c{C}}{\c{c}}\\
+ tilde \B{\~N}{\~n}
+
+ in T1 encoding but not in Latin-1:\\
+ ligature \BC{ff}\BC{fi}\BC{fl}\BC{ffi}\BC{ffl} \B{\OE}{\oe} \B{\IJ}{\ij}\\% \B{\NG}{\ng}\\
+ stroke \B{\L}{\l}\\
+ acute \B{\'C}{\'c} \B{\'L}{\'l} \B{\'N}{\'n} \B{\'R}{\'r} \B{\'S}{\'s} \B{\'Z}{\'z}\\
+ caron \B{\v{C}}{\v{c}} \B{\v{D}}{\v{d}} \B{\v{E}}{\v{e}} \B{\v{L}}{\v{l}} \B{\v{N}}{\v{n}}
+ \B{\v{R}}{\v{r}} \B{\v{S}}{\v{s}} \B{\v{T}}{\v{t}} \B{\v{Z}}{\v{z}}\\
+ breve \B{\u{A}}{\u{a}} \B{\u{G}}{\u{g}}\\
+% ogonek \B{\k{A}}{\k{a}} \B{\k{E}}{\k{e}}\\
+ double acute \B{\H{O}}{\H{o}} \B{\H{U}}{\H{u}}\\
+ cedilla \B{\c{S}}{\c{s}} \B{\c{T}}{\c{t}}\\
+ diaeresis \B{\"Y}{-}\\
+ ring above \B{\r{U}}{\r{u}}\\
+ dot \B{\.Z}{\.z} \B{\.I}{-}
+}
+\subsection{cmtt}
+{
+ \fontencoding{OT1}\selectfont\ttfamily
+ in Latin-1:\\
+ ligature \B{\AE}{\ae}\\
+ stroke \B{\O}{\o}\\
+ grave \B{\`A}{\`a} \B{\`E}{\`e} \B{\`I}{\`i} \B{\`O}{\`o} \B{\`U}{\`u}\\
+ acute \B{\'A}{\'a} \B{\'E}{\'e} \B{\'I}{\'i} \B{\'O}{\'o} \B{\'U}{\'u} \B{\'Y}{\'y}\\
+ circumflex \B{\^A}{\^a} \B{\^E}{\^e} \B{\^I}{\^i} \B{\^O}{\^o} \B{\^U}{\^u}\\
+ tilde \B{\~A}{\~a} \B{\~O}{\~o}\\
+ diaeresis \B{\"A}{\"a} \B{\"E}{\"e} \B{\"I}{\"i} \B{\"O}{\"o} \B{\"U}{\"u} \B{-}{\"y}\\
+ ring above \B\AA\aa\\
+ cedilla \B{\c{C}}{\c{c}}\\
+ tilde \B{\~N}{\~n}
+
+ in T1 encoding but not in Latin-1:\\
+ ligature \BC{ff}\BC{fi}\BC{fl}\BC{ffi}\BC{ffl} \B{\OE}{\oe} \B{\IJ}{\ij}\\% \B{\NG}{\ng}\\
+% stroke \B{\L}{\l}\\
+ acute \B{\'C}{\'c} \B{\'L}{\'l} \B{\'N}{\'n} \B{\'R}{\'r} \B{\'S}{\'s} \B{\'Z}{\'z}\\
+ caron \B{\v{C}}{\v{c}} \B{\v{D}}{\v{d}} \B{\v{E}}{\v{e}} \B{\v{L}}{\v{l}} \B{\v{N}}{\v{n}}
+ \B{\v{R}}{\v{r}} \B{\v{S}}{\v{s}} \B{\v{T}}{\v{t}} \B{\v{Z}}{\v{z}}\\
+ breve \B{\u{A}}{\u{a}} \B{\u{G}}{\u{g}}\\
+% ogonek \B{\k{A}}{\k{a}} \B{\k{E}}{\k{e}}\\
+% double acute \B{\H{O}}{\H{o}} \B{\H{U}}{\H{u}}\\
+ cedilla \B{\c{S}}{\c{s}} \B{\c{T}}{\c{t}}\\
+ diaeresis \B{\"Y}{-}\\
+ ring above \B{\r{U}}{\r{u}}\\
+% dot \B{\.Z}{\.z} \B{\.I}{-}
+}
+
+\section{T1}
+\subsection{ecrm}
+{
+ \fontencoding{T1}\selectfont
+ in Latin-1:\\
+ ligature \B{\AE}{\ae}\\
+ stroke \B{\O}{\o} \B{\DH}{\dh}\\
+ grave \B{\`A}{\`a} \B{\`E}{\`e} \B{\`I}{\`i} \B{\`O}{\`o} \B{\`U}{\`u}\\
+ acute \B{\'A}{\'a} \B{\'E}{\'e} \B{\'I}{\'i} \B{\'O}{\'o} \B{\'U}{\'u} \B{\'Y}{\'y}\\
+ circumflex \B{\^A}{\^a} \B{\^E}{\^e} \B{\^I}{\^i} \B{\^O}{\^o} \B{\^U}{\^u}\\
+ tilde \B{\~A}{\~a} \B{\~O}{\~o}\\
+ diaeresis \B{\"A}{\"a} \B{\"E}{\"e} \B{\"I}{\"i} \B{\"O}{\"o} \B{\"U}{\"u} \B{-}{\"y}\\
+ ring above \B\AA\aa\\
+ cedilla \B{\c{C}}{\c{c}}\\
+ tilde \B{\~N}{\~n}
+
+ in T1 encoding but not in Latin-1:\\
+ ligature \BC{ff}\BC{fi}\BC{fl}\BC{ffi}\BC{ffl} \B{\OE}{\oe} \B{\IJ}{\ij} \B{\NG}{\ng}\\
+ stroke \B{\L}{\l} \B{-}{\dj}\\
+ acute \B{\'C}{\'c} \B{\'L}{\'l} \B{\'N}{\'n} \B{\'R}{\'r} \B{\'S}{\'s} \B{\'Z}{\'z}\\
+ caron \B{\v{C}}{\v{c}} \B{\v{D}}{\v{d}} \B{\v{E}}{\v{e}} \B{\v{L}}{\v{l}} \B{\v{N}}{\v{n}}
+ \B{\v{R}}{\v{r}} \B{\v{S}}{\v{s}} \B{\v{T}}{\v{t}} \B{\v{Z}}{\v{z}}\\
+ breve \B{\u{A}}{\u{a}} \B{\u{G}}{\u{g}}\\
+ ogonek \B{\k{A}}{\k{a}} \B{\k{E}}{\k{e}}\\
+ double acute \B{\H{O}}{\H{o}} \B{\H{U}}{\H{u}}\\
+ cedilla \B{\c{S}}{\c{s}} \B{\c{T}}{\c{t}}\\
+ diaeresis \B{\"Y}{-}\\
+ ring above \B{\r{U}}{\r{u}}\\
+ dot \B{\.Z}{\.z} \B{\.I}{-}
+}
+\subsection{ectt}
+{
+ \fontencoding{T1}\selectfont\ttfamily
+ in Latin-1:\\
+ ligature \B{\AE}{\ae}\\
+ stroke \B{\O}{\o} \B{\DH}{\dh}\\
+ grave \B{\`A}{\`a} \B{\`E}{\`e} \B{\`I}{\`i} \B{\`O}{\`o} \B{\`U}{\`u}\\
+ acute \B{\'A}{\'a} \B{\'E}{\'e} \B{\'I}{\'i} \B{\'O}{\'o} \B{\'U}{\'u} \B{\'Y}{\'y}\\
+ circumflex \B{\^A}{\^a} \B{\^E}{\^e} \B{\^I}{\^i} \B{\^O}{\^o} \B{\^U}{\^u}\\
+ tilde \B{\~A}{\~a} \B{\~O}{\~o}\\
+ diaeresis \B{\"A}{\"a} \B{\"E}{\"e} \B{\"I}{\"i} \B{\"O}{\"o} \B{\"U}{\"u} \B{-}{\"y}\\
+ ring above \B\AA\aa\\
+ cedilla \B{\c{C}}{\c{c}}\\
+ tilde \B{\~N}{\~n}
+
+ in T1 encoding but not in Latin-1:\\
+ ligature \BC{ff}\BC{fi}\BC{fl}\BC{ffi}\BC{ffl} \B{\OE}{\oe} \B{\IJ}{\ij} \B{\NG}{\ng}\\
+ stroke \B{\L}{\l} \B{-}{\dj}\\
+ acute \B{\'C}{\'c} \B{\'L}{\'l} \B{\'N}{\'n} \B{\'R}{\'r} \B{\'S}{\'s} \B{\'Z}{\'z}\\
+ caron \B{\v{C}}{\v{c}} \B{\v{D}}{\v{d}} \B{\v{E}}{\v{e}} \B{\v{L}}{\v{l}} \B{\v{N}}{\v{n}}
+ \B{\v{R}}{\v{r}} \B{\v{S}}{\v{s}} \B{\v{T}}{\v{t}} \B{\v{Z}}{\v{z}}\\
+ breve \B{\u{A}}{\u{a}} \B{\u{G}}{\u{g}}\\
+ ogonek \B{\k{A}}{\k{a}} \B{\k{E}}{\k{e}}\\
+ double acute \B{\H{O}}{\H{o}} \B{\H{U}}{\H{u}}\\
+ cedilla \B{\c{S}}{\c{s}} \B{\c{T}}{\c{t}}\\
+ diaeresis \B{\"Y}{-}\\
+ ring above \B{\r{U}}{\r{u}}\\
+ dot \B{\.Z}{\.z} \B{\.I}{-}
+}
+
+\section{T2A}
+\subsection{larm}
+{
+ \fontencoding{T2A}\selectfont
+ in Latin-1:\\
+ ligature \B{\AE}{\ae}\\
+ stroke \B{\O}{\o}\\
+ grave \B{\`A}{\`a} \B{\`E}{\`e} \B{\`I}{\`i} \B{\`O}{\`o} \B{\`U}{\`u}\\
+ acute \B{\'A}{\'a} \B{\'E}{\'e} \B{\'I}{\'i} \B{\'O}{\'o} \B{\'U}{\'u} \B{\'Y}{\'y}\\
+ circumflex \B{\^A}{\^a} \B{\^E}{\^e} \B{\^I}{\^i} \B{\^O}{\^o} \B{\^U}{\^u}\\
+ tilde \B{\~A}{\~a} \B{\~O}{\~o}\\
+ diaeresis \B{\"A}{\"a} \B{\"E}{\"e} \B{\"I}{\"i} \B{\"O}{\"o} \B{\"U}{\"u} \B{-}{\"y}\\
+ ring above \B\AA\aa\\
+ cedilla \B{\c{C}}{\c{c}}\\
+ tilde \B{\~N}{\~n}
+
+ in T1 encoding but not in Latin-1:\\
+ ligature \BC{ff}\BC{fi}\BC{fl}\BC{ffi}\BC{ffl} \B{\OE}{\oe} \B{\IJ}{\ij}\\% \B{\NG}{\ng}\\
+ stroke \B{\L}{\l}\\
+ acute \B{\'C}{\'c} \B{\'L}{\'l} \B{\'N}{\'n} \B{\'R}{\'r} \B{\'S}{\'s} \B{\'Z}{\'z}\\
+ caron \B{\v{C}}{\v{c}} \B{\v{D}}{\v{d}} \B{\v{E}}{\v{e}} \B{\v{L}}{\v{l}} \B{\v{N}}{\v{n}}
+ \B{\v{R}}{\v{r}} \B{\v{S}}{\v{s}} \B{\v{T}}{\v{t}} \B{\v{Z}}{\v{z}}\\
+ breve \B{\u{A}}{\u{a}} \B{\u{G}}{\u{g}}\\
+ ogonek \B{\k{A}}{\k{a}} \B{\k{E}}{\k{e}}\\
+ double acute \B{\H{O}}{\H{o}} \B{\H{U}}{\H{u}}\\
+ cedilla \B{\c{S}}{\c{s}} \B{\c{T}}{\c{t}}\\
+ diaeresis \B{\"Y}{-}\\
+ ring above \B{\r{U}}{\r{u}}\\
+ dot \B{\.Z}{\.z} \B{\.I}{-}
+}
+\subsection{latt}
+{
+ \fontencoding{T2A}\selectfont\ttfamily
+ in Latin-1:\\
+ ligature \B{\AE}{\ae}\\
+ stroke \B{\O}{\o}\\
+ grave \B{\`A}{\`a} \B{\`E}{\`e} \B{\`I}{\`i} \B{\`O}{\`o} \B{\`U}{\`u}\\
+ acute \B{\'A}{\'a} \B{\'E}{\'e} \B{\'I}{\'i} \B{\'O}{\'o} \B{\'U}{\'u} \B{\'Y}{\'y}\\
+ circumflex \B{\^A}{\^a} \B{\^E}{\^e} \B{\^I}{\^i} \B{\^O}{\^o} \B{\^U}{\^u}\\
+ tilde \B{\~A}{\~a} \B{\~O}{\~o}\\
+ diaeresis \B{\"A}{\"a} \B{\"E}{\"e} \B{\"I}{\"i} \B{\"O}{\"o} \B{\"U}{\"u} \B{-}{\"y}\\
+ ring above \B\AA\aa\\
+ cedilla \B{\c{C}}{\c{c}}\\
+ tilde \B{\~N}{\~n}
+
+ in T1 encoding but not in Latin-1:\\
+ ligature \BC{ff}\BC{fi}\BC{fl}\BC{ffi}\BC{ffl} \B{\OE}{\oe} \B{\IJ}{\ij}\\% \B{\NG}{\ng}\\
+% stroke \B{\L}{\l}\\
+ acute \B{\'C}{\'c} \B{\'L}{\'l} \B{\'N}{\'n} \B{\'R}{\'r} \B{\'S}{\'s} \B{\'Z}{\'z}\\
+ caron \B{\v{C}}{\v{c}} \B{\v{D}}{\v{d}} \B{\v{E}}{\v{e}} \B{\v{L}}{\v{l}} \B{\v{N}}{\v{n}}
+ \B{\v{R}}{\v{r}} \B{\v{S}}{\v{s}} \B{\v{T}}{\v{t}} \B{\v{Z}}{\v{z}}\\
+ breve \B{\u{A}}{\u{a}} \B{\u{G}}{\u{g}}\\
+ ogonek \B{\k{A}}{\k{a}} \B{\k{E}}{\k{e}}\\
+ double acute \B{\H{O}}{\H{o}} \B{\H{U}}{\H{u}}\\
+ cedilla \B{\c{S}}{\c{s}} \B{\c{T}}{\c{t}}\\
+ diaeresis \B{\"Y}{-}\\
+ ring above \B{\r{U}}{\r{u}}\\
+ dot \B{\.Z}{\.z} \B{\.I}{-}
+}
+
+\end{document}
diff --git a/Build/source/texk/dvi2tty/dvi2tty-src/tex2ucs.h b/Build/source/texk/dvi2tty/dvi2tty-src/tex2ucs.h
new file mode 100644
index 00000000000..15c8ee8b978
--- /dev/null
+++ b/Build/source/texk/dvi2tty/dvi2tty-src/tex2ucs.h
@@ -0,0 +1,338 @@
+/*
+ * tex2ucs.h
+ * Copyright (C) 2012-2016 TANAKA Takui <ttk@t-lab.opal.ne.jp>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program 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 for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+/* replacement character U+FFFD */
+#define RPLCHR 0xFFFD
+
+static const unsigned short ot1_to_ucs[] = {
+ 0x0393, 0x0394, 0x0398, 0x039B, 0x039E, 0x03A0, 0x03A3, 0x03A5,
+ 0x03A6, 0x03A8, 0x03A9, 0xFB00, 0xFB01, 0xFB02, 0xFB03, 0xFB04,
+ 0x0131, 0x0237, 0x0060, 0x00B4, 0x02C7, 0x02D8, 0x00AF, 0x02DA,
+ 0x00B8, 0x00DF, 0x00E6, 0x0153, 0x00F8, 0x00C6, 0x0152, 0x00D8,
+ RPLCHR, 0x0021, 0x201D, 0x0023, 0x0024, 0x0025, 0x0026, 0x2019,
+ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x00A1, 0x003D, 0x00BF, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005A, 0x005B, 0x201C, 0x005D, 0x005E, 0x02D9,
+ 0x2018, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007A, 0x2013, 0x2014, 0x02DD, 0x02DC, 0x00A8,
+};
+
+
+static const unsigned short oml_to_ucs[] = {
+ 0x0393, 0x0394, 0x0398, 0x039B, 0x039E, 0x03A0, 0x03A3, 0x03A5,
+ 0x03A6, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5,
+ 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD,
+ 0x03BE, 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03D5, 0x03C7,
+ 0x03C8, 0x03C9, 0x03B5, 0x03D1, 0x03D6, 0x03F1, 0x03C2, 0x03C6,
+ 0x21BC, 0x21BD, 0x21C0, 0x21C1, RPLCHR, RPLCHR, 0x25B7, 0x25C1,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x002E, 0x002C, 0x003C, 0x2215, 0x003E, 0x22C6,
+ 0x2202, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005A, 0x266D, 0x266E, 0x266F, 0x23DC, 0x23DD,
+ 0x2113, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007A, 0x0131, 0x0237, 0x2118, RPLCHR, RPLCHR,
+};
+
+
+static const unsigned short oms_to_ucs[] = {
+ 0x2212, 0x2215, 0x00D7, 0x2217, 0x00F7, 0x22C4, 0x00B1, 0x2213,
+ 0x2295, 0x2296, 0x2297, 0x2298, 0x2299, 0x25EF, 0x2218, 0x2219,
+ 0x224D, 0x2261, 0x2286, 0x2287, 0x2264, 0x2265, 0x2AAF, 0x2AB0,
+ 0x223C, 0x2248, 0x2282, 0x2283, 0x226A, 0x226B, 0x227A, 0x227B,
+ 0x2190, 0x2191, 0x2192, 0x2193, 0x2194, 0x2197, 0x2198, 0x2243,
+ 0x21D0, 0x21D1, 0x21D2, 0x21D3, 0x21D4, 0x2196, 0x2199, 0x221D,
+ 0x2032, 0x221E, 0x2208, 0x220B, 0x25B3, 0x25BD, RPLCHR, RPLCHR,
+ 0x2200, 0x2203, 0x00AC, 0x2205, 0x211C, 0x2111, 0x22A4, 0x22A5,
+ 0x2135, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005A, 0x222A, 0x2229, 0x228E, 0x22C0, 0x22C1,
+ 0x22A2, 0x22A3, 0x23A3, 0x23A6, 0x23A1, 0x23A4, 0x007B, 0x007D,
+ 0x27E8, 0x27E9, 0x007C, 0x2016, 0x2195, 0x21D5, 0x2216, 0x2240,
+ 0x221A, 0x2210, 0x2207, 0x222B, 0x2294, 0x2293, 0x2291, 0x2292,
+ 0x00A7, 0x2020, 0x2021, 0x00B6, 0x2663, 0x2662, 0x2661, 0x2660,
+};
+
+
+static const unsigned short tt_to_ucs[] = {
+ 0x0393, 0x0394, 0x0398, 0x039B, 0x039E, 0x03A0, 0x03A3, 0x03A5,
+ 0x03A6, 0x03A8, 0x03A9, 0x2191, 0x2193, 0x0027, 0x00A1, 0x00BF,
+ 0x0131, 0x0237, 0x0060, 0x00B4, 0x02C7, 0x02D8, 0x00AF, 0x02DA,
+ 0x00B8, 0x00DF, 0x00E6, 0x0153, 0x00F8, 0x00C6, 0x0152, 0x00D8,
+ 0x2423, 0x0021, 0x201D, 0x0023, 0x0024, 0x0025, 0x0026, 0x2019,
+ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x2018, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x02DC, 0x00A8,
+};
+
+
+static const unsigned short ot2_to_ucs[] = {
+ 0x040A, 0x0409, 0x040F, 0x042D, 0x0406, 0x0404, 0x0402, 0x040B,
+ 0x045A, 0x0459, 0x045F, 0x044D, 0x0456, 0x0454, 0x0452, 0x045B,
+ 0x042E, 0x0416, 0x0419, 0x0401, 0x0474, 0x0472, 0x0405, 0x042F,
+ 0x044E, 0x0436, 0x0439, 0x0451, 0x0475, 0x0473, 0x0455, 0x044F,
+ 0x00A8, 0x0021, 0x201D, 0x0462, 0x02D8, 0x0025, 0x00B4, 0x2019,
+ 0x0028, 0x0029, 0x002A, 0x0463, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x00AB, 0x0131, 0x00BB, 0x003F,
+ 0x02D8, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413,
+ 0x0425, 0x0418, 0x0408, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E,
+ 0x041F, 0x0427, 0x0420, 0x0421, 0x0422, 0x0423, 0x0412, 0x0429,
+ 0x0428, 0x042B, 0x0417, 0x005B, 0x201C, 0x005D, 0x042C, 0x042A,
+ 0x2018, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433,
+ 0x0445, 0x0438, 0x0458, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E,
+ 0x043F, 0x0447, 0x0440, 0x0441, 0x0442, 0x0443, 0x0432, 0x0449,
+ 0x0448, 0x044B, 0x0437, 0x2013, 0x2014, 0x2116, 0x044C, 0x044A,
+};
+
+
+static const unsigned short t1_to_ucs[] = {
+ 0x0060, 0x00B4, 0x005E, 0x02DC, 0x00A8, 0x02DD, 0x02DA, 0x02C7,
+ 0x02D8, 0x00AF, 0x02D9, 0x00B8, 0x02DB, 0x201A, 0x2039, 0x203A,
+ 0x201C, 0x201D, 0x201E, 0x00AB, 0x00BB, 0x2013, 0x2014, 0x200C,
+ RPLCHR, 0x0131, 0x0237, 0xFB00, 0xFB01, 0xFB02, 0xFB03, 0xFB04,
+ 0x2423, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x2019,
+ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x2018, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x02DC, 0x2010,
+ 0x0102, 0x0104, 0x0106, 0x010C, 0x010E, 0x011A, 0x0118, 0x011E,
+ 0x0139, 0x013D, 0x0141, 0x0143, 0x0147, 0x014A, 0x0150, 0x0154,
+ 0x0158, 0x015A, 0x0160, 0x015E, 0x0164, 0x0162, 0x0170, 0x016E,
+ 0x0178, 0x0179, 0x017D, 0x017B, 0x0132, 0x0130, 0x0111, 0x00A7,
+ 0x0103, 0x0105, 0x0107, 0x010D, 0x010F, 0x011B, 0x0119, 0x011F,
+ 0x013A, 0x013E, 0x0142, 0x0144, 0x0148, 0x014B, 0x0151, 0x0155,
+ 0x0159, 0x015B, 0x0161, 0x015F, 0x0165, 0x0163, 0x0171, 0x016F,
+ 0x00FF, 0x017A, 0x017E, 0x017C, 0x0133, 0x00A1, 0x00BF, 0x00A3,
+ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
+ 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
+ 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x0152,
+ 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0,
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
+ 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x0153,
+ 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00DF,
+};
+
+
+static const unsigned short ts1_to_ucs[] = {
+ 0x0060, 0x00B4, 0x005E, 0x02DC, 0x00A8, 0x02DD, 0x02DA, 0x02C7,
+ 0x02D8, 0x00AF, 0x02D9, 0x00B8, 0x02DB, 0x201A, 0, 0,
+ 0, 0, 0x201E, 0, 0, 0x2013, 0x2014, 0x200C,
+ 0x2190, 0x2192, RPLCHR, RPLCHR, RPLCHR, RPLCHR, 0, 0x200C,
+ 0x2422, 0, 0, 0, 0x0024, 0, 0, 0x2019,
+ 0, 0, 0x204E, 0, 0x002C, 0x30A0, 0x002E, 0x2044,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0, 0, 0x2329, 0x2212, 0x232A, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0x2127, 0, 0x25EF,
+ 0, RPLCHR, 0, 0, 0, 0, 0, 0x2126,
+ 0, 0, 0, 0x27E6, 0, 0x27E7, 0x2191, 0x2193,
+ 0x0060, 0, 0x002A, 0x26AE, 0x002B, 0, 0, 0,
+ 0, 0, 0, 0, RPLCHR, 0x26AD, 0x266A, 0,
+ 0, RPLCHR, 0, 0x017F, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0x007E, 0x30A0,
+ 0x02D8, 0x02C7, 0x02DD, RPLCHR, 0x2020, 0x2021, 0x2016, 0x2030,
+ 0x2022, 0x2103, 0x0024, 0x00A2, 0x0192, 0x20A1, 0x20A9, 0x20A6,
+ 0x20B2, 0x20B1, 0x20A4, 0x211E, 0x203D, 0x2E18, 0x20AB, 0x2122,
+ 0x2031, 0x00B6, 0x0E3F, 0x2116, 0x2052, 0x212E, 0x25E6, 0x2120,
+ 0x2045, 0x2046, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
+ 0x00A8, 0x00A9, 0x00AA, RPLCHR, 0x00AC, 0x2117, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
+ 0x203B, 0x00B9, 0x00BA, 0x221A, 0x00BC, 0x00BD, 0x00BE, 0x20AC,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0x00D7, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0x00F7, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+
+static const unsigned short t2a_to_ucs[] = {
+ 0x0060, 0x00B4, 0x005E, 0x02DC, 0x00A8, 0x02DD, 0x02DA, 0x02C7,
+ 0x02D8, 0x00AF, 0x02D9, 0x00B8, 0x02DB, 0x04C0, 0x2329, 0x232A,
+ 0x201C, 0x201D, RPLCHR, RPLCHR, 0x02D8, 0x2013, 0x2014, 0x200C,
+ RPLCHR, 0x0131, 0x0237, 0XFB00, 0XFB01, 0XFB02, 0XFB03, 0XFB04,
+ 0x2423, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x2019,
+ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0406, 0x0408, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x051A, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x051C,
+ 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x2018, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0456, 0x0458, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x051B, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x051D,
+ 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x02DC, 0x2010,
+ 0x0490, 0x0492, 0x0402, 0x040B, 0x04BA, 0x0496, 0x0498, 0x0409,
+ 0x0407, 0x049A, 0x04A0, 0x049C, 0x04D4, 0x04A2, 0x04A4, 0x0405,
+ 0x04E8, 0x04AA, 0x040E, 0x04AE, 0x04B0, 0x04B2, 0x040F, 0x04B8,
+ 0x04B6, 0x0404, 0x04D8, 0x040A, 0x0401, 0x2116, 0x00A4, 0x00A7,
+ 0x0491, 0x0493, 0x0452, 0x045B, 0x04BB, 0x0497, 0x0499, 0x0459,
+ 0x0457, 0x049B, 0x04A1, 0x049D, 0x04D5, 0x04A3, 0x04A5, 0x0455,
+ 0x04E9, 0x04AB, 0x045E, 0x04AF, 0x04B1, 0x04B3, 0x045F, 0x04B9,
+ 0x04B7, 0x0454, 0x04D9, 0x045A, 0x0451, 0x201E, 0x00AB, 0x00BB,
+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
+ 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,
+ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
+ 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,
+ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
+ 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
+ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
+ 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F,
+};
+
+
+static const unsigned short t2b_to_ucs[] = {
+ 0x0060, 0x00B4, 0x005E, 0x02DC, 0x00A8, 0x02DD, 0x02DA, 0x02C7,
+ 0x02D8, 0x00AF, 0x02D9, 0x00B8, 0x02DB, 0x04C0, 0x2329, 0x232A,
+ 0x201C, 0x201D, RPLCHR, RPLCHR, 0x02D8, 0x2013, 0x2014, 0x200C,
+ RPLCHR, 0x0131, 0x0237, 0XFB00, 0XFB01, 0XFB02, 0XFB03, 0XFB04,
+ 0x2423, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x2019,
+ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0406, 0x0408, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x051A, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x051C,
+ 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x2018, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0456, 0x0458, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x051B, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x051D,
+ 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x02DC, 0x2010,
+ 0x04FA, 0x0492, 0x04F6, 0x0494, 0x04BA, 0x0496, RPLCHR, 0x04E0,
+ 0x0409, 0x049A, 0x04C5, 0x04C3, 0x0512, 0x04A2, 0x04A4, 0x04C7,
+ 0x04E8, RPLCHR, 0x040E, 0x04AE, 0x04FE, 0x04B2, 0x04FC, 0x04CB,
+ 0x04B6, 0x040A, 0x04D8, 0x0510, 0x0401, 0x2116, 0x00A4, 0x00A7,
+ 0x04FB, 0x0493, 0x04F7, 0x0495, 0x04BB, 0x0497, RPLCHR, 0x04E1,
+ 0x0459, 0x049B, 0x04C6, 0x04C4, 0x0513, 0x04A3, 0x04A5, 0x04C8,
+ 0x04E9, RPLCHR, 0x045E, 0x04AF, 0x04FF, 0x04B3, 0x04FD, 0x04CC,
+ 0x04B7, 0x045A, 0x04D9, 0x0511, 0x0451, 0x201E, 0x00AB, 0x00BB,
+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
+ 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,
+ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
+ 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,
+ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
+ 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
+ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
+ 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F,
+};
+
+
+static const unsigned short t2c_to_ucs[] = {
+ 0x0060, 0x00B4, 0x005E, 0x02DC, 0x00A8, 0x02DD, 0x02DA, 0x02C7,
+ 0x02D8, 0x00AF, 0x02D9, 0x00B8, 0x02DB, 0x04C0, 0x2329, 0x232A,
+ 0x201C, 0x201D, RPLCHR, RPLCHR, 0x02D8, 0x2013, 0x2014, 0x200C,
+ RPLCHR, 0x0131, 0x0237, 0XFB00, 0XFB01, 0XFB02, 0XFB03, 0XFB04,
+ 0x2423, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x2019,
+ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0406, 0x0408, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x051A, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x051C,
+ 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x2018, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0456, 0x0458, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x051B, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x051D,
+ 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x02DC, 0x2010,
+ 0x04A6, 0x04B4, 0x04AC, 0x0494, 0x04BA, RPLCHR, 0x048E, 0x04E0,
+ 0x04CD, 0x049A, 0x04C5, 0x049E, 0x0512, 0x04A2, 0x04CD, 0x04C7,
+ 0x04E8, 0x04BC, 0x04BE, 0x048C, 0x048A, 0x04B2, 0x040F, 0x04A8,
+ 0x04B6, RPLCHR, 0x04D8, RPLCHR, 0x0401, 0x2116, 0x00A4, 0x00A7,
+ 0x04A7, 0x04B5, 0x04AD, 0x0495, 0x04BB, RPLCHR, 0x048F, 0x04E1,
+ 0x04CE, 0x049B, 0x04C6, 0x049F, 0x0513, 0x04A3, 0x04CE, 0x04C8,
+ 0x04E9, 0x04BD, 0x04BF, 0x048D, 0x048B, 0x04B3, 0x045F, 0x04A9,
+ 0x04B7, RPLCHR, 0x04D9, RPLCHR, 0x0451, 0x201E, 0x00AB, 0x00BB,
+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
+ 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,
+ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
+ 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,
+ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
+ 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
+ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
+ 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F,
+};
+
+
+static const unsigned short x2_to_ucs[] = {
+ 0x0060, 0x00B4, 0x005E, 0x02DC, 0x00A8, 0x02DD, 0x02DA, 0x02C7,
+ 0x02D8, 0x00AF, 0x02D9, 0x00B8, 0x02DB, 0x04C0, 0x2329, 0x232A,
+ 0x201C, 0x201D, RPLCHR, RPLCHR, 0x02D8, 0x2013, 0x2014, 0x200C,
+ RPLCHR, RPLCHR, RPLCHR, RPLCHR, RPLCHR, RPLCHR, RPLCHR, RPLCHR,
+ 0x2423, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x2019,
+ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x04D4, 0x0402, 0x040B, 0x04BC, 0x04BE, 0x049C, 0x049E,
+ 0x04C5, 0x0406, 0x0408, 0x0409, 0x04CD, 0x040A, 0x04A8, 0x04A6,
+ RPLCHR, 0x051A, 0x04AC, 0x0405, 0x04B4, 0x040F, 0x04B8, 0x051C,
+ 0x0462, 0x046A, 0x0474, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x2018, 0x04D5, 0x0452, 0x045B, 0x04BD, 0x04BF, 0x049D, 0x049F,
+ 0x04C6, 0x0456, 0x0458, 0x0459, 0x04CE, 0x045A, 0x04A9, 0x04A7,
+ RPLCHR, 0x051B, 0x04AD, 0x0455, 0x04B5, 0x045F, 0x04B9, 0x051D,
+ 0x0463, 0x046B, 0x0475, 0x007B, 0x007C, 0x007D, 0x02DC, 0x2010,
+ 0x0490, 0x0492, 0x04F6, 0x0494, 0x04BA, 0x0496, 0x0498, 0x04E0,
+ 0x0407, 0x049A, 0x04A0, 0x04C3, 0x0512, 0x04A2, 0x04A4, 0x04C7,
+ 0x04E8, 0x04AA, 0x040E, 0x04AE, 0x04B0, 0x04B2, 0x04FC, 0x04CB,
+ 0x04B6, 0x0404, 0x04D8, 0x0510, 0x0401, 0x2116, 0x00A4, 0x00A7,
+ 0x0491, 0x0493, 0x04F7, 0x0495, 0x04BB, 0x0497, 0x0499, 0x04E1,
+ 0x0457, 0x049B, 0x04A1, 0x04C4, 0x0513, 0x04A3, 0x04A5, 0x04C8,
+ 0x04E9, 0x04AB, 0x045E, 0x04AF, 0x04B1, 0x04B3, 0x04FD, 0x04CC,
+ 0x04B7, 0x0454, 0x04D9, 0x0511, 0x0451, 0x201E, 0x00AB, 0x00BB,
+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
+ 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,
+ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
+ 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,
+ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
+ 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
+ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
+ 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F,
+};
+