diff options
author | Peter Breitenlohner <peb@mppmu.mpg.de> | 2010-12-19 15:40:03 +0000 |
---|---|---|
committer | Peter Breitenlohner <peb@mppmu.mpg.de> | 2010-12-19 15:40:03 +0000 |
commit | d62b7f1f8a3c27c3cd51d4eb41d51e8aba545217 (patch) | |
tree | 5edb6f096e0c7d59e5965a264c481f37637de8aa /Build/source/texk/cjkutils/cjkutils-4.8.2 | |
parent | 377cf2466444797e8b16032144a606930d520cb1 (diff) |
cjk/utils 4.8.2 plus changes from Akira
git-svn-id: svn://tug.org/texlive/trunk@20806 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/cjkutils/cjkutils-4.8.2')
80 files changed, 15056 insertions, 0 deletions
diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/Bg5conv/bg5conv.1 b/Build/source/texk/cjkutils/cjkutils-4.8.2/Bg5conv/bg5conv.1 new file mode 100644 index 00000000000..6ec9aeaa9b6 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/Bg5conv/bg5conv.1 @@ -0,0 +1,110 @@ +.\" man page for bg5conv +.\" Copyright (C) 1994-2008 Werner Lemberg <wl@gnu.org> +.\" +.\" 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 in doc/COPYING; if not, write to the Free +.\" Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +.\" MA 02110-1301 USA +. +.TH BG5CONV 1 29-Dec-2008 "CJK Version 4.8.2" +. +.\" ==== +.\" ==== macro definitions +.\" ==== +. +.\" here we define \TeX for troff and nroff +.if t .ds TX \fRT\\h'-0.1667m'\\v'0.20v'E\\v'-0.20v'\\h'-0.125m'X\fP +.if n .ds TX TeX +. +.\" and here the same for \LaTeX +.if t \{\ +.ie '\*(.T'dvi' \ +.ds LX \fRL\h'-0.36m'\v'-0.15v'\s-3A\s0\h'-0.15m'\v'0.15v'\fP\*(TX +.el .ds LX \fRL\h'-0.36m'\v'-0.22v'\s-2A\s0\h'-0.15m'\v'0.22v'\fP\*(TX +.\} +.if n .ds LX LaTeX +. +.\" \LaTeXe +.\" note that we need \vareps for TeX instead of \eps which can only be +.\" accessed with the \N escape sequence (in the Math Italic font) +.if t \{\ +.ie '\*(.T'dvi' .ds LE \*(LX\h'0.15m'2\v'0.20v'\f(MI\N'34'\fP\v'-0.20v' +.el .ds LE \*(LX\h'0.15m'2\v'0.20v'\(*e\v'-0.20v' +.\} +.if n .ds LE LaTeX\ 2e +. +.\" a typewriter font +.if t \{\ +.de C +\fC\\$1\fP\\$2 +.. +.\} +.if n \{\ +.de C +\\$1\\$2 +.. +.\} +. +.\" ==== +.\" ==== end of macro definitions +.\" ==== +. +. +. +.SH NAME +bg5conv \- convert a TeX document in Big\ 5 encoding into `preprocessed' +form. +. +. +.SH SYNOPSIS +.B bg5conv +< +.I infile +> +.I outfile +. +. +.SH DESCRIPTION +Big\ 5 encoding for traditional Chinese uses the characters +.C { , +.C } , +and +.C \e +which have special meanings in \*(TX +documents. +.PP +After processing a \*(LE +document which contains Big\ 5 characters with +.B bg5conv +you need not care about these special characters. +.PP +This filter is part of the +.B CJK +macro package for \*(LE. +. +. +.SH "SEE ALSO" +.BR \%sjisconv (1), +.BR \%cefconv (1), +.BR cef5conv (1), +.BR \%cefsconv (1), +.BR \%extconv (1), +.br +the +.B CJK +documentation files. +. +. +.SH AUTHOR +Werner Lemberg +.C <wl@gnu.org> diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/Bg5conv/bg5conv.c b/Build/source/texk/cjkutils/cjkutils-4.8.2/Bg5conv/bg5conv.c new file mode 100644 index 00000000000..435492827e3 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/Bg5conv/bg5conv.c @@ -0,0 +1,36 @@ +#define banner \ +"bg5conv (CJK ver. 4.8.2)" \ + +/*2:*/ +#line 94 "/home/wl/git/cjk/cjk-4.8.2/utils/Bg5conv/bg5conv.w" + +#include <stdio.h> +#include <stdlib.h> + + +int main(argc,argv) +int argc; +char*argv[]; + +{int ch; + +fprintf(stdout,"\\def\\CJKpreproc{%s}",banner); + +ch= fgetc(stdin); + +while(!feof(stdin)) +{if(ch>=0xA1&&ch<=0xFE) +{fprintf(stdout,"\177%c\177",ch); + +ch= fgetc(stdin); +if(!feof(stdin)) +fprintf(stdout,"%d\177",ch); +} +else +fputc(ch,stdout); + +ch= fgetc(stdin); +} +exit(EXIT_SUCCESS); +return 0; +}/*:2*/ diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/Bg5conv/bg5conv.w b/Build/source/texk/cjkutils/cjkutils-4.8.2/Bg5conv/bg5conv.w new file mode 100644 index 00000000000..2a25f5b91bf --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/Bg5conv/bg5conv.w @@ -0,0 +1,121 @@ +% This is the cweb file bg5conv.w of the CJK Package Ver. 4.8.2 29-Dec-2008 + +% Copyright (C) 1994-2008 Werner Lemberg <wl@@gnu.org> +% +% 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 in doc/COPYING; if not, write to the Free +% Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +% MA 02110-1301 USA + +% To print this CWEB file you should (but not must) use the CWEAVE of the +% c2cweb-package (found at the CTAN archives, e.g. ftp.dante.de) and then say +% +% cweave +a bg5conv.w +% +% This (fully compatible) CWEAVE can transform CWEB-files with alternative +% output rules (look at the position of braces below!) the author (it's me +% too :-) prefer. Otherwise this file will be formatted traditionally. + +\def\title{bg5conv (CJK Version 4.8.2)} + +\def\topofcontents{ + \null\vfill + \centerline{\titlefont The {\ttitlefont bg5conv} program} + \vskip 20pt + \centerline{(CJK Version 4.8.2)} + \vfill} + +\def\botofcontents{ + \vfill + \noindent + Copyright \copyright\ 1996, 1998 by Werner Lemberg + \bigskip\noindent + Permission is granted to make and distribute verbatim copies of this + document provided that the copyright notice and this permission notice + are preserved on all copies. + + \smallskip\noindent + Permission is granted to copy and distribute modified versions of this + document under the conditions for verbatim copying, provided that the + entire resulting derived work is distributed under the terms of a + permission notice identical to this one.} + +\pageno=\contentspagenumber \advance\pageno by 1 +\let\maybe=\iftrue +\fullpageheight=240mm +\pageheight=223mm +\pagewidth=158mm +\setpage +\frenchspacing + +\noinx +\nosecs +\nocon + +@* Function and Use. +This small program will convert Big~5 encoded Chinese characters into a +`preprocessed' form. The need of this program arises from the fact that this +encoding uses the characters `\.{\\}', `\.{\{}', and `\.{\}}' which have +special meanings in \TeX. + +Use this program as a filter: + +\hskip 2em \.{bg5conv < input\_file > output\_file} + + +@* The program. +The only function of this program is to replace all occurrences of Big 5 +encoded characters \.{XY} (\.{X} and \.{Y} are the first and the second byte +of the character) with +\.{\char94 \char94 7fX\char94 \char94 7fZZZ\char94 \char94 7f}, where +\.{ZZZ} represents the second byte as a decimal number. \.{0x7F} is used as +an active character and delimiter. + +Additionally we define a \TeX\ macro at the very beginning to signal a +preprocessed file. + +The following code is very simple. No error detection is done because \TeX\ +which will see the output of \.{bg5conv} complains loudly if something is +wrong. + +@d banner +"bg5conv (CJK ver. 4.8.2)" + +@c +#include <stdio.h> +#include <stdlib.h>@# + + +int main(int argc, char *argv[]) + {int ch; + + fprintf(stdout, "\\def\\CJKpreproc{%s}", banner);@# + + ch = fgetc(stdin);@# + + while(!feof(stdin)) + {if(ch >= 0xA1 && ch <= 0xFE) + {fprintf(stdout, "\177%c\177", ch);@# + + ch = fgetc(stdin); + if(!feof(stdin)) + fprintf(stdout, "%d\177", ch); + } + else + fputc(ch, stdout);@# + + ch = fgetc(stdin); + } + exit(EXIT_SUCCESS); + return 0; /* never reached */ + } diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/Bg5conv/bg5latex b/Build/source/texk/cjkutils/cjkutils-4.8.2/Bg5conv/bg5latex new file mode 100755 index 00000000000..30195776a87 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/Bg5conv/bg5latex @@ -0,0 +1,43 @@ +#! /bin/sh + +# Copyright (C) 1994-2008 Werner Lemberg <wl@gnu.org> +# +# 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 in doc/COPYING; if not, write to the Free +# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +# MA 02110-1301 USA + +n=1 +argv= + +# get last argument +while test 1 -lt $#; do + eval argv$n=\$1 + argv="$argv \"\$argv$n\"" + n=`expr $n + 1` + shift +done + +# replace extension with .cjk or append .cjk if there is no extension +tex=$1 +case $tex in +""|*.cjk) + echo >&2 "Usage: $0 [options] latex-file" + exit 1;; +*) + aux=`expr "X$tex" : 'X\(.*\)\.[^/]*$' \| "X$tex" : 'X\(.*\)'`.cjk;; +esac + +bg5conv < "$tex" > "$aux" && eval latex "$argv" "\$aux" + +# EOF diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/Bg5conv/bg5latex.bat b/Build/source/texk/cjkutils/cjkutils-4.8.2/Bg5conv/bg5latex.bat new file mode 100644 index 00000000000..91e7dfd8575 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/Bg5conv/bg5latex.bat @@ -0,0 +1,3 @@ +call f_name %1
+bg5conv < %1 > %fd%%fp%%fn%.cjk
+latex %fd%%fu%%fn%.cjk
diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/Bg5conv/bg5latex.cmd b/Build/source/texk/cjkutils/cjkutils-4.8.2/Bg5conv/bg5latex.cmd new file mode 100644 index 00000000000..a4800ee4821 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/Bg5conv/bg5latex.cmd @@ -0,0 +1,44 @@ +/*----------------------------------------------------------------------*\ + bg5latex.cmd + + This file is part of the CJK macro package for LaTeX2e ver. 4.8.2 + + Copyright (C) 1994-2008 Wonkoo Kim <wkim+@pitt.edu> + + 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 in doc/COPYING; if not, write to the Free + Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + MA 02110-1301 USA + + Wonkoo Kim (wkim+@pitt.edu), September 2, 1996 +\*----------------------------------------------------------------------*/ + +Call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs' +Call SysLoadFuncs + +parse arg file + +drive = filespec('drive', file) +path = filespec('path', file) +fname = filespec('name', file) +m = lastpos('.', fname) +if (m = 0) then m = length(fname) + 1 +cjkfile = drive||path||delstr(fname, m)||'.cjk' + +'bg5conv <' file '>' cjkfile + +ucjkfile = translate(cjkfile,'/','\') +if stream(cjkfile, 'C', 'QUERY EXISTS') \= '' then + 'call latex.cmd' ucjkfile + +/* End of bg5latex.cmd */ diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/Bg5conv/bg5pdflatex b/Build/source/texk/cjkutils/cjkutils-4.8.2/Bg5conv/bg5pdflatex new file mode 100755 index 00000000000..ae165527569 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/Bg5conv/bg5pdflatex @@ -0,0 +1,43 @@ +#! /bin/sh + +# Copyright (C) 1994-2008 Werner Lemberg <wl@gnu.org> +# +# 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 in doc/COPYING; if not, write to the Free +# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +# MA 02110-1301 USA + +n=1 +argv= + +# get last argument +while test 1 -lt $#; do + eval argv$n=\$1 + argv="$argv \"\$argv$n\"" + n=`expr $n + 1` + shift +done + +# replace extension with .cjk or append .cjk if there is no extension +tex=$1 +case $tex in +""|*.cjk) + echo >&2 "Usage: $0 [options] pdflatex-file" + exit 1;; +*) + aux=`expr "X$tex" : 'X\(.*\)\.[^/]*$' \| "X$tex" : 'X\(.*\)'`.cjk;; +esac + +bg5conv < "$tex" > "$aux" && eval pdflatex "$argv" "\$aux" + +# EOF diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cef5conv.1 b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cef5conv.1 new file mode 100644 index 00000000000..aa56b138c6d --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cef5conv.1 @@ -0,0 +1,127 @@ +.\" man page for cef5conv +.\" Copyright (C) 1994-2008 Werner Lemberg <wl@gnu.org> +.\" +.\" 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 in doc/COPYING; if not, write to the Free +.\" Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +.\" MA 02110-1301 USA +. +.TH CEF5CONV 1 29-Dec-2008 "CJK Version 4.8.2" +. +.\" ==== +.\" ==== macro definitions +.\" ==== +. +.\" here we define \TeX for troff and nroff +.if t .ds TX \fRT\\h'-0.1667m'\\v'0.20v'E\\v'-0.20v'\\h'-0.125m'X\fP +.if n .ds TX TeX +. +.\" and here the same for \LaTeX +.if t \{\ +.ie '\*(.T'dvi' \ +.ds LX \fRL\h'-0.36m'\v'-0.15v'\s-3A\s0\h'-0.15m'\v'0.15v'\fP\*(TX +.el .ds LX \fRL\h'-0.36m'\v'-0.22v'\s-2A\s0\h'-0.15m'\v'0.22v'\fP\*(TX +.\} +.if n .ds LX LaTeX +. +.\" \LaTeXe +.\" note that we need \vareps for TeX instead of \eps which can only be +.\" accessed with the \N escape sequence (in the Math Italic font) +.if t \{\ +.ie '\*(.T'dvi' .ds LE \*(LX\h'0.15m'2\v'0.20v'\f(MI\N'34'\fP\v'-0.20v' +.el .ds LE \*(LX\h'0.15m'2\v'0.20v'\(*e\v'-0.20v' +.\} +.if n .ds LE LaTeX\ 2e +. +.\" a typewriter font +.if t \{\ +.de C +\fC\\$1\fP +.. +.\} +.if n \{\ +.de C +\\$1 +.. +.\} +. +.\" ==== +.\" ==== end of macro definitions +.\" ==== +. +. +. +.SH NAME +cef5conv \- convert a TeX document in Big\ 5 encoding containing CEF macros +into `preprocessed' form. +. +. +.SH SYNOPSIS +.B cef5conv +< +.I infile +> +.I outfile +. +. +.SH DESCRIPTION +The +.B Chinese Encoding Framework +.RB ( CEF ) +developed by Christian Wittern +.C <cwittern@conline.central.de> +makes it possible to include CJK characters in various encodings using the +SGML macros +.B &CX-aabb; +for Big\ 5 and CNS encoding and +.B &U-aabb; +for Unicode +.RB ( X +denotes a number between 0 and 7; 0 represents Big\ 5 encoding, 1-7 CNS +encoding planes 1-7. +.B aabb +is either a decimal or hexadecimal number). +.PP +.B cef5conv +converts the CEF macros of a Big\ 5 encoded document together with the Big\ +5 encoding itself into a form which can directly processed with \*(LE. +It is identical to +.IP +.B bg5conv +< +.I infile +| +.B cefconv +> +.I outfile +.PP +This filter is part of the +.B CJK +macro package for \*(LE. +. +. +.SH "SEE ALSO" +.BR \%sjisconv (1), +.BR bg5conv (1), +.BR \%cefconv (1), +.BR \%cefsconv (1), +.BR \%extconv (1), +.br +the +.B CJK +documentation files. +. +. +.SH AUTHOR +Werner Lemberg +.C <wl@gnu.org> diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cef5conv.c b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cef5conv.c new file mode 100644 index 00000000000..e2d00c7de22 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cef5conv.c @@ -0,0 +1,138 @@ +#define banner \ +"cef5conv (CJK ver. 4.8.2)" \ + +/*2:*/ +#line 108 "/home/wl/git/cjk/cjk-4.8.2/utils/CEFconv/cef5conv.w" + +#include <ctype.h> +#include <stdio.h> +#include <stdlib.h> + + +int main(argc,argv) +int argc; +char*argv[]; + +{int ch,i; +unsigned char in[16]; +unsigned char out[32]; +unsigned char*inp,*outp; + +fprintf(stdout,"\\def\\CNSpreproc{%s}",banner); + +ch= fgetc(stdin); + +while(!feof(stdin)) +{if(ch>=0xA1&&ch<=0xFE) +{fprintf(stdout,"\177%c\177",ch); + +ch= fgetc(stdin); +if(!feof(stdin)) +fprintf(stdout,"%d\177",ch); +} +else if(ch=='&') + +{inp= in; +outp= out; +*inp= ch; +*(++inp)= fgetc(stdin); + +if(*inp=='C'&&!feof(stdin)) +{*(++inp)= fgetc(stdin); +if(*inp=='0'&&!feof(stdin)) +{*(outp++)= 'B'; +*(outp++)= 'g'; +*(outp++)= '5'; +} +else if(*inp>='1'&&*inp<='7'&&!feof(stdin)) +{*(outp++)= 'C'; +*(outp++)= 'N'; +*(outp++)= 'S'; +*(outp++)= *inp; +} +else if((*inp=='X'||*inp=='Y')&&!feof(stdin)) +{*(outp++)= 'C'; +*(outp++)= 'E'; +*(outp++)= 'F'; +*(outp++)= *inp; +} +else +goto no_macro; +} +else if(*inp=='U'&&!feof(stdin)) +{*(outp++)= 'U'; +*(outp++)= 'T'; +*(outp++)= 'F'; +*(outp++)= '8'; +} +else +goto no_macro; + +*(++inp)= fgetc(stdin); +if(*inp!='-'||feof(stdin)) +goto no_macro; + +*(outp++)= '\177'; +*(outp++)= '\"'; +*(outp++)= '0'; + +*(++inp)= fgetc(stdin); +if(isxdigit(*inp)&&*inp<0x80&&!feof(stdin)) +*(outp++)= toupper(*inp); +else +goto no_macro; + +*(++inp)= fgetc(stdin); +if(isxdigit(*inp)&&*inp<0x80&&!feof(stdin)) +*(outp++)= toupper(*inp); +else +goto no_macro; + +*(outp++)= '\177'; +*(outp++)= '\177'; +*(outp++)= '\"'; +*(outp++)= '0'; + +*(++inp)= fgetc(stdin); +if(isxdigit(*inp)&&*inp<0x80&&!feof(stdin)) +*(outp++)= toupper(*inp); +else +goto no_macro; + +*(++inp)= fgetc(stdin); +if(isxdigit(*inp)&&*inp<0x80&&!feof(stdin)) +*(outp++)= toupper(*inp); +else +goto no_macro; + +*(outp++)= '\177'; +*outp= '\0'; + +*(++inp)= fgetc(stdin); +if(*inp!=';'||feof(stdin)) +goto no_macro; + +outp= out; +fprintf(stdout,"\17772\177"); +while(*outp) +fputc(*(outp++),stdout); + +ch= fgetc(stdin); +continue; + +no_macro: +ch= *inp; +i= inp-in; +inp= in; +while(i--) +fputc(*(inp++),stdout); +continue; +} +else +fputc(ch,stdout); + +ch= fgetc(stdin); +} +exit(EXIT_SUCCESS); +return 0; +}/*:2*/ diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cef5conv.w b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cef5conv.w new file mode 100644 index 00000000000..6c7618eeb74 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cef5conv.w @@ -0,0 +1,237 @@ +% This is the cweb file cef5conv.w of the CJK Package Ver. 4.8.2 29-Dec-2008 + +% Copyright (C) 1994-2008 Werner Lemberg <wl@@gnu.org> +% +% 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 in doc/COPYING; if not, write to the Free +% Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +% MA 02110-1301 USA + +% To print this CWEB file you should (but not must) use the CWEAVE of the +% c2cweb-package (found at the CTAN archives, e.g. ftp.dante.de) and then say +% +% cweave +a cef5conv.w +% +% This (fully compatible) CWEAVE can transform CWEB-files with alternative +% output rules (look at the position of braces below!) the author (it's me +% too :-) prefer. Otherwise this file will be formatted traditionally. + +\def\title{cef5conv (CJK Version 4.8.2)} + +\def\topofcontents{ + \null\vfill + \centerline{\titlefont The {\ttitlefont cef5conv} program} + \vskip 20pt + \centerline{(CJK Version 4.8.2)} + \vfill} + +\def\botofcontents{ + \vfill + \noindent + Copyright \copyright\ 1996, 1998, 2002 by Werner Lemberg + \bigskip\noindent + Permission is granted to make and distribute verbatim copies of this + document provided that the copyright notice and this permission notice + are preserved on all copies. + + \smallskip\noindent + Permission is granted to copy and distribute modified versions of this + document under the conditions for verbatim copying, provided that the + entire resulting derived work is distributed under the terms of a + permission notice identical to this one.} + +\pageno=\contentspagenumber \advance\pageno by 1 +\let\maybe=\iftrue +\fullpageheight=240mm +\pageheight=223mm +\pagewidth=158mm +\setpage +\frenchspacing + +\noinx +\nosecs +\nocon + +@* Function and Use. +This small program will convert Big~5 encoding with CNS encoded Chinese +characters using the {\it Chinese Encoding Framework (CEF)} into a +`preprocessed' form. The need of this program arises from the fact that +Big~5 encoding uses the characters `\.{\\}', `\.{\{}', and `\.{\}}' which +have special meanings in \TeX. + +Use this program as a filter: + +\hskip 2em \.{cef5conv < input\_file > output\_file} + + +@* The program. +In contrast to \.{cefconv} two tasks will be executed: + +Replacing all occurrences of Big~5 encoded characters \.{XY} (\.{X} and +\.{Y} are the first and the second byte of the character) with +\.{\char94 \char94 7fX\char94 \char94 7fZZZ\char94 \char94 7f}, where +\.{ZZZ} represents the second byte as a decimal number. \.{0x7F} is used as +a control character and a delimiter. + +Replacing CEF macros of the form \.{\&xx-yyzz;} (\.{xx} can be C1--C7 for +the CNS planes 1--7, C0 for Big~5 encoding, an encoding CX reserved for +IRIZ, a private encoding CY, and U for Unicode encoding; \.{yyzz} is a +hexadecimal representation of the code point in this plane) with +\medskip +\quad\.{\char94 \char94 7f72\char94 \char94 7fXX\char94 \char94 7f% +\char94 \char94 7f"0yy\char94 \char94 7f"0zz\char94 \char94 7f}\quad. +\medskip +\.{XX} is the corresponding CJK encoding of \.{xx}; the number `72' +specifies a macro in the file \.{MULEenc.sty} which further processes this +representation -- it is automatically loaded by the \.{CJK} package. + +Additionally we define a \TeX\ macro at the very beginning to signal a +preprocessed file. + +The following code is very simple. No error detection is done because \TeX\ +which will see the output of \.{cef5conv} complains loudly if something is +wrong. + +@d banner +"cef5conv (CJK ver. 4.8.2)" + +@c +#include <ctype.h> +#include <stdio.h> +#include <stdlib.h>@# + + +int main(int argc, char *argv[]) + {int ch, i; + unsigned char in[16]; + unsigned char out[32]; + unsigned char *inp, *outp; + + fprintf(stdout, "\\def\\CNSpreproc{%s}", banner);@# + + ch = fgetc(stdin);@# + + while(!feof(stdin)) + {if(ch >= 0xA1 && ch <= 0xFE) + {fprintf(stdout, "\177%c\177", ch);@# + + ch = fgetc(stdin); + if(!feof(stdin)) + fprintf(stdout, "%d\177", ch); + } + else if(ch == '&') + /* the macro test is hardcoded to make things simple */ + {inp = in; + outp = out; + *inp = ch; + *(++inp) = fgetc(stdin);@# + + if(*inp == 'C' && !feof(stdin)) + {*(++inp) = fgetc(stdin); + if(*inp == '0' && !feof(stdin)) + {*(outp++) = 'B'; + *(outp++) = 'g'; + *(outp++) = '5'; + } + else if(*inp >= '1' && *inp <= '7' && !feof(stdin)) + {*(outp++) = 'C'; + *(outp++) = 'N'; + *(outp++) = 'S'; + *(outp++) = *inp; + } + else if((*inp == 'X' || *inp == 'Y') && !feof(stdin)) + {*(outp++) = 'C'; + *(outp++) = 'E'; + *(outp++) = 'F'; + *(outp++) = *inp; + } + else + goto no_macro; + } + else if(*inp == 'U' && !feof(stdin)) + {*(outp++) = 'U'; + *(outp++) = 'T'; + *(outp++) = 'F'; + *(outp++) = '8'; + } + else + goto no_macro;@# + + *(++inp) = fgetc(stdin); + if(*inp != '-' || feof(stdin)) + goto no_macro;@# + + *(outp++) = '\177'; + *(outp++) = '\"'; + *(outp++) = '0';@# + + *(++inp) = fgetc(stdin); + if(isxdigit(*inp) && *inp < 0x80 && !feof(stdin)) + *(outp++) = toupper(*inp); + else + goto no_macro;@# + + *(++inp) = fgetc(stdin); + if(isxdigit(*inp) && *inp < 0x80 && !feof(stdin)) + *(outp++) = toupper(*inp); + else + goto no_macro;@# + + *(outp++) = '\177'; + *(outp++) = '\177'; + *(outp++) = '\"'; + *(outp++) = '0';@# + + *(++inp) = fgetc(stdin); + if(isxdigit(*inp) && *inp < 0x80 && !feof(stdin)) + *(outp++) = toupper(*inp); + else + goto no_macro;@# + + *(++inp) = fgetc(stdin); + if(isxdigit(*inp) && *inp < 0x80 && !feof(stdin)) + *(outp++) = toupper(*inp); + else + goto no_macro;@# + + *(outp++) = '\177'; + *outp = '\0';@# + + *(++inp) = fgetc(stdin); + if(*inp != ';' || feof(stdin)) + goto no_macro;@# + + outp = out; + fprintf(stdout, "\17772\177"); + while(*outp) + fputc(*(outp++), stdout);@# + + ch = fgetc(stdin); + continue;@# + +no_macro: + ch = *inp; + i = inp - in; + inp = in; + while(i--) + fputc(*(inp++), stdout); + continue; + } + else + fputc(ch, stdout);@# + + ch = fgetc(stdin); + } + exit(EXIT_SUCCESS); + return 0; /* never reached */ + } diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cef5latex b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cef5latex new file mode 100755 index 00000000000..5e609181030 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cef5latex @@ -0,0 +1,43 @@ +#! /bin/sh + +# Copyright (C) 1994-2008 Werner Lemberg <wl@gnu.org> +# +# 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 in doc/COPYING; if not, write to the Free +# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +# MA 02110-1301 USA + +n=1 +argv= + +# get last argument +while test 1 -lt $#; do + eval argv$n=\$1 + argv="$argv \"\$argv$n\"" + n=`expr $n + 1` + shift +done + +# replace extension with .cjk or append .cjk if there is no extension +tex=$1 +case $tex in +""|*.cjk) + echo >&2 "Usage: $0 [options] latex-file" + exit 1;; +*) + aux=`expr "X$tex" : 'X\(.*\)\.[^/]*$' \| "X$tex" : 'X\(.*\)'`.cjk;; +esac + +cef5conv < "$tex" > "$aux" && eval latex "$argv" "\$aux" + +# EOF diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cef5ltx.bat b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cef5ltx.bat new file mode 100644 index 00000000000..187485301f9 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cef5ltx.bat @@ -0,0 +1,3 @@ +call f_name %1
+cef5conv < %1 > %fd%%fp%%fn%.cjk
+latex %fd%%fu%%fn%.cjk
diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cef5ltx.cmd b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cef5ltx.cmd new file mode 100644 index 00000000000..6edd12690ed --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cef5ltx.cmd @@ -0,0 +1,46 @@ +/*----------------------------------------------------------------------*\ + cef5ltx.cmd + + This file is part of the CJK macro package for LaTeX2e ver. 4.8.2 + + This file is part of the CJK macro package for LaTeX2e ver. 4.8.2 + + Copyright (C) 1994-2008 Wonkoo Kim <wkim+@pitt.edu> + + 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 in doc/COPYING; if not, write to the Free + Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + MA 02110-1301 USA + + Wonkoo Kim (wkim+@pitt.edu), September 2, 1996 +\*----------------------------------------------------------------------*/ + +Call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs' +Call SysLoadFuncs + +parse arg file + +drive = filespec('drive', file) +path = filespec('path', file) +fname = filespec('name', file) +m = lastpos('.', fname) +if (m = 0) then m = length(fname) + 1 +cjkfile = drive||path||delstr(fname, m)||'.cjk' + +'cef5conv <' file '>' cjkfile + +ucjkfile = translate(cjkfile,'/','\') +if stream(cjkfile, 'C', 'QUERY EXISTS') \= '' then + 'call latex.cmd' ucjkfile + +/* End of cef5ltx.cmd */ diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cef5pdflatex b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cef5pdflatex new file mode 100755 index 00000000000..cd1118cd7c3 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cef5pdflatex @@ -0,0 +1,43 @@ +#! /bin/sh + +# Copyright (C) 1994-2008 Werner Lemberg <wl@gnu.org> +# +# 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 in doc/COPYING; if not, write to the Free +# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +# MA 02110-1301 USA + +n=1 +argv= + +# get last argument +while test 1 -lt $#; do + eval argv$n=\$1 + argv="$argv \"\$argv$n\"" + n=`expr $n + 1` + shift +done + +# replace extension with .cjk or append .cjk if there is no extension +tex=$1 +case $tex in +""|*.cjk) + echo >&2 "Usage: $0 [options] pdflatex-file" + exit 1;; +*) + aux=`expr "X$tex" : 'X\(.*\)\.[^/]*$' \| "X$tex" : 'X\(.*\)'`.cjk;; +esac + +cef5conv < "$tex" > "$aux" && eval pdflatex "$argv" "\$aux" + +# EOF diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cefconv.1 b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cefconv.1 new file mode 100644 index 00000000000..f2bdca8bf2a --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cefconv.1 @@ -0,0 +1,117 @@ +.\" man page for cefconv +.\" Copyright (C) 1994-2008 Werner Lemberg <wl@gnu.org> +.\" +.\" 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 in doc/COPYING; if not, write to the Free +.\" Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +.\" MA 02110-1301 USA +. +.TH CEFCONV 1 29-Dec-2008 "CJK Version 4.8.2" +. +.\" ==== +.\" ==== macro definitions +.\" ==== +. +.\" here we define \TeX for troff and nroff +.if t .ds TX \fRT\\h'-0.1667m'\\v'0.20v'E\\v'-0.20v'\\h'-0.125m'X\fP +.if n .ds TX TeX +. +.\" and here the same for \LaTeX +.if t \{\ +.ie '\*(.T'dvi' \ +.ds LX \fRL\h'-0.36m'\v'-0.15v'\s-3A\s0\h'-0.15m'\v'0.15v'\fP\*(TX +.el .ds LX \fRL\h'-0.36m'\v'-0.22v'\s-2A\s0\h'-0.15m'\v'0.22v'\fP\*(TX +.\} +.if n .ds LX LaTeX +. +.\" \LaTeXe +.\" note that we need \vareps for TeX instead of \eps which can only be +.\" accessed with the \N escape sequence (in the Math Italic font) +.if t \{\ +.ie '\*(.T'dvi' .ds LE \*(LX\h'0.15m'2\v'0.20v'\f(MI\N'34'\fP\v'-0.20v' +.el .ds LE \*(LX\h'0.15m'2\v'0.20v'\(*e\v'-0.20v' +.\} +.if n .ds LE LaTeX\ 2e +. +.\" a typewriter font +.if t \{\ +.de C +\fC\\$1\fP +.. +.\} +.if n \{\ +.de C +\\$1 +.. +.\} +. +.\" ==== +.\" ==== end of macro definitions +.\" ==== +. +. +. +.SH NAME +cefconv \- convert a TeX document containing CEF macros into `preprocessed' +form. +. +. +.SH SYNOPSIS +.B cefconv +< +.I infile +> +.I outfile +. +. +.SH DESCRIPTION +The +.B Chinese Encoding Framework +.RB ( CEF ) +developed by Christian Wittern +.C <cwittern@conline.central.de> +makes it possible to include CJK characters in various encodings using the +SGML macros +.B &CX-aabb; +for Big\ 5 and CNS encoding and +.B &U-aabb; +for Unicode +.RB ( X +denotes a number between 0 and 7; 0 represents Big\ 5 encoding, 1-7 CNS +encoding planes 1-7. +.B aabb +is either a decimal or hexadecimal number) +.PP +.B \%cefconv +converts the CEF macros into a form which can directly processed with \*(LE. +.PP +This filter is part of the +.B CJK +macro package for \*(LE. +. +. +.SH "SEE ALSO" +.BR \%sjisconv (1), +.BR bg5conv (1), +.BR cef5conv (1), +.BR \%cefsconv (1), +.BR \%extconv (1), +.br +the +.B CJK +documentation files. +. +. +.SH AUTHOR +Werner Lemberg +.C <wl@gnu.org> diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cefconv.c b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cefconv.c new file mode 100644 index 00000000000..8c3e624108e --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cefconv.c @@ -0,0 +1,130 @@ +#define banner \ +"cefconv (CJK ver. 4.8.2)" \ + +/*2:*/ +#line 100 "/home/wl/git/cjk/cjk-4.8.2/utils/CEFconv/cefconv.w" + +#include <ctype.h> +#include <stdio.h> +#include <stdlib.h> + + +int main(argc,argv) +int argc; +char*argv[]; + +{int ch,i; +unsigned char in[16]; +unsigned char out[32]; +unsigned char*inp,*outp; + +fprintf(stdout,"\\def\\CNSpreproc{%s}",banner); + +ch= fgetc(stdin); + +while(!feof(stdin)) +{if(ch=='&') +{inp= in; +outp= out; +*inp= ch; +*(++inp)= fgetc(stdin); + +if(*inp=='C'&&!feof(stdin)) +{*(++inp)= fgetc(stdin); +if(*inp=='0'&&!feof(stdin)) +{*(outp++)= 'B'; +*(outp++)= 'g'; +*(outp++)= '5'; +} +else if(*inp>='1'&&*inp<='7'&&!feof(stdin)) +{*(outp++)= 'C'; +*(outp++)= 'N'; +*(outp++)= 'S'; +*(outp++)= *inp; +} +else if((*inp=='X'||*inp=='Y')&&!feof(stdin)) +{*(outp++)= 'C'; +*(outp++)= 'E'; +*(outp++)= 'F'; +*(outp++)= *inp; +} +else +goto no_macro; +} +else if(*inp=='U'&&!feof(stdin)) +{*(outp++)= 'U'; +*(outp++)= 'T'; +*(outp++)= 'F'; +*(outp++)= '8'; +} +else +goto no_macro; + +*(++inp)= fgetc(stdin); +if(*inp!='-'||feof(stdin)) +goto no_macro; + +*(outp++)= '\177'; +*(outp++)= '\177'; +*(outp++)= '\"'; +*(outp++)= '0'; + +*(++inp)= fgetc(stdin); +if(isxdigit(*inp)&&*inp<0x80&&!feof(stdin)) +*(outp++)= toupper(*inp); +else +goto no_macro; + +*(++inp)= fgetc(stdin); +if(isxdigit(*inp)&&*inp<0x80&&!feof(stdin)) +*(outp++)= toupper(*inp); +else +goto no_macro; + +*(outp++)= '\177'; +*(outp++)= '\"'; +*(outp++)= '0'; + +*(++inp)= fgetc(stdin); +if(isxdigit(*inp)&&*inp<0x80&&!feof(stdin)) +*(outp++)= toupper(*inp); +else +goto no_macro; + +*(++inp)= fgetc(stdin); +if(isxdigit(*inp)&&*inp<0x80&&!feof(stdin)) +*(outp++)= toupper(*inp); +else +goto no_macro; + +*(outp++)= '\177'; +*outp= '\0'; + +*(++inp)= fgetc(stdin); +if(*inp!=';'||feof(stdin)) +goto no_macro; + +outp= out; +fprintf(stdout,"\17772\177"); +while(*outp) +fputc(*(outp++),stdout); + +ch= fgetc(stdin); +continue; + +no_macro: +ch= *inp; +i= inp-in; +inp= in; +while(i--) +fputc(*(inp++),stdout); +continue; +} +else +fputc(ch,stdout); + +ch= fgetc(stdin); +} +exit(EXIT_SUCCESS); +return 0; +}/*:2*/ diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cefconv.w b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cefconv.w new file mode 100644 index 00000000000..00f6a2b5917 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cefconv.w @@ -0,0 +1,221 @@ +% This is the cweb file cefconv.w of the CJK Package Ver. 4.8.2 29-Dec-2008 + +% Copyright (C) 1994-2008 Werner Lemberg <wl@@gnu.org> +% +% 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 in doc/COPYING; if not, write to the Free +% Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +% MA 02110-1301 USA + +% To print this CWEB file you should (but not must) use the CWEAVE of the +% c2cweb-package (found at the CTAN archives, e.g. ftp.dante.de) and then say +% +% cweave +a cefconv.w +% +% This (fully compatible) CWEAVE can transform CWEB-files with alternative +% output rules (look at the position of braces below!) the author (it's me +% too :-) prefer. Otherwise this file will be formatted traditionally. + +\def\title{cefconv (CJK Version 4.8.2)} + +\def\topofcontents{ + \null\vfill + \centerline{\titlefont The {\ttitlefont cefconv} program} + \vskip 20pt + \centerline{(CJK Version 4.8.2)} + \vfill} + +\def\botofcontents{ + \vfill + \noindent + Copyright \copyright\ 1996, 1998, 2002 by Werner Lemberg + \bigskip\noindent + Permission is granted to make and distribute verbatim copies of this + document provided that the copyright notice and this permission notice + are preserved on all copies. + + \smallskip\noindent + Permission is granted to copy and distribute modified versions of this + document under the conditions for verbatim copying, provided that the + entire resulting derived work is distributed under the terms of a + permission notice identical to this one.} + +\pageno=\contentspagenumber \advance\pageno by 1 +\let\maybe=\iftrue +\fullpageheight=240mm +\pageheight=223mm +\pagewidth=158mm +\setpage +\frenchspacing + +\noinx +\nosecs +\nocon + +@* Function and Use. +This small program will convert EUC encoding with CNS encoded Chinese +characters using the {\it Chinese Encoding Framework (CEF)} into a +`preprocessed' form, expanding the CEF macros. + +Use this program as a filter: + +\hskip 2em \.{cefconv < input\_file > output\_file} + + +@* The program. +In contrast to \.{cef5conv} or \.{cefsconv}, only one task will be executed: + +Replacing CEF macros of the form \.{\&xx-yyzz;} (\.{xx} can be C1--C7 for +the CNS planes 1--7, C0 for Big~5 encoding, an encoding CX reserved for +IRIZ, a private encoding CY, and U for Unicode encoding; \.{yyzz} is a +hexadecimal representation of the code point in this plane) with +\medskip +\quad\.{\char94 \char94 7f72\char94 \char94 ffXX\char94 \char94 7f% +\char94 \char94 7f"0yy\char94 \char94 7f"0zz\char94 \char94 7f}\quad. +\medskip +\.{XX} is the corresponding CJK encoding of \.{xx}; the number `72' +specifies a macro in the file \.{MULEenc.sty} which further processes this +representation -- it is automatically loaded by the \.{CJK} package. + +Additionally we define an empty \TeX\ macro at the very beginning to signal +a preprocessed file. + +The following code is very simple. No error detection is done because \TeX\ +which will see the output of \.{cefconv} complains loudly if something is +wrong. + +@d banner +"cefconv (CJK ver. 4.8.2)" + +@c +#include <ctype.h> +#include <stdio.h> +#include <stdlib.h>@# + + +int main(int argc, char *argv[]) + {int ch, i; + unsigned char in[16]; + unsigned char out[32]; + unsigned char *inp, *outp; + + fprintf(stdout, "\\def\\CNSpreproc{%s}", banner);@# + + ch = fgetc(stdin);@# + + while(!feof(stdin)) + {if(ch == '&') /* the macro test is hardcoded to make things simple */ + {inp = in; + outp = out; + *inp = ch; + *(++inp) = fgetc(stdin);@# + + if(*inp == 'C' && !feof(stdin)) + {*(++inp) = fgetc(stdin); + if(*inp == '0' && !feof(stdin)) + {*(outp++) = 'B'; + *(outp++) = 'g'; + *(outp++) = '5'; + } + else if(*inp >= '1' && *inp <= '7' && !feof(stdin)) + {*(outp++) = 'C'; + *(outp++) = 'N'; + *(outp++) = 'S'; + *(outp++) = *inp; + } + else if((*inp == 'X' || *inp == 'Y') && !feof(stdin)) + {*(outp++) = 'C'; + *(outp++) = 'E'; + *(outp++) = 'F'; + *(outp++) = *inp; + } + else + goto no_macro; + } + else if(*inp == 'U' && !feof(stdin)) + {*(outp++) = 'U'; + *(outp++) = 'T'; + *(outp++) = 'F'; + *(outp++) = '8'; + } + else + goto no_macro;@# + + *(++inp) = fgetc(stdin); + if(*inp != '-' || feof(stdin)) + goto no_macro;@# + + *(outp++) = '\177'; + *(outp++) = '\177'; + *(outp++) = '\"'; + *(outp++) = '0';@# + + *(++inp) = fgetc(stdin); + if(isxdigit(*inp) && *inp < 0x80 && !feof(stdin)) + *(outp++) = toupper(*inp); + else + goto no_macro;@# + + *(++inp) = fgetc(stdin); + if(isxdigit(*inp) && *inp < 0x80 && !feof(stdin)) + *(outp++) = toupper(*inp); + else + goto no_macro;@# + + *(outp++) = '\177'; + *(outp++) = '\"'; + *(outp++) = '0';@# + + *(++inp) = fgetc(stdin); + if(isxdigit(*inp) && *inp < 0x80 && !feof(stdin)) + *(outp++) = toupper(*inp); + else + goto no_macro;@# + + *(++inp) = fgetc(stdin); + if(isxdigit(*inp) && *inp < 0x80 && !feof(stdin)) + *(outp++) = toupper(*inp); + else + goto no_macro;@# + + *(outp++) = '\177'; + *outp = '\0';@# + + *(++inp) = fgetc(stdin); + if(*inp != ';' || feof(stdin)) + goto no_macro;@# + + outp = out; + fprintf(stdout, "\17772\177"); + while(*outp) + fputc(*(outp++), stdout);@# + + ch = fgetc(stdin); + continue;@# + +no_macro: + ch = *inp; + i = inp - in; + inp = in; + while(i--) + fputc(*(inp++), stdout); + continue; + } + else + fputc(ch, stdout);@# + + ch = fgetc(stdin); + } + exit(EXIT_SUCCESS); + return 0; /* never reached */ + } diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/ceflatex b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/ceflatex new file mode 100755 index 00000000000..1b110c613c6 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/ceflatex @@ -0,0 +1,43 @@ +#! /bin/sh + +# Copyright (C) 1994-2008 Werner Lemberg <wl@gnu.org> +# +# 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 in doc/COPYING; if not, write to the Free +# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +# MA 02110-1301 USA + +n=1 +argv= + +# get last argument +while test 1 -lt $#; do + eval argv$n=\$1 + argv="$argv \"\$argv$n\"" + n=`expr $n + 1` + shift +done + +# replace extension with .cjk or append .cjk if there is no extension +tex=$1 +case $tex in +""|*.cjk) + echo >&2 "Usage: $0 [options] latex-file" + exit 1;; +*) + aux=`expr "X$tex" : 'X\(.*\)\.[^/]*$' \| "X$tex" : 'X\(.*\)'`.cjk;; +esac + +cefconv < "$tex" > "$aux" && eval latex "$argv" "\$aux" + +# EOF diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/ceflatex.bat b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/ceflatex.bat new file mode 100644 index 00000000000..ba5925a6df3 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/ceflatex.bat @@ -0,0 +1,3 @@ +call f_name %1
+cefconv < %1 > %fd%%fp%%fn%.cjk
+latex %fd%%fu%%fn%.cjk
diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/ceflatex.cmd b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/ceflatex.cmd new file mode 100644 index 00000000000..d1f6eed43fc --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/ceflatex.cmd @@ -0,0 +1,46 @@ +/*----------------------------------------------------------------------*\ + ceflatex.cmd + + This file is part of the CJK macro package for LaTeX2e ver. 4.8.2 + + This file is part of the CJK macro package for LaTeX2e ver. 4.8.2 + + Copyright (C) 1994-2008 Wonkoo Kim <wkim+@pitt.edu> + + 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 in doc/COPYING; if not, write to the Free + Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + MA 02110-1301 USA + + Wonkoo Kim (wkim+@pitt.edu), September 2, 1996 +\*----------------------------------------------------------------------*/ + +Call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs' +Call SysLoadFuncs + +parse arg file + +drive = filespec('drive', file) +path = filespec('path', file) +fname = filespec('name', file) +m = lastpos('.', fname) +if (m = 0) then m = length(fname) + 1 +cjkfile = drive||path||delstr(fname, m)||'.cjk' + +'cefconv <' file '>' cjkfile + +ucjkfile = translate(cjkfile,'/','\') +if stream(cjkfile, 'C', 'QUERY EXISTS') \= '' then + 'call latex.cmd' ucjkfile + +/* End of ceflatex.cmd */ diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cefpdflatex b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cefpdflatex new file mode 100755 index 00000000000..706114a8c77 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cefpdflatex @@ -0,0 +1,43 @@ +#! /bin/sh + +# Copyright (C) 1994-2008 Werner Lemberg <wl@gnu.org> +# +# 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 in doc/COPYING; if not, write to the Free +# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +# MA 02110-1301 USA + +n=1 +argv= + +# get last argument +while test 1 -lt $#; do + eval argv$n=\$1 + argv="$argv \"\$argv$n\"" + n=`expr $n + 1` + shift +done + +# replace extension with .cjk or append .cjk if there is no extension +tex=$1 +case $tex in +""|*.cjk) + echo >&2 "Usage: $0 [options] pdflatex-file" + exit 1;; +*) + aux=`expr "X$tex" : 'X\(.*\)\.[^/]*$' \| "X$tex" : 'X\(.*\)'`.cjk;; +esac + +cefconv < "$tex" > "$aux" && eval pdflatex "$argv" "\$aux" + +# EOF diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cefsconv.1 b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cefsconv.1 new file mode 100644 index 00000000000..4cd962d3d2f --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cefsconv.1 @@ -0,0 +1,127 @@ +.\" man page for cefsconv +.\" Copyright (C) 1994-2008 Werner Lemberg <wl@gnu.org> +.\" +.\" 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 in doc/COPYING; if not, write to the Free +.\" Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +.\" MA 02110-1301 USA +. +.TH CEFSCONV 1 29-Dec-2008 "CJK Version 4.8.2" +. +.\" ==== +.\" ==== macro definitions +.\" ==== +. +.\" here we define \TeX for troff and nroff +.if t .ds TX \fRT\\h'-0.1667m'\\v'0.20v'E\\v'-0.20v'\\h'-0.125m'X\fP +.if n .ds TX TeX +. +.\" and here the same for \LaTeX +.if t \{\ +.ie '\*(.T'dvi' \ +.ds LX \fRL\h'-0.36m'\v'-0.15v'\s-3A\s0\h'-0.15m'\v'0.15v'\fP\*(TX +.el .ds LX \fRL\h'-0.36m'\v'-0.22v'\s-2A\s0\h'-0.15m'\v'0.22v'\fP\*(TX +.\} +.if n .ds LX LaTeX +. +.\" \LaTeXe +.\" note that we need \vareps for TeX instead of \eps which can only be +.\" accessed with the \N escape sequence (in the Math Italic font) +.if t \{\ +.ie '\*(.T'dvi' .ds LE \*(LX\h'0.15m'2\v'0.20v'\f(MI\N'34'\fP\v'-0.20v' +.el .ds LE \*(LX\h'0.15m'2\v'0.20v'\(*e\v'-0.20v' +.\} +.if n .ds LE LaTeX\ 2e +. +.\" a typewriter font +.if t \{\ +.de C +\fC\\$1\fP +.. +.\} +.if n \{\ +.de C +\\$1 +.. +.\} +. +.\" ==== +.\" ==== end of macro definitions +.\" ==== +. +. +. +.SH NAME +cefsconv \- convert a TeX document in SJIS encoding containing CEF macros +into `preprocessed' form. +. +. +.SH SYNOPSIS +.B cefsconv +< +.I infile +> +.I outfile +. +. +.SH DESCRIPTION +The +.B Chinese Encoding Framework +.RB ( CEF ) +developed by Christian Wittern +.C <cwittern@conline.central.de> +makes it possible to include CJK characters in various encodings using the +SGML macros +.B &CX-aabb; +for Big\ 5 and CNS encoding and +.B &U-aabb; +for Unicode +.RB ( X +denotes a number between 0 and 7; 0 represents Big\ 5 encoding, 1-7 CNS +encoding planes 1-7. +.B aabb +is either a decimal or hexadecimal number). +.PP +.B \%cefsconv +converts the CEF macros of a SJIS encoded document together with the SJIS +encoding itself into a form which can directly processed with \*(LE. +It is identical to +.IP +.B sjisconv +< +.I infile +| +.B cefconv +> +.I outfile +.PP +This filter is part of the +.B CJK +macro package for \*(LE. +. +. +.SH "SEE ALSO" +.BR \%sjisconv (1), +.BR bg5conv (1), +.BR \%cefconv (1), +.BR cef5conv (1), +.BR \%extconv (1), +.br +the +.B CJK +documentation files. +. +. +.SH AUTHOR +Werner Lemberg +.C <wl@gnu.org> diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cefsconv.c b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cefsconv.c new file mode 100644 index 00000000000..cfb9a77b11b --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cefsconv.c @@ -0,0 +1,138 @@ +#define banner \ +"cefsconv (CJK ver. 4.8.2)" \ + +/*2:*/ +#line 108 "/home/wl/git/cjk/cjk-4.8.2/utils/CEFconv/cefsconv.w" + +#include <ctype.h> +#include <stdio.h> +#include <stdlib.h> + + +int main(argc,argv) +int argc; +char*argv[]; + +{int ch,i; +unsigned char in[16]; +unsigned char out[32]; +unsigned char*inp,*outp; + +fprintf(stdout,"\\def\\CNSpreproc{%s}",banner); + +ch= fgetc(stdin); + +while(!feof(stdin)) +{if((ch>=0x81&&ch<=0x9F)||(ch>=0xE0&&ch<=0xEF)) +{fprintf(stdout,"\177%c\177",ch); + +ch= fgetc(stdin); +if(!feof(stdin)) +fprintf(stdout,"%d\177",ch); +} +else if(ch=='&') + +{inp= in; +outp= out; +*inp= ch; +*(++inp)= fgetc(stdin); + +if(*inp=='C'&&!feof(stdin)) +{*(++inp)= fgetc(stdin); +if(*inp=='0'&&!feof(stdin)) +{*(outp++)= 'B'; +*(outp++)= 'g'; +*(outp++)= '5'; +} +else if(*inp>='1'&&*inp<='7'&&!feof(stdin)) +{*(outp++)= 'C'; +*(outp++)= 'N'; +*(outp++)= 'S'; +*(outp++)= *inp; +} +else if((*inp=='X'||*inp=='Y')&&!feof(stdin)) +{*(outp++)= 'C'; +*(outp++)= 'E'; +*(outp++)= 'F'; +*(outp++)= *inp; +} +else +goto no_macro; +} +else if(*inp=='U'&&!feof(stdin)) +{*(outp++)= 'U'; +*(outp++)= 'T'; +*(outp++)= 'F'; +*(outp++)= '8'; +} +else +goto no_macro; + +*(++inp)= fgetc(stdin); +if(*inp!='-'||feof(stdin)) +goto no_macro; + +*(outp++)= '\177'; +*(outp++)= '\"'; +*(outp++)= '0'; + +*(++inp)= fgetc(stdin); +if(isxdigit(*inp)&&*inp<0x80&&!feof(stdin)) +*(outp++)= toupper(*inp); +else +goto no_macro; + +*(++inp)= fgetc(stdin); +if(isxdigit(*inp)&&*inp<0x80&&!feof(stdin)) +*(outp++)= toupper(*inp); +else +goto no_macro; + +*(outp++)= '\177'; +*(outp++)= '\177'; +*(outp++)= '\"'; +*(outp++)= '0'; + +*(++inp)= fgetc(stdin); +if(isxdigit(*inp)&&*inp<0x80&&!feof(stdin)) +*(outp++)= toupper(*inp); +else +goto no_macro; + +*(++inp)= fgetc(stdin); +if(isxdigit(*inp)&&*inp<0x80&&!feof(stdin)) +*(outp++)= toupper(*inp); +else +goto no_macro; + +*(outp++)= '\177'; +*outp= '\0'; + +*(++inp)= fgetc(stdin); +if(*inp!=';'||feof(stdin)) +goto no_macro; + +outp= out; +fprintf(stdout,"\17772\177"); +while(*outp) +fputc(*(outp++),stdout); + +ch= fgetc(stdin); +continue; + +no_macro: +ch= *inp; +i= inp-in; +inp= in; +while(i--) +fputc(*(inp++),stdout); +continue; +} +else +fputc(ch,stdout); + +ch= fgetc(stdin); +} +exit(EXIT_SUCCESS); +return 0; +}/*:2*/ diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cefsconv.w b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cefsconv.w new file mode 100644 index 00000000000..06cd823f2de --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cefsconv.w @@ -0,0 +1,237 @@ +% This is the cweb file cefsconv.w of the CJK Package Ver. 4.8.2 29-Dec-2008 + +% Copyright (C) 1994-2008 Werner Lemberg <wl@@gnu.org> +% +% 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 in doc/COPYING; if not, write to the Free +% Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +% MA 02110-1301 USA + +% To print this CWEB file you should (but not must) use the CWEAVE of the +% c2cweb-package (found at the CTAN archives, e.g. ftp.dante.de) and then say +% +% cweave +a cefsconv.w +% +% This (fully compatible) CWEAVE can transform CWEB-files with alternative +% output rules (look at the position of braces below!) the author (it's me +% too :-) prefer. Otherwise this file will be formatted traditionally. + +\def\title{cefsconv (CJK Version 4.8.2)} + +\def\topofcontents{ + \null\vfill + \centerline{\titlefont The {\ttitlefont cefsconv} program} + \vskip 20pt + \centerline{(CJK Version 4.8.2)} + \vfill} + +\def\botofcontents{ + \vfill + \noindent + Copyright \copyright\ 1996, 1998 by Werner Lemberg + \bigskip\noindent + Permission is granted to make and distribute verbatim copies of this + document provided that the copyright notice and this permission notice + are preserved on all copies. + + \smallskip\noindent + Permission is granted to copy and distribute modified versions of this + document under the conditions for verbatim copying, provided that the + entire resulting derived work is distributed under the terms of a + permission notice identical to this one.} + +\pageno=\contentspagenumber \advance\pageno by 1 +\let\maybe=\iftrue +\fullpageheight=240mm +\pageheight=223mm +\pagewidth=158mm +\setpage +\frenchspacing + +\noinx +\nosecs +\nocon + +@* Function and Use. +This small program will convert SJIS encoding with CNS encoded Chinese +characters using the {\it Chinese Encoding Framework (CEF)} into a +`preprocessed' form. The need of this program arises from the fact that +SJIS encoding uses the characters `\.{\\}', `\.{\{}', and `\.{\}}' which +have special meanings in \TeX. + +Use this program as a filter: + +\hskip 2em \.{cefsconv < input\_file > output\_file} + + +@* The program. +In contrast to \.{cefconv} two tasks will be executed: + +Replacing all occurrences of two byte SJIS encoded characters \.{XY} with +\.{\char94 \char94 7fX\char94 \char94 7fZZZ\char94 \char94 7f} (\.{X} and +\.{Y} are the first and the second byte of the character; \.{ZZZ} represents +the second byte as a decimal number). + +Replacing CEF macros of the form \.{\&xx-yyzz;} (\.{xx} can be C1--C7 for +the CNS planes 1--7, C0 for Big~5 encoding, an encoding CX reserved for +IRIZ, a private encoding CY, and U for Unicode encoding; \.{yyzz} is a +hexadecimal representation of the code point in this plane) with +\medskip +\quad\.{\char94 \char94 7f72\char94 \char94 7fXX\char94 \char94 7f% +\char94 \char94 7f"0yy\char94 \char94 7f"0zz\char94 \char94 7f}\quad. +\medskip +\.{XX} is the corresponding CJK encoding of \.{xx}; the number `72' +specifies a macro in the file \.{MULEenc.sty} which further processes this +representation -- it is necessary to explicitly load this file with +\.{\\usepackage}. + +Additionally we define a \TeX\ macro at the very beginning to signal a +preprocessed file. + +The following code is very simple. No error detection is done because \TeX\ +which will see the output of \.{cefsconv} complains loudly if something is +wrong. + +@d banner +"cefsconv (CJK ver. 4.8.2)" + +@c +#include <ctype.h> +#include <stdio.h> +#include <stdlib.h>@# + + +int main(int argc, char *argv[]) + {int ch, i; + unsigned char in[16]; + unsigned char out[32]; + unsigned char *inp, *outp; + + fprintf(stdout, "\\def\\CNSpreproc{%s}", banner);@# + + ch = fgetc(stdin);@# + + while(!feof(stdin)) + {if((ch >= 0x81 && ch <= 0x9F) || (ch >= 0xE0 && ch <= 0xEF)) + {fprintf(stdout, "\177%c\177", ch);@# + + ch = fgetc(stdin); + if(!feof(stdin)) + fprintf(stdout, "%d\177", ch); + } + else if(ch == '&') + /* the macro test is hardcoded to make things simple */ + {inp = in; + outp = out; + *inp = ch; + *(++inp) = fgetc(stdin);@# + + if(*inp == 'C' && !feof(stdin)) + {*(++inp) = fgetc(stdin); + if(*inp == '0' && !feof(stdin)) + {*(outp++) = 'B'; + *(outp++) = 'g'; + *(outp++) = '5'; + } + else if(*inp >= '1' && *inp <= '7' && !feof(stdin)) + {*(outp++) = 'C'; + *(outp++) = 'N'; + *(outp++) = 'S'; + *(outp++) = *inp; + } + else if((*inp == 'X' || *inp == 'Y') && !feof(stdin)) + {*(outp++) = 'C'; + *(outp++) = 'E'; + *(outp++) = 'F'; + *(outp++) = *inp; + } + else + goto no_macro; + } + else if(*inp == 'U' && !feof(stdin)) + {*(outp++) = 'U'; + *(outp++) = 'T'; + *(outp++) = 'F'; + *(outp++) = '8'; + } + else + goto no_macro;@# + + *(++inp) = fgetc(stdin); + if(*inp != '-' || feof(stdin)) + goto no_macro;@# + + *(outp++) = '\177'; + *(outp++) = '\"'; + *(outp++) = '0';@# + + *(++inp) = fgetc(stdin); + if(isxdigit(*inp) && *inp < 0x80 && !feof(stdin)) + *(outp++) = toupper(*inp); + else + goto no_macro;@# + + *(++inp) = fgetc(stdin); + if(isxdigit(*inp) && *inp < 0x80 && !feof(stdin)) + *(outp++) = toupper(*inp); + else + goto no_macro;@# + + *(outp++) = '\177'; + *(outp++) = '\177'; + *(outp++) = '\"'; + *(outp++) = '0';@# + + *(++inp) = fgetc(stdin); + if(isxdigit(*inp) && *inp < 0x80 && !feof(stdin)) + *(outp++) = toupper(*inp); + else + goto no_macro;@# + + *(++inp) = fgetc(stdin); + if(isxdigit(*inp) && *inp < 0x80 && !feof(stdin)) + *(outp++) = toupper(*inp); + else + goto no_macro;@# + + *(outp++) = '\177'; + *outp = '\0';@# + + *(++inp) = fgetc(stdin); + if(*inp != ';' || feof(stdin)) + goto no_macro;@# + + outp = out; + fprintf(stdout, "\17772\177"); + while(*outp) + fputc(*(outp++), stdout);@# + + ch = fgetc(stdin); + continue;@# + +no_macro: + ch = *inp; + i = inp - in; + inp = in; + while(i--) + fputc(*(inp++), stdout); + continue; + } + else + fputc(ch, stdout);@# + + ch = fgetc(stdin); + } + exit(EXIT_SUCCESS); + return 0; /* never reached */ + } diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cefslatex b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cefslatex new file mode 100755 index 00000000000..db2232d98c6 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cefslatex @@ -0,0 +1,43 @@ +#! /bin/sh + +# Copyright (C) 1994-2008 Werner Lemberg <wl@gnu.org> +# +# 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 in doc/COPYING; if not, write to the Free +# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +# MA 02110-1301 USA + +n=1 +argv= + +# get last argument +while test 1 -lt $#; do + eval argv$n=\$1 + argv="$argv \"\$argv$n\"" + n=`expr $n + 1` + shift +done + +# replace extension with .cjk or append .cjk if there is no extension +tex=$1 +case $tex in +""|*.cjk) + echo >&2 "Usage: $0 [options] latex-file" + exit 1;; +*) + aux=`expr "X$tex" : 'X\(.*\)\.[^/]*$' \| "X$tex" : 'X\(.*\)'`.cjk;; +esac + +cefsconv < "$tex" > "$aux" && eval latex "$argv" "\$aux" + +# EOF diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cefsltx.bat b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cefsltx.bat new file mode 100644 index 00000000000..662ef9e3af4 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cefsltx.bat @@ -0,0 +1,3 @@ +call f_name %1
+cefsconv < %1 > %fd%%fp%%fn%.cjk
+latex %fd%%fu%%fn%.cjk
diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cefsltx.cmd b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cefsltx.cmd new file mode 100644 index 00000000000..011732c6ee4 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cefsltx.cmd @@ -0,0 +1,46 @@ +/*----------------------------------------------------------------------*\ + cefsltx.cmd + + This file is part of the CJK macro package for LaTeX2e ver. 4.8.2 + + This file is part of the CJK macro package for LaTeX2e ver. 4.8.2 + + Copyright (C) 1994-2008 Wonkoo Kim <wkim+@pitt.edu> + + 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 in doc/COPYING; if not, write to the Free + Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + MA 02110-1301 USA + + Wonkoo Kim (wkim+@pitt.edu), September 2, 1996 +\*----------------------------------------------------------------------*/ + +Call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs' +Call SysLoadFuncs + +parse arg file + +drive = filespec('drive', file) +path = filespec('path', file) +fname = filespec('name', file) +m = lastpos('.', fname) +if (m = 0) then m = length(fname) + 1 +cjkfile = drive||path||delstr(fname, m)||'.cjk' + +'cefsconv <' file '>' cjkfile + +ucjkfile = translate(cjkfile,'/','\') +if stream(cjkfile, 'C', 'QUERY EXISTS') \= '' then + 'call latex.cmd' ucjkfile + +/* End of cefsltx.cmd */ diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cefspdflatex b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cefspdflatex new file mode 100755 index 00000000000..bc99498f4af --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/CEFconv/cefspdflatex @@ -0,0 +1,43 @@ +#! /bin/sh + +# Copyright (C) 1994-2008 Werner Lemberg <wl@gnu.org> +# +# 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 in doc/COPYING; if not, write to the Free +# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +# MA 02110-1301 USA + +n=1 +argv= + +# get last argument +while test 1 -lt $#; do + eval argv$n=\$1 + argv="$argv \"\$argv$n\"" + n=`expr $n + 1` + shift +done + +# replace extension with .cjk or append .cjk if there is no extension +tex=$1 +case $tex in +""|*.cjk) + echo >&2 "Usage: $0 [options] latex-file" + exit 1;; +*) + aux=`expr "X$tex" : 'X\(.*\)\.[^/]*$' \| "X$tex" : 'X\(.*\)'`.cjk;; +esac + +cefsconv < "$tex" > "$aux" && eval pdflatex "$argv" "\$aux" + +# EOF diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/ChangeLog b/Build/source/texk/cjkutils/cjkutils-4.8.2/ChangeLog new file mode 100644 index 00000000000..51d9185d21f --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/ChangeLog @@ -0,0 +1,2164 @@ +2008-12-29 Werner LEMBERG <wl@gnu.org> + + Version 4.8.2 released + ====================== + + Set version to 4.8.2. + + * doc/history.txt: Updated. + + Update headers in all text files. + +2008-12-29 Werner LEMBERG <wl@gnu.org> + + * utils/hbf2gf/config.guess, utils/hbf2gf/config.sub, + utils/hbf2gf/install-sh, utils/hbf2gf/mkinstalldirs: Updated to + current versions. + + * utils/hbf2gf/configure: Regenerated with autoconf 2.63. + +2008-12-29 Werner LEMBERG <wl@gnu.org> + + * doc/TeXLive.txt: Replaced with... + * texlive/*.pl: These new files which define the various TeXLive + packages derived from the CJK bundle. + + * MANIFEST: Updated. + +2008-12-28 Werner LEMBERG <wl@gnu.org> + + * doc/history.txt: Updated. + + * doc/CJKnumb.txt: New file. + + * MANIFEST: Updated. + +2008-12-28 Werner LEMBERG <wl@gnu.org> + + Rename garuda & norasi stuff to garuda-c90 & norasi-c90. + + * MANIFEST, doc/thaifont.txt, utils/thaifont/tools/INSTALL: Updated. + + * utils/thaifont/texmf/dvips/garuda/config.garuda: Moved to... + * utils/thaifont/texmf/dvips/garuda-c90/config.garuda-c90: This + file. Updated. + * utils/thaifont/texmf/dvips/norasi/config.norasi: Moved to... + * utils/thaifont/texmf/dvips/norasi-c90/config.norasi-c90: This + file. Updated. + * utils/thaifont/texmf/fonts/map/dvips/garuda/garuda.map: Moved + to... + * utils/thaifont/texmf/fonts/map/dvips/garuda-c90/garuda-c90.map: + This file. + * utils/thaifont/texmf/fonts/map/dvips/norasi/norasi.map: Moved + to... + * utils/thaifont/texmf/fonts/map/dvips/norasi-c90/norasi-c90.map: + This file. + * utils/thaifont/texmf/fonts/tfm/public/garuda/*: Moved to... + * utils/thaifont/texmf/fonts/tfm/public/garuda-c90/*: This + directory. + * utils/thaifont/texmf/fonts/tfm/public/norasi/*: Moved to... + * utils/thaifont/texmf/fonts/tfm/public/norasi-c90/*: This + directory. + * utils/thaifont/tools/garuda.fontinst: Moved to... + * utils/thaifont/tools/garuda-c90.fontinst: This file. + * utils/thaifont/tools/norasi.fontinst: Moved to... + * utils/thaifont/tools/norasi-c90.fontinst: This file. + +2008-12-28 Werner LEMBERG <wl@gnu.org> + + * contrib/wadalab/DNP.txt: Renamed to... + * contrib/wadalab/wadalab.txt: This. + * MANIFEST: Updated. + +2008-12-28 Werner LEMBERG <wl@gnu.org> + + Use same font names as in thailatex. + + * doc/thaifont.txt, + utils/thaifont/texmf/fonts/map/dvips/garuda/garuda.map, + utils/thaifont/texmf/fonts/map/dvips/norasi/norasi.map: Updated. + + + Update to thailatex 0.4.2. + + * doc/thaifont.txt, + utils/thaifont/texmf/fonts/tfm/public/norasi/ftnr8z.tfm, + utils/thaifont/texmf/fonts/tfm/public/norasi/ftnb8z.tfm, + utils/thaifont/texmf/fonts/tfm/public/norasi/ftnbo8z.tfm, + utils/thaifont/texmf/fonts/tfm/public/norasi/ftno8z.tfm, + utils/thaifont/texmf/fonts/tfm/public/garuda/fgdr8z.tfm, + utils/thaifont/texmf/fonts/tfm/public/garuda/fgdb8z.tfm, + utils/thaifont/texmf/fonts/tfm/public/garuda/fgdbo8z.tfm, + utils/thaifont/texmf/fonts/tfm/public/garuda/fgdo8z.tfm: Regenerated + with fontinst. + +2008-11-25 Werner LEMBERG <wl@gnu.org> + + * texinput/CJKnumb.sty: Use U+3007 (IDEOGRAPHIC NUMBER ZERO), + not U+25CB (WHITE CIRCLE). + + * texinput/UTF8/c70bkai.fdx, texinput/UTF8/c70bsmi.fdx: Map U+25CB + to U+3007. + * texinput/UTF8/c70gbsn.fdx, texinput/UTF8/c70gkai.fdx, + texinput/UTF8/c70mj.fdx: New files which do the same. + + * MANIFEST: Updated. + +2008-11-25 Werner LEMBERG <wl@gnu.org> + + * texinput/CJK.sty (\Unicode): Use vertical glyph representation + forms. + +2008-11-25 Werner LEMBERG <wl@gnu.org> + + * texinput/CJKnumb.sty (\CJKdigits*): New command to use traditional + form of glyph zero. + + * doc/history.txt: Updated. + +2008-10-01 Werner LEMBERG <wl@gnu.org> + + * *.fd: Add \CJKnormal to all font families which use \CJKbold. This + is necessary because NFSS doesn't call \selectfont if a font gets + substituted by another one (and \selectfont resets the \CJK@bold@ + flag). Here an example (where `gbsn' uses \CJKbold for boldface + emulation): + + \begin{CJK*}{GB}{gbsn} + {\bf\CJKchar{"D6}{"D0}} + {\em\CJKchar{"D6}{"D0}} + \end{CJK*} + +2008-09-23 Werner LEMBERG <wl@gnu.org> + + * utils/subfonts/subfonts.pe: Fix error message for too-old + FontForge versions. + +2008-08-21 Werner LEMBERG <wl@gnu.org> + + * utils/subfonts/subfonts.pe: Handle CID-keyed fonts. + +2008-08-10 Werner LEMBERG <wl@gnu.org> + + Version 4.8.1 released + ====================== + + Set version to 4.8.1. + + * doc/history.txt, README: Updated. + + * doc/TeXLive.txt: Updated. + PDF man pages are now autogenerated in TeXLive. + + Update headers in all text files. + + * utils/hbf2gf/config.sub: Updated to current version. + +2008-08-03 Werner LEMBERG <wl@gnu.org> + + Add some missing files. Found by Daniel Flipo. + + * texinput/Bg5/c00bkai.fd, texinput/GB/c10gkai.fd, + texinput/GB/c10gkai.fdx: New files. + + * MANIFEST: Updated. + +2008-07-11 Werner LEMBERG <wl@gnu.org> + + Make macros in pinyin.sty robust. + + Problem reported by Denis Roegel <roegel@loria.fr>. + + * texinput/pinyin.sty (\py@macron): Make it work again with Plain + TeX. + (\py@@@): No longer needed. + (\py@): Do what \py@@@ did formerly. + (py@DRC): New macro to make the pinyin syllables robust. + Update all pinyin syllable macro definitions to use it. + + * doc/history.txt: Updated. + +2008-07-11 Werner LEMBERG <wl@gnu.org> + + Incorporate Wen-Chang's CJKspace package. + + * texinput/CJKspace.sty, examples/CJKspace.tex, doc/CJKspace.txt: + New files. + * texinput/CJK.sty (\CJK@@@): New signature macro for CJKspace.sty. + (\CJK@namedef, \CJK@namepdef, \CJK@nameppdef, \CJK@namepppdef, + \CJK@nameppppdef): Use it. + + * Makefile, doc/history.txt, MANIFEST: Updated. + +2008-05-22 Werner LEMBERG <wl@gnu.org> + + Version 4.8.0 released + ====================== + + Set version to 4.8.0. + + * doc/history.txt, doc/INSTALL, doc/TeXLive.txt, README: Updated. + + Update headers in all text files. + + * utils/hbf2gf/config.guess, utils/hbf2gf/config.sub: Updated to + current versions. + + * utils/hbf2gf/configure: Regenerated with autoconf 2.62. + +2008-05-18 Werner LEMBERG <wl@gnu.org> + + * Makefile (DISTDIRS): We are now using git, not CVS. + +2008-05-18 Werner LEMBERG <wl@gnu.org> + + * doc/history.txt: Mention xCJK.sty. + +2008-05-17 Werner LEMBERG <wl@gnu.org> + + * texinput/CJK.sty (\CJK@UnicodeEnc): New macro (so that xCJK.sty + can overwrite it). + * texinput/CJKnumb.sty: Use it. + + * texinput/xCJK.sty: Simplify -- unicode mappings to other encodings + are no longer supported (since it hasn't worked for Big5 or GBK + anyway). + + (\xCJK@xUTF): Removed. + (\CJKsymbol): Simplified. + (\toutf@XXX): Removed. + (\xCJK@CJKenc, \CJKenc): Removed. + (\CJK@envStart): Produce error if encoding is not `UTF8'. + Simplified. + (\xCJK@setenc, \CJK@xpmC, \xCJK@enc@UTF8, \xCJK@xUTF8@hook): + Removed. + (\CJK@xUTF8@hook, \CJK@UnicodeEnc): New macros. + (\xCJK@@char): Removed. + (\CJK@XXpdf): Simplified. + (\CJK@@XXpdf): Removed. + + Add support for non-BMP Unicode. + + (\CJK@nameppppdef): New macro. + (\xCJK@char): Redefined. + (\xCJK@@char, \xCJK@@@char): New macros. + (\CJK@XXp, \CJK@XXXp): Redefined. + (\CJK@XXXXp): New macro. + + xdvipdfmx automatically handles UTF-8 encoded bookmarks. + + (\xCJK@four, \xCJK@@@char, <\if@filesw>): Removed. + + (\special): Use \utfout. + +2008-05-12 Danai SAE-HAN <danai.sae-han@edpnet.be> + + * utils/hbf2gf/hbf2gf.1: Replace some `-' with `\-'. + +2008-03-10 Werner LEMBERG <wl@gnu.org> + + * utils/hbf2gf/hbf2gf.1: s|-|\-| where appropriate. + +2008-03-09 Werner LEMBERG <wl@gnu.org> + + * Makefile (XELATEX): Call xelatex twice. + (manpages): Increase font size to 11pt for DVI and PDF output. + +2008-03-09 Werner LEMBERG <wl@gnu.org> + + Add support for EUC-JP with DNP font encoding. + + * texinput/CJK.enc (\CJK@@@EUC-JPdnp@hook, \CJK@EUC-JPdnp@enc): New + macros. + + * texinput/JIS/EUC-JPdnp.enc: New file. + + * texinput/JIS/EUC-JP.chr (\CJK@shiftchar): Define \CJK@plane as + empty. + + * doc/history.txt, MANIFEST: Updated. + +2008-03-09 Werner LEMBERG <wl@gnu.org> + + Make \CJK@bold work with C49 encoding too. The idea is to handle + the font as a CJK font but with \CJK@plane set to empty. + + * texinput/SJIS/SJIS.chr, texinput/SJIS/SJIdnp.chr (\CJK@sjischar): + Define \CJK@plane as empty. + + * texinput/SJIS/c49song.fd: Use `CJK' size function. + + * doc/history.txt: Updated. + +2008-03-03 Werner LEMBERG <wl@gnu.org> + + * texinput/CJKutf8.sty, texinput/xCJK.sty, + texinput/mule/MULEenc.sty: Use \ProvidesPackage, not \ProvidesFile. + +2008-03-03 Werner LEMBERG <wl@gnu.org> + + Better control for \baselinestretch with CJKvert.sty. + + * texinput/CJKvert.sty (usebaselinestretch): New option. + (\CJKbaselinestretch): New macro. + + * doc/history.txt, doc/vertical.txt: Document it. + +2008-02-11 Werner LEMBERG <wl@gnu.org> + + * doc/xCJK.txt: New file. + * MANIFEST: Updated. + +2008-02-11 Werner LEMBERG <wl@gnu.org> + + * doc/fonts.txt: Document installation of cyberbit.ttf. + +2008-02-05 Werner LEMBERG <wl@gnu.org> + + Add SUN Wen-Chang's xCJK bundle. + + * examples/xCJK.tex, texinput/UTF8/xUTF8.chr, + texinput/UTF8/xUTF8.enc, texinput/xCJK.sty, texinput/xpmC.chr, + texinput/xpmC.enc: New files. + + * MANIFEST: Updated. + + * Makefile (XELATEX): New macro. + (xCJK): New target. + (CJK2DVI, LATE2DVI): Simplify. + +2008-01-15 Gernot Hassenpflug <aikishugyo@gmail.com> + + * contrib/wadalab/c70goth.fdx, contrib/wadalab/c70min.fdx, + contrib/wadalab/c70maru.fdx: Rotate more glyphs for vertical + typesetting. + Shift small kana for vertical typesetting. + Other minor improvements. + +2007-12-27 Werner LEMBERG <wl@gnu.org> + + * utils/subfonts/vertical.pe, utils/subfonts/vertref.pe: Abort if no + vertical glyph representation forms are available. + +2006-12-05 Werner LEMBERG <wl@gnu.org> + + Make pinyin syllables work with \MakeUppercase and \MakeLowercase. + + * pinyin.sty: Almost completely rewrite macro logic to replace e.g. + `\py@@@a' with `\py@ a' so that the argument gets handled by + \MakeUppercase. + +2006-12-04 Werner LEMBERG <wl@gnu.org> + + Make pinyin syllables work with hyperref bookmarks. + + * pinyin.sty: Use \AtBeginDocument hook to add missing characters to + PU encoding needed for pinyin syllables. + Use \AtBeginDocument hook to set up some replacement macros for + bookmarks. + (\py@hr@macron, \py@hr@v): New replacement macros for + bookmarks. + +2007-11-23 Werner LEMBERG <wl@gnu.org> + + * texinput/CJK.enc: Add punctuation tables for GBK encoding. + +2007-11-06 Werner LEMBERG <wl@gnu.org> + + * utils/subfonts/subfonts.pe, utils/subfonts/vertical.pe, + utils/subfonts/vertref.pe: Put current time stamp into copyright + string. + Need FontForge 20071105 or newer. + +2007-11-02 SUN Wenchang <sunwch@hotmail.com> + + * texinput/CJKfntef.sty (\CJK@preUnderdot): Use \cdot (in math mode). + (\CJKxout): Use `/' in math mode. + (\CJKunderdotbasesep, \CJKunderdotsep): Adjusted. + +2007-10-26 Werner LEMBERG <wl@gnu.org> + + * utils/subfonts/vertical.pe: Use glyph names of the horizontal + representation glyphs with an appended `.vert'. This makes dvipdfmx + automatically create a correct /ToUnicode CMap. + +2007-10-25 Werner LEMBERG <wl@gnu.org> + + Provide final fix for patch 2007-10-04. + + * utils/subfonts/makefdx.pl: Provide flag `-u' to produce a CMap + macro in the FDX file. + Don't specify FDX file directly on the command line but give family + name and encoding separately which are then concatenated to give the + FDX name (we need the family name separately). + Add code to produce a macro which provides a /ToUnicode CMap entry + as needed by pdfTeX. + Fix loop to not omit last glyph. + + * texinput/UTF8/c70bsmi.fdx, texinput/UTF8/c70bkai.fdx: Regenerated. + These now provide the macros \CJK@cmap@bsmiv and \CJK@cmap@bkaiv, + respectively. + + * texinput/CJKutf8.sty (\pickup@font): Call `\CJK@cmap@...' if it + exists. + +2007-10-04 Werner LEMBERG <wl@gnu.org> + + * texinput/CJKutf8.sty (\pickup@font): Disable generation of + ToUnicode cmap for `v' subfont (which holds vertical representation + glyphs). This is a temporary hack; the right solution is to modify + makefdx.pl so that it creates a ToUnicode macro for the specific + font; \CJK@addcmap should be then modified to use this macro instead + of autogenerating a cmap. + + Problem reported by Edward G.J. Lee. + +2007-09-10 Werner LEMBERG <wl@gnu.org> + + * utils/subfonts/vertical.pe, utils.subfonts/vertref.pe: Adapt to + FontForge version 2007-Sep-10 and newer. + +2007-07-26 Gernot Hassenpflug <gernot@nict.go.jp> + + * contrib/wadalab/c70goth.fdx, contrib/wadalab/c70min.fdx, + contrib/wadalab/c70maru.fdx: New files to support vertical writing + with Unicode encoded Wadalab fonts. + +2007-07-07 Werner LEMBERG <wl@gnu.org> + + * texinput/pinyin.sty (\ding): Rename to... + (\py@ding): This to make \ding work actually. + +2007-05-04 Werner LEMBERG <wl@gnu.org> + + * texinput/CJKvert.sty (\CJKsymbol): Honour \CJKhdef{offset}{...}. + * doc/fdxfiles.txt, doc/history.txt: Document it. + +2007-04-08 Werner LEMBERG <wl@gnu.org> + + * utils/pyhyphen/pyhyph.tex: Replace latin-1 characters with + ^^xx sequences. Suggested by David Kastrup. + + * doc/cjk-enc.txt: Document special space handling for Emacs quail + input methods. + +2006-11-06 Werner LEMBERG <wl@gnu.org> + + * texinput/pinyin.sty (\py@macron, \py@@@v): Support T5 encoding. + * doc/history.txt: Document it. + +2006-10-31 Werner LEMBERG <wl@gnu.org> + + * doc/CJK.txt, doc/CJKutf8.txt: Mention Byte Order Mark in UTF-8. + +2006-10-19 Werner LEMBERG <wl@gnu.org> + + * doc/TeXLive.txt, MANIFEST: Minor fixes. + + * Makefile (DVI2PDF): Add argument for paper format. + (CONVERT, MULE, LATEX): Add optional argument for paper format; + default to `letter'. + (manpages, cweb): Use letter paper format. + (READMEb5): Use A4 paper. + + * examples/README: Minor fix. + +2006-10-17 Werner LEMBERG <wl@gnu.org> + + Version 4.7.0 released + ====================== + + Set version to 4.7.0. + + * doc/history.txt, doc/INSTALL, doc/TeXLive.txt, README: Updated. + + Update headers in all text files. + +2006-10-09 Werner LEMBERG <wl@gnu.org> + + * Makefile (abs-distdir): Fix assignment. + (distdoc): Remove generated C files. + + * utils/hbf2gf/hbf2gf.1: s/`/\(oq/ and s/'/\(cq/ where appropriate. + +2006-10-06 Werner LEMBERG <wl@gnu.org> + + * doc/CJKutf8.txt, doc/history.txt: Minor additions. + * MANIFEST: Sorted and updated. + +2006-10-05 Werner LEMBERG <wl@gnu.org> + + * texinput/CJKutf8.sty (\CJK@surr): Use \expandafter to make + \uppercase work actually. + + * texinput/CJK.sty (\CJK@makeActive, \CJK@makeInactive): Handle 0x80 + also (which is needed for UTF8). + +2006-10-05 Werner LEMBERG <wl@gnu.org> + + * texinput/CJKutf8.sty (\CJK@surr): New function. + (\CJK@addcmap): Use \CJK@surr so that values > U+FFFF are correctly + represented as surrogates. + +2006-09-30 Werner LEMBERG <wl@gnu.org> + + In CJKutf8.sty, add ToUnicode cmaps for pdfTeX. Note, however, that + it currently fails with virtual fonts: pdftex 3.141592-1.30.4-2.2 + can't resolve them to the used base fonts. + + * texinput/CJKutf8.sty: Require ifpdf package. + (\pickup@font) [\ifpdf]: Redefine, adding a call to CJK@addcmap. + (\CJK@addcmap) [\ifpdf]: New function. + + * doc/history.txt: Updated. + +2006-09-16 Werner LEMBERG <wl@gnu.org> + + * texinput/CJK.sty (\CJK@ifundefined): New macro. + Update all affected files where possible to use it instead of + \@ifundefined. This fixes a bug reported by Danai which made + \chapter work in the `scrartcl' article class (instead of + reporting an error) after using a CJK caption file. + + * *.cap, *.cpx: Don't redefine \thepart but use its previous + definition for \partformat. This fixes a bug reported by Danai + which produced bad TOC entries. + + * doc/history.txt: Updated. + +2006-09-12 Werner LEMBERG <wl@gnu.org> + + * texinput/UTF8/ko-Hanj.cpx: Renamed to... + * texinput/UTF8/ko-Hani.cpx: This to use the correct ISO 15924 + script tag. + + * doc/history.txt, doc/CJK.txt: Updated. + +2006-09-08 Werner LEMBERG <wl@gnu.org> + + Add caption files for UTF8 encoding. + + * texinput/UTF8/{ja,ko-Hang,ko-Hang2,ko-Hanj,zh-Hans,zh-Hant}.cap: + New files. + + * doc/history.txt, doc/CJK.txt: Mention them. + +2006-08-31 Werner LEMBERG <wl@gnu.org> + + Reimplement the \CJKbold mechanism to call the last argument of + \DeclareFontShape each time the font is selected only if a CJK size + function has been used. This fixes shape declarations like the ones + in the fourier package which rely on being called only once. + + * texinput/CJK.sty (\CJK@curr@fontshape): New macro. + (\CJK@empty, \CJK@fixed, \CJK@sub, \CJK@DNPgen, \CJK@DNP): Define a + macro where the name is the argument of \CJK@curr@fontshape. + (\selectfont): Execute macro where the name is the argument of + \CJK@curr@fontshape only if it exists. + + * doc/history.txt, doc/CJK.txt: Mention it. + +2006-08-29 Danai SAE-HAN <danai.sae-han@skynet.be> + + * utils/subfonts/hlatex2agl.pl: Make it accept a third parameter + which specifies the used SFD file. + (process_afmfile, process_pfbfile): Add minor tweaks to handle fonts + generated with other tools than FontForge. + +2006-08-29 Werner LEMBERG <wl@gnu.org> + + * utils/Bg5conv/bg5conv.w, utils/extconv/extconv.w, + utils/hbf2gf/hbf2gf.w, utils/CEFconv/cefconv.w, + utils/CEFconv/cef5conv.w, utils/CEFconv/cefsconv.w, + utils/SJISconv/sjisconv.w: s/@/@@/ in email address. + + * utils/Bg5conv/bg5conv.c, utils/extconv/extconv.c, + utils/hbf2gf/hbf2gf.c, utils/CEFconv/cefconv.c, + utils/CEFconv/cef5conv.c, utils/CEFconv/cefsconv.c, + utils/SJISconv/sjisconv.c: Removed. These files are now generated + by the Makefile. + + * Makefile (version): Set to 4.7.0. + (CJK2DVI, LATEX2DVI): Add `texlive' subdirectory + (distsrc): Build .c from .w files. + +2006-08-28 Werner LEMBERG <wl@gnu.org> + + * texinput/*: Add various replacement files for TeXLive. + +2006-08-17 Werner LEMBERG <wl@gnu.org> + + * doc/CJK.txt: Mention problem with fourier.sty. + +2006-08-01 Werner LEMBERG <wl@gnu.org> + + * doc/cjk-enc.txt: Mention problems with UTF-8. + +2006-07-30 Werner LEMBERG <wl@gnu.org> + + * contrib/wadalab/DNP.txt: Fix patch for wftodm.c. + +2006-04-25 Danai SAE-HAN <danai.sae-han@skynet.be> + + * <many files>: Add GPL. + * MANIFEST: New file. + +2006-03-25 Werner LEMBERG <wl@gnu.org> + + * texinput/CJKutf8.sty (\pdfstringdefPreHook): Don't overwrite but + prepend to this macro. + +2006-03-23 Werner LEMBERG <wl@gnu.org> + + * utils/subfonts/hlatex2agl.pl: New script (which has been used + to create the Korean fonts in TeXLive 2005). + + + * texinput/CJKutf8.sty: Add support for Unicode bookmarks. + (\CJK@UnicodeFourBytesFirst, \CJK@UnicodeFourBytesSecond, + \CJK@UnicodeFourBytesThird, \CJK@UnicodeThreeBytesFirst, + \CJK@UnicodeThreeBytesSecond, \CJK@UnicodeTwoBytesFirst, + \CJK@UnicodeLast): New macros to convert UTF-8 into UTF-16BE. + (\CJK@XXpdf, \CJK@XXXpdf, \CJK@XXXXpdf): Replacements for the + \CJK@XX, \CJK@XXX, and \CJK@XXXX macros, respectively. + (\pdfstringdefPreHook): Activate them. + +2006-03-22 Werner LEMBERG <wl@gnu.org> + + * texinput/KS/HLaTeX/c63sh.fd, texinput/KS/HLaTeX/c64sh.fd, + texinput/KS/HLaTeX/c65sh.fd: Fix font declaration. Bug reported by + Danai SAE-HAN <danai.sae-han@skynet.be>. + +2006-02-20 Werner LEMBERG <wl@gnu.org> + + * texinput/UTF8/UTF8.bdg: Bugfix: Handle 0x80 also. + + * doc/history.txt: Mention it. + +2006-02-09 Werner LEMBERG <wl@gnu.org> + + Support complete Unicode range (up to U+10FFFF). + + * texinput/UTF8/UTF8.bdg: Handle leading characters 0xF0-0xF4. + + * texinput/UTF8/UTF8.enc: Ditto. + + * texinput/UTF8/UTF8.chr (\CJK@altxchar): New macro for four-byte + Unicode values. + + * texinput/CJK.enc (\CJK@unicodexError): New error macro. + + * texinput/CJK.sty (\CJK@numbxToHex): New auxiliary macro to convert + a number to a four-digit hex number string. + (\Unicode): Accept values greater than U+FFFF. + + * doc/command.txt, doc/CJK.txt: Document extended \Unicode (and + \CJKchar) command. + * doc/history.txt: Updated. + +2006-01-23 Werner LEMBERG <wl@gnu.org> + + * texinput/CJK.enc (\CJK@HK@enc): Load `HK' encoding, not `Bg5'. + Use \def, not \@namedef. + + * doc/CJK.txt: Mention `HKtext' environment. + +2006-01-22 Werner LEMBERG <wl@gnu.org> + + Add new encoding `HK' (C05) for Hong Kong's HKSCS-2004. + + * texinput/Bg5/HK.enc, texinput/Bg5/c05song.fd: New files. + * texinput/CJK.enc: Add support for `HK' (C05). + * texinput/CJKnumb.sty: Handle `HK'. + + * doc/CJK.txt: Bg5+ *cannot* be used for HKSCS. Fix this. + * doc/history.txt: Document `HK' encoding. + +2006-01-19 Werner LEMBERG <wl@gnu.org> + + * doc/CJK.txt: Mention usage of Bg5+ for HKSCS-2001/HKSCS-2004. + +2006-01-04 Werner LEMBERG <wl@gnu.org> + + * texinput/pinyin.sty (\PYding): New \let. + (\PYactivate, \PYdeacticate): Handle \ding (from pifont.sty). + + * doc/pinyin.tex: Document possible problems with pifont.sty. + + * doc/history.txt: Updated. + +2005-12-27 Werner LEMBERG <wl@gnu.org> + + * utils/hbf2gf/cfg/csso12.cfg: Fix typo. + +2005-10-31 Danai SAE-HAN <danai.sae-han@skynet.be> + + * utils/subfonts/makefdx.pl: Provide header for output. + Add \CJKvlet lines. + +2005-08-19 Werner LEMBERG <wl@gnu.org> + + * doc/TeXLive.txt: New file, describing the relationship between + CJK files and TeXLive packages. + +2005-08-18 Werner LEMBERG <wl@gnu.org> + + * texinput/mule/MULEenc.sty: Define \CJK@verbatim correctly if not + already defined. Reported by Andre Dierker. + + * doc/pdf/*: Move to... + * doc/pdfhowto/*: This. + +2005-08-11 Werner LEMBERG <wl@gnu.org> + + Version 4.6.0 released + ====================== + + Set version to 4.6.0. + + * doc/history.txt, doc/INSTALL, Makefile (version): Updated. + + Update headers in all text files. + +2005-08-10 Werner LEMBERG <wl@gnu.org> + + * doc/CEF.txt, doc/CJK.txt, doc/CJKutf8.txt, doc/INSTALL, + doc/TDS.txt, doc/cjk-enc.txt, doc/commands.txt, doc/dvidrv.txt, + doc/fonts.txt, doc/hbf2gf.txt, doc/history.2_5, doc/history.txt, + doc/pinyin.txt, doc/pyhyphen.txt, doc/ruby.txt, doc/thaifont.txt, + doc/vertical.txt: Updated and revised. + +2005-08-05 Werner LEMBERG <wl@gnu.org> + + * COPYING: Updated to new FSF address. + +2005-08-05 Werner LEMBERG <wl@gnu.org> + + After email exchange with Ross Paterson, the old (too restrictive) + license of the hbf module has been changed to the three-clause BSD + license -- Ross no longer maintains and distributes this code. + + * utils/hbf2gf/hbf.c: Change license to BSD. + (strdup) [WIN32]: Define. Change taken from teTeX distribution. + + * utils/hbf2gf/hbf.h: Change license to BSD. + + * utils/hbf2gf/config.guess, utils/hbf2gf/config.sub: Updated to + current versions. + + * utils/hbf2gf/configure: Regenerated with autoconf 2.59b. + +2005-08-04 Werner LEMBERG <wl@gnu.org> + + Update files to compile with the forthcoming TeXLive 2005. + + * doc/README: Updated, extended. + + * examples/muletest.tex: Updated to new VnTeX (for Vietnamese). + Use type1ec.sty. + Suppress hyphenation. + + * examples/CJKbabel.tex: Don't use t5.sty but `vietnam' option of + babel. + Use type1ec.sty. + + * examples/CJKmixed.tex: Define and use `TChinese' environment. + Call \CJKhorz at the beginning of document. + + * examples/CJKutf8.tex: Don't use cyberbit but the new Unicode + (virtual) fonts of gbsn, bsmi, and mj. + + * texinput/Bg5/c00bsmi.fdx: Updated to new bsmi vertical glyph font. + + * texinput/Bg5/c00bkai.fdx: New file. + + * texinput/UTF8/c70bkai.fd, texinput/UTF8/c70bkai.fdx, + texinput/UTF8/c70bsmi.fd, texinput/UTF8/c70bsmi.fdx, + texinput/UTF8/c60gbsn.fd, texinput/UTF8/c70gkai.fd, + texinput/UTF8/c70mj.fd: New files. + + * utils/pyhyphen/pytest.tex: Usae type1ec.sty. + + * Makefile: Add rules for new example and documentation files. + (version): Set top 4.5.3. + (CJK2DVI, LATEX2DVI): Add `utils/pyhyphen' to TEXINPUTS variable. + (DVI2PS): Replace it with... + (DVI2PDF): New variable. + Update all callers. + (MULE): Add path to `cjk-enc.el' while calling emacs. + (DISTTARGETS): Add new example and documentation files. + (predistdoc): Don't create `ps' but `pdf' subdirectories. + (manpages): Add `-ww' option to groff. + Don't create `ps' but `pdf' files. + (cweb): Don't create `ps' but `pdf' file. + +2005-08-04 Werner LEMBERG <wl@gnu.org> + + * doc/*.doc, doc/japanese/*.doc, doc/chinese/*.doc, + contrib/wadalab/DNP.doc: Renamed to ... + * doc/*.txt, doc/japanese/*.txt, doc/chinese/*.txt, + contrib/wadalab/DNP.txt: This. + + Update all references. + +2005-08-03 Werner LEMBERG <wl@gnu.org> + + * texinput/CJKvert.sty (\CJKvert, \CJKhorz): Make commands act + completely local. + * doc/history.txt: Mention it. + + * doc/pdf/HOWTO.txt: Mention new $SFDFONTS variable from TDS 1.1. + +2005-08-02 Werner LEMBERG <wl@gnu.org> + + Update of HLaTeX support to version 1.0.1. + + * texinput/KS/HLaTeX/c63mg.fd, texinput/KS/HLaTeX/c63mgt.fd, + texinput/KS/HLaTeX/c63mmj.fd, texinput/KS/HLaTeX/c63mnv.fd, + texinput/KS/HLaTeX/c63msr.fd, texinput/KS/HLaTeX/c63ol.fd, + texinput/KS/HLaTeX/c63pbm.fd, texinput/KS/HLaTeX/c63pgr.fd, + texinput/KS/HLaTeX/c63pgs.fd, texinput/KS/HLaTeX/c63pgt.fd, + texinput/KS/HLaTeX/c63pmg.fd, texinput/KS/HLaTeX/c63pmgt.fd, + texinput/KS/HLaTeX/c63pmj.fd, texinput/KS/HLaTeX/c63pmmj.fd, + texinput/KS/HLaTeX/c63pmnv.fd, texinput/KS/HLaTeX/c63pmsr.fd, + texinput/KS/HLaTeX/c63pol.fd, texinput/KS/HLaTeX/c63ppg.fd, + texinput/KS/HLaTeX/c63ppn.fd, texinput/KS/HLaTeX/c63psm.fd, + texinput/KS/HLaTeX/c63ptt.fd, texinput/KS/HLaTeX/c63pyt.fd, + texinput/KS/HLaTeX/c63sm.fd, texinput/KS/HLaTeX/c63tt.fd, + texinput/KS/HLaTeX/c64mg.fd, texinput/KS/HLaTeX/c64mgt.fd, + texinput/KS/HLaTeX/c64mmj.fd, texinput/KS/HLaTeX/c64mnv.fd, + texinput/KS/HLaTeX/c64msr.fd, texinput/KS/HLaTeX/c64ol.fd, + texinput/KS/HLaTeX/c64pbm.fd, texinput/KS/HLaTeX/c64pgr.fd, + texinput/KS/HLaTeX/c64pgs.fd, texinput/KS/HLaTeX/c64pgt.fd, + texinput/KS/HLaTeX/c64pmg.fd, texinput/KS/HLaTeX/c64pmgt.fd, + texinput/KS/HLaTeX/c64pmj.fd, texinput/KS/HLaTeX/c64pmmj.fd, + texinput/KS/HLaTeX/c64pmnv.fd, texinput/KS/HLaTeX/c64pmsr.fd, + texinput/KS/HLaTeX/c64pol.fd, texinput/KS/HLaTeX/c64ppg.fd, + texinput/KS/HLaTeX/c64ppn.fd, texinput/KS/HLaTeX/c64psm.fd, + texinput/KS/HLaTeX/c64ptt.fd, texinput/KS/HLaTeX/c64pyt.fd, + texinput/KS/HLaTeX/c64sm.fd, texinput/KS/HLaTeX/c64tt.fd, + texinput/KS/HLaTeX/c65mg.fd, texinput/KS/HLaTeX/c65mgt.fd, + texinput/KS/HLaTeX/c65mmj.fd, texinput/KS/HLaTeX/c65mnv.fd, + texinput/KS/HLaTeX/c65msr.fd, texinput/KS/HLaTeX/c65ol.fd, + texinput/KS/HLaTeX/c65pbm.fd, texinput/KS/HLaTeX/c65pgr.fd, + texinput/KS/HLaTeX/c65pgs.fd, texinput/KS/HLaTeX/c65pgt.fd, + texinput/KS/HLaTeX/c65pmg.fd, texinput/KS/HLaTeX/c65pmgt.fd, + texinput/KS/HLaTeX/c65pmj.fd, texinput/KS/HLaTeX/c65pmmj.fd, + texinput/KS/HLaTeX/c65pmnv.fd, texinput/KS/HLaTeX/c65pmsr.fd, + texinput/KS/HLaTeX/c65pol.fd, texinput/KS/HLaTeX/c65ppg.fd, + texinput/KS/HLaTeX/c65ppn.fd, texinput/KS/HLaTeX/c65psm.fd, + texinput/KS/HLaTeX/c65ptt.fd, texinput/KS/HLaTeX/c65pyt.fd, + texinput/KS/HLaTeX/c65sm.fd, texinput/KS/HLaTeX/c65tt.fd: Removed. + + * texinput/KS/HLaTeX/c63dn.fd, texinput/KS/HLaTeX/c63jgt.fd, + texinput/KS/HLaTeX/c63jmj.fd, texinput/KS/HLaTeX/c63jnv.fd, + texinput/KS/HLaTeX/c63jsr.fd, texinput/KS/HLaTeX/c63pga.fd, + texinput/KS/HLaTeX/c63ph.fd, texinput/KS/HLaTeX/c63sh.fd, + texinput/KS/HLaTeX/c63tz.fd, texinput/KS/HLaTeX/c63vd.fd, + texinput/KS/HLaTeX/c64dn.fd, texinput/KS/HLaTeX/c64jgt.fd, + texinput/KS/HLaTeX/c64jmj.fd, texinput/KS/HLaTeX/c64jnv.fd, + texinput/KS/HLaTeX/c64jsr.fd, texinput/KS/HLaTeX/c64pga.fd, + texinput/KS/HLaTeX/c64ph.fd, texinput/KS/HLaTeX/c64sh.fd, + texinput/KS/HLaTeX/c64tz.fd, texinput/KS/HLaTeX/c64vd.fd, + texinput/KS/HLaTeX/c65dn.fd, texinput/KS/HLaTeX/c65jgt.fd, + texinput/KS/HLaTeX/c65jmj.fd, texinput/KS/HLaTeX/c65jnv.fd, + texinput/KS/HLaTeX/c65jsr.fd, texinput/KS/HLaTeX/c65pga.fd, + texinput/KS/HLaTeX/c65ph.fd, texinput/KS/HLaTeX/c65sh.fd, + texinput/KS/HLaTeX/c65tz.fd, texinput/KS/HLaTeX/c65vd.fd: New files. + + * texinput/KS/HLaTeX/c63bm.fd, texinput/KS/HLaTeX/c63gr.fd, + texinput/KS/HLaTeX/c63gs.fd, texinput/KS/HLaTeX/c63gt.fd, + texinput/KS/HLaTeX/c63mj.fd, texinput/KS/HLaTeX/c63pg.fd, + texinput/KS/HLaTeX/c63pn.fd, texinput/KS/HLaTeX/c63yt.fd, + texinput/KS/HLaTeX/c64bm.fd, texinput/KS/HLaTeX/c64gr.fd, + texinput/KS/HLaTeX/c64gs.fd, texinput/KS/HLaTeX/c64gt.fd, + texinput/KS/HLaTeX/c64mj.fd, texinput/KS/HLaTeX/c64pg.fd, + texinput/KS/HLaTeX/c64pn.fd, texinput/KS/HLaTeX/c64yt.fd, + texinput/KS/HLaTeX/c65bm.fd, texinput/KS/HLaTeX/c65gr.fd, + texinput/KS/HLaTeX/c65gs.fd, texinput/KS/HLaTeX/c65gt.fd, + texinput/KS/HLaTeX/c65mj.fd, texinput/KS/HLaTeX/c65pg.fd, + texinput/KS/HLaTeX/c65pn.fd, texinput/KS/HLaTeX/c65yt.fd: Updated. + + * texinput/KS/HLaTeX/pshan.sty: No longer needed. Make it empty for + backwards compatibility. + + * texinput/CJK.enc (\CJK@KSHL@enc): Updated. + + * doc/history.txt, doc/CJK.doc: Updated. + +2005-08-01 Werner LEMBERG <wl@gnu.org> + + * utils/subfont/uni2sfd.pl (read_tfmfile): Fix reading CHARWD, + CHARHT, and CHARDP. + +2005-07-31 Werner LEMBERG <wl@gnu.org> + + * utils/subfont/sfd2uni.pl: New script to produce Unicode virtual + subfonts from encoding specific subfonts. + +2005-07-29 Werner LEMBERG <wl@gnu.org> + + * contrib/wadalab/DNP.sfd: Fix typo. Found by Shunsaku Hirata. + * contrib/wadalab/fixwada2.pl: Since Wadalab fonts have already + been uploaded to CTAN, and the bug in DNP.sfd makes it necessary to + regenerate the fonts, and to update the version number and creation + date. + +2005-07-18 Werner LEMBERG <wl@gnu.org> + + * utils/subfonts/makefdx.pl, utils/subfonts/uni2sfd.pl: Fix typos. + + * utils/subfonts/clonevf.pl: New script to produce a VF clone of + a TFM file. + +2005-07-18 Werner LEMBERG <wl@gnu.org> + + * utils/subfonts/makefdx.pl: New script to create FDX entries. + +2005-07-17 Werner LEMBERG <wl@gnu.org> + + * utils/subfonts/subfonts.pe, utils/subfonts/uni2sfd.pl, + utils/subfonts/vertical.pe, utils/vertref.pe: New perl and FontForge + scripts for creating and handling subfonts. + +2005-07-12 Werner LEMBERG <wl@gnu.org> + + * contrib/wadalab/fixwada2.pl, contrib/wadalab/makeuniwada.pl: New + scripts which fix glyph names and create virtual Unicode fonts for + the Wadalab font families. + + * contrib/wadalab/DNP.sfd: A subfont definition file used by + `fixwada2.pl' and `makeuniwada.pl'. + + * contrib/wadalab/c70goth.fd, contrib/wadalab/c70maru.fd, + contrib/wadalab/c70min.fd: New font definition files for Wadalab + fonts in Unicode encoding. + + * contrib/wadalab/DNP.doc: Completely revised and updated. + +2005-07-07 Werner LEMBERG <wl@gnu.org> + + * doc/history.txt: Updated. + +2005-07-05 Werner LEMBERG <wl@gnu.org> + + * utils/thaifont/tools/c90.etx: Fix some typos. + +2005-07-04 Werner LEMBERG <wl@gnu.org> + + Update Thai support: + + . Use fontinst. We no longer need virtual fonts. + . Replace support for dbtt (which has an uncertain license) with + garuda. + . Update to TDS 1.1. + + * utils/thaifont/texmf/dvips/base/dbtt.enc: Removed. + * utils/thaifont/texmf/dvips/config/config.dbtt: Removed. + * utils/thaifont/texmf/dvips/config/dbtt.map: Removed. + * utils/thaifont/texmf/fonts/tfm/public/dbtt/*: Removed. + * utils/thaifont/texmf/fonts/vf/public/dbtt/*: Removed. + + * utils/thaifont/texmf/dvips/base/norasi.enc: Removed. + * utils/thaifont/texmf/dvips/config/config.norasi: Move to... + * utils/thaifont/texmf/dvips/norasi/config.norasi: Here. + * utils/thaifont/texmf/dvips/config/norasi.map: Moved to... + * utils/thai/font/texmf/fonts/map/dvips/norasi/norasi.map: Here. + Updated. + * utils/thaifont/texmf/fonts/tfm/public/norasi/ftnr9z.tfm, + utils/thaifont/texmf/fonts/tfm/public/norasi/ftnb9z.tfm, + utils/thaifont/texmf/fonts/tfm/public/norasi/ftnbo9z.tfm, + utils/thaifont/texmf/fonts/tfm/public/norasi/ftno9z.tfm: Removed. + * utils/thaifont/texmf/fonts/tfm/public/norasi/ftnr8z.tfm, + utils/thaifont/texmf/fonts/tfm/public/norasi/ftnb8z.tfm, + utils/thaifont/texmf/fonts/tfm/public/norasi/ftnbo8z.tfm, + utils/thaifont/texmf/fonts/tfm/public/norasi/ftno8z.tfm: Updated. + * utils/thaifont/texmf/fonts/vf/public/norasi/*: Removed. + + * utils/thaifont/texmf/dvips/garuda/config.garuda: New file. + * utils/thaifont/texmf/fonts/map/dvips/garuda/garuda.map: New file. + * utils/thaifont/texmf/fonts/tfm/public/garuda/fgdr8z.tfm, + utils/thaifont/texmf/fonts/tfm/public/garuda/fgdb8z.tfm, + utils/thaifont/texmf/fonts/tfm/public/garuda/fgdbo8z.tfm, + utils/thaifont/texmf/fonts/tfm/public/garuda/fgdo8z.tfm: New files. + + * utils/thaifont/texmf/fonts/enc/dvips/thai/c90.enc: New file, + generated by fontinst. + + * utils/thaifont/tools/c90.etx: New file. + * utils/thaifont/tools/c90.mtx: New file. + * utils/thaifont/tools/garuda.fontinst: New file. + * utils/thaifont/tools/norasi.fontinst: New file. + * utils/thaifont/tools/INSTALL: New file. + * utils/thaifont/tools/dbtt-old/*: New files. + * utils/thaifont/tools/README: Removed. + * utils/thaifont/tools/thai-dummy.afm: Removed. + * utils/thaifont/tools/thai.enc: Removed. + * utils/thaifont/tools/thailigs.vpl: Removed. + + * texinput/thai/c90cmss.fd, texinput/thai/c90cmtt.fd, + texinput/thai/c90nrsr.fd: Updated. + * texinput/thai/c90dbss.fd: Removed. + * texinput/thai/c90gar.fd: New file. + +2005-06-27 Werner LEMBERG <wl@gnu.org> + + Remove the `rotate' keyword for vertical typesetting and introduce + the opposite, `norotate'. + + * texinput/Bg5/c00bsmir.fdx, texinput/Bg5/c00kair.fdx: New files. + + * doc/fdxfiles.doc, doc/vertical.doc, texinput/Bg5/c00bsmi.fdx, + texinput/GB/c10gbsn.fdx, texinput/CJKvert.sty: Updated. + +2005-06-25 Werner LEMBERG <wl@gnu.org> + + * examples/CJKmixed.tex: New example file to demonstrate how to + use CJK scripts vertically and horizontally at the same time. + +2005-06-24 Werner LEMBERG <wl@gnu.org> + + * doc/vertical.doc: Mention that you need an `.fdx' file if you + want to use rotated glyphs for vertical typesetting. + +2005-05-23 Werner LEMBERG <wl@gnu.org> + + * doc/CJK.doc: Improve documentation of `encapsulated' option. + Suggested by Brian Murphy. + +2005-04-26 Werner LEMBERG <wl@gnu.org> + + * texinput/UTF8/UTF8.chr (\CJK@punctchar): Wrap code after \usefont + into three groups to make it work with CJKulem.sty. + + * texinput/CJKutf8.sty, examples/CJKutf8.tex, doc/CJKutf8.doc: New + files. + + * doc/history.txt: Updated. + +2005-04-22 Werner LEMBERG <wl@gnu.org> + + * utils/lisp/emacs/cjk-enc.el (cjk-viscii-lower, cjk-viscii-upper), + utils/lisp/mule-2.3/cjk-enc.el (cjk-viscii-lower, cjk-viscii-upper): + Update to next vntex version which no longer uses dblaccnt.sty. + +2005-03-27 Werner LEMBERG <wl@gnu.org> + + * texinput/CJK.sty (\CJKspace): Don't use \relax but \@empty. + +2005-03-02 Werner LEMBERG <wl@gnu.org> + + * doc/CJK.doc: Mention `CJKbookmarks' option of hyperref package. + +2005-02-23 Werner LEMBERG <wl@gnu.org> + + * README: Updated. No public CVS access possible currently. + +2004-07-26 Werner LEMBERG <wl@gnu.org> + + * utils/lisp/emacs/thai-word.el (thai-word-table): Use Thai word + list from IBM's ICU4J project; it is slightly larger and uses an + X license. + +2004-07-25 Werner LEMBERG <wl@gnu.org> + + * utils/lisp/emacs-20.3/*: Moved to... + * utils/lisp/emacs/*: This. + + * utils/thaifont/tools/thai.enc: Minor updates. Will be replaced + with a fontinst solution soon. + +2004-06-08 Werner LEMBERG <wl@gnu.org> + + * doc/reftex.doc: New file. + * doc/history.txt: Updated. + +2004-06-07 Werner LEMBERG <wl@gnu.org> + + * utils/lisp/emacs-20.3/cjk-enc.el (cjk-write-all-files): Handle + case where files are in other directories. Bug reported by Hartwig + Crailsheim. + + * doc/cjk-enc.doc, doc/history.txt: Updated. + +2004-06-04 Werner LEMBERG <wl@gnu.org> + + * contrib/wadalab/c42goth.fdx, contrib/wadalab/c42maru.fdx, + contrib/wadalab/c42min.fdx: Don't rotate the Hiragana-Katagana + prolongation mark. + + * doc/vertical.doc: Updated. + Move text describing .fdx files to... + * doc/fdxfiles.doc: New file. + + * texinput/CJK.sty: Minor spelling improvements. + +2004-06-03 Werner LEMBERG <wl@gnu.org> + + * contrib/wadalab/DNP.doc: Improve patch for wftodm.c. + +2004-04-29 Werner LEMBERG <wl@gnu.org + Wenchang Sun <sunwch@hotmail.com> + + Add a style file for various CJK font effects. + + * texinput/CJKfntef.sty, examples/CJKfntef.tex: New files. + * doc/CJK.doc, doc/history.txt: Document it. + +2004-03-13 Werner LEMBERG <wl@gnu.org> + + * texinput/*.enc: Replace \relax with \@empty in the \CJK@namegdef + assignments to assure that we only have expansion at this macro + level. + + * doc/history.txt: Updated. + +2004-02-08 Werner LEMBERG <wl@gnu.org> + + Bug fix: Umlaut u with diacritic appears bold. + + * texinput/pinyin.sty (\py@@@v): Apply kerning at correct place. + +2004-02-07 Werner LEMBERG <wl@gnu.org> + + Bug fix: Umlaut u with macron above was broken. + + * texinput/pinyin.sty (\py@macron): Add second argument to + initialize \dimen@. Update all callers. + +2004-02-06 Werner LEMBERG <wl@gnu.org> + + Bug fix: Use user-defined \CJKglue value. + + * texinput/CJKulem.sty (\CJK@skip): New skip register. + (\UL@CJKglue): Use it. + (\UL@hook): Initialize \CJK@skip. + Move assignments of \LA@CJKglue, \LA@Thaiglue, and \LA@Thaibreak + to here. + +2004-02-05 Wenchang Sun <sunwch@hotmail.com> + + Bug fix: Disable line breaks before a post-punctuation CJK glyph + when \uline, \uwave, etc., are used. + + * texinput/CJK.sty (\CJKnobreakglue): New macro. + (\Unicode): Use it. + + * texinput/CJKulem.sty (\UL@CJKnobreakglue): New macro. + + * texinput/standard.chr, texinput/extended.chr, texinput/pmC.chr, + texinput/Bg5/bg5.chr, texinput/JIS/EUC-JP.chr, + texinput/SJIS/SJIS.chr, texinput/SJIS/SJISdnp.chr, + texinput/UTF8/UTF8.chr, texinput/CNS/EUC-TW.chr (\CJK@char, + \CJK@charx, \CJK@punctchar, \CJK@punctcharx): Use \CJKnobreakglue. + +2004-02-02 Hin-Tak Leung <htl10@users.sourceforge.net> + + * doc/pdf/*: New directory tree documenting usage of CJK for + improved PDF output. + * doc/history.txt: Document it. + +2004-01-29 Wenchang Sun <sunwch@hotmail.com> + + * texinput/CJK.sty (\CJKpunctsymbol): New \let to \CJKsymbol. + + * texinput/standard.chr, texinput/extended.chr, texinput/pmC.chr, + texinput/Bg5/bg5.chr, texinput/JIS/EUC-JP.chr, texinput/KS/KS.chr, + texinput/SJIS/SJIS.chr, texinput/SJIS/SJISdnp.chr, + texinput/UTF8/UTF8.chr, texinput/CNS/EUC-TW.chr (\CJK@punctchar, + \CJK@punctcharx): Replace \CJKsymbol with \CJKpunctsymbol. + +2003-10-12 Werner LEMBERG <wl@gnu.org> + + A first step to allow modification of horizontal character widths + which is needed for CJK fonts which don't have punctuation glyphs + centered within the CJK square. The same mechanism will work with + vertical glyphs also; since a common interface will differ from the + current implementation, *.fdv files are renamed to *.fdx. Note that + special character width handling of punctuation characters is still + missing. + + * texinput/CJK.sty (\CJK@load@fdx): New function, used as a hook + for \try@load@fontshape. It defines the macros \CJKhdef, \CJKhlet, + \CJKvdef, and \CJKvlet. The writing direction is appended to the + character macros -- this also fixes a bug for vertical writing + support with Big5 encoding (some characters disappeared in the + output without any warning due to character macro name clashes with + the subfont macro names). + (\CJK@direction): New macro to select the writing direction. + (\ifCJK@vertical@): Moved to CJKvert.sty. + + * texinput/CJKvert.sty (\ifCJK@vertical@): Moved from CJK.sty. + (\CJKvert, \CJKhorz): Set \CJK@direction. + (\CJKsymbol): Updated to use writing direction. + (\CJK@load@fdv): Removed. + + * texinput/*.chr: Simplified since \ifCJK@vertical@ is no longer + needed. + + * texinput/*.fdv, contrib/wadalab/*.fdv: Renamed to... + * texinput/*.fdx, contrib/wadalab/*.fdx: This. + +2003-10-25 Werner LEMBERG <wl@gnu.org> + + * texinput/mule/MULEenc.sty: Fix positions of \texordfeminine and + \textordmasculine. + +2003-09-20 Werner LEMBERG <wl@gnu.org> + + With the help of Paul Eggert <eggert@twinsum.com> and Edward G.J. + Lee <edt1023@ms17.hinet.net>, the conversion scripts now accept + parameters. + + * utils/Bg5conv/bg5{pdf,}latex, + utils/CEFconv/{cef5{pdf,}latex,cef{pdf,}latex,cefs{pdf,}latex}, + utils/SJISconv/sjis{pdf,}latex, + utils/extconv/{bg5+{pdf,}latex,gbk{pdf,}latex}: Rewritten to accept + arguments. + * doc/history.txt: Updated. + +2003-09-16 Werner LEMBERG <wl@gnu.org> + + * utils/Bg5conv/bg5pdflatex, + utils/CEFconv/{cef5pdflatex,cefpdflatex,cefspdflatex}, + utils/SJISconv/sjispdflatex, + utils/extconv/{bg5+pdflatex,gbkpdflatex}: New scripts to call + pdflatex. + * doc/history.txt: Updated. + +2003-07-06 Werner LEMBERG <wl@gnu.org> + + * texinput/mule/MULEenc.sty: Add some \@gobble macros in commands + defined with \mule@def. + Change definition of Thai EOL macro to make it really work. + (\mule@ignorespaces, \Thaispace, \Thainospace): New macros. + + * doc/cjk-enc.doc, doc/history.txt: Document \Thaispace and + \Thainospace. + +2003-03-30 Werner LEMBERG <wl@gnu.org> + + * doc/CJK.doc: Add item how to handle \bibliography which has + author names containing CJK characters. + + * utils/hbf2gf/hbf2gf.1: Minor workarounds for current grohtml bugs. + +2003-03-28 Werner LEMBERG <wl@gnu.org> + + Version 4.5.2 released + ====================== + + Update version numbers and time stamps in all non-binary files. + +2003-03-19 Werner LEMBERG <wl@gnu.org> + + Add improved support for pseudo-vertical typesetting. Based on + ideas by Robert Fendt <robert.fendt@epost.de>. + + * texinput/CJK.sty (\ifCJK@vertical@): New if. + + * texinput/CJKvert.sty: Require `graphicx' package. + (\CJKvert, \CJKhorz, \CJKvdef, \CJKvlet, \CJKsymbolsimple): New + commands. + (\CJKsymbol): Add support for vertical parameters (`rotate', + `offset', `fullheight, `height') in the new *.fdv files. + (\CJK@load@fdv): New command to be appended to LaTeX's + \try@load@fontshape. + + * texinput/*/*.chr: Replace calls to \CJKsymbol with an extended + version which, if \CJKvert is active, checks the existence of a + macro + + \<encoding>/<family>/<series>/<shape>/<plane>/<code> + + This macro is then called if it exists, instead of calling + \CJKsymbol. For halfwidth katakana, the macro is called + + \<encoding>/<family>/<series>/<shape>/<code> + + For HLaTeX, the macro is called + + \<encoding>/<family>/<series>/<shape>/<first byte>/<second byte> + + For UTF8, only characters in the range 0x800-0xFFFF get the new + code. + + <code>, <first byte>, and <second byte> are decimal numbers. + + * contrib/wadalab/c42{goth,maru,min}.fdv, + contrib/wadalab/c52{maru,min}.fdv, texinput/Bg5/c00bsmi.fdv, + texinput/GB/c10gbsn.fdv: New files containing information for + vertical typesetting. + + * examples/Big5vert.tex: Use font shape `bsmi'. + + * doc/history.txt, doc/chinese/README, contrib/wadalab/DNP.doc, + doc/vertical.doc, examples/README, README: Updated. + + * Makefile (DVI2PS): Load bsmilp.map and gbsnlp.map. + (cweb): Fix typo (cms->cmz). + + * utils/hbf2gf/config.guess, utils/hbf2gf/config.sub: Updated to + current versions. + + * utils/extconv/extconv.w: Remove duplicated lines. + Fix incorrect use of \@. + * utils/extconv/extconv.c: Regenerated. + +2003-03-18 Werner LEMBERG <wl@gnu.org> + + * texinput/pinyin.sty (\rua): New syllable. While only dialect, it + actually is used... + +2003-03-12 Werner LEMBERG <wl@gnu.org> + + * texinput/pinyin.sty (\den, \chua): Add missing syllables (found by + Jean-Luc Koning <Jean-Luc.Koning@esisar.inpg.fr>). + +2003-03-07 Werner LEMBERG <wl@gnu.org> + + * texinput/pinyin.sty (\py@hy): Assure horizontal mode. + +2003-02-10 Werner LEMBERG <wl@gnu.org> + + * texinput/CJK.sty (\CJKchar): Make \CJKchar accept 7bit input for + character definitions other than standard.chr. + * doc/history.txt: Updated. + +2003-02-06 Werner LEMBERG <wl@gnu.org> + + Horizontal hints in Wadalab fonts weren't shifted vertically, + causing inferior results at small sizes. + + * contrib/wadalab/makefont: Rewritten using awk. + * contrib/wadalab/fixwada: New. + * contrib/wadalab/DNP.doc, doc/history.txt: Updated. + * doc/INSTALL: Minor fixes. Mention wadalab.doc and pfaedit. + +2003-01-31 Werner LEMBERG <wl@gnu.org> + + Add two commands \CJKhwkatakana and \CJKnohwkatakana to control + whether C49 encoding is used or whether SJIS half-width katakana are + mapped to full-width glyphs instead. + + * texinput/CJK.sty (\CJKhwkatakana, \CJK@nohwkatakana): New commands. + (\ifCJK@hwkatakana@): New if-macro. + + * texinput/SJIS/SJIS.chr, texinput/SJIS/SJISdnp.chr (\CJK@sjischar): + Add second and third parameter to call \CJK@XXX conditionally. + * texinput/SJIS/SJIS.enc (\CJK@SJISEncoding): Fill second and + third parameters for half-width katakana. + * texinput/SJIS/SJISdnp.enc (\CJK@SJISdnpEncoding): Ditto. + * doc/commands.doc, doc/CJK.doc, doc/history.txt: Updated. + + * examples/README: New file. + +2002-07-29 Werner LEMBERG <wl@gnu.org> + + * texinput/CNS/EUC-TW.chr (\CJK@shiftchar): Pass correct parameters + to \CJKchar. + +2002-06-19 Werner LEMBERG <wl@gnu.org> + + Version 4.5.1 released + ====================== + + Update version numbers and time stamps in all non-binary files. + +2002-06-17 Werner LEMBERG <wl@gnu.org> + + Preparation of release 4.5.1. + + * README: Updated. + * texinput/CJK.sty, doc/CJK.doc: Require LaTeX 2001/06/01 to have + support for \textkra, \texttstroke, and \textTstroke. + Other minor documentation updates. + * doc/*: Updated. + +2002-06-16 Werner LEMBERG <wl@gnu.org> + + * doc/chinese/READMEgb.tex: Use `gbsn' font. + * Makefile (CJK2DVI): Remove *.toc also. + (LATEX2DVI): Take two arguments. + (LATEX): Ditto. + (DISTTARGETS): Add READMEb5 and pytest. + (READMEgb, pytest): New rules + (GB...): Updated. + (predistdoc): Create README file. + (distdoc): Depend also on `cweb'. + (cweb): New target. + +2002-06-14 Edward Lee <edt1023@ms17.hinet.net> + + * texinput/Bg5/c00bsmi.fd, texinput/Bg5/c00bsmir.fd: Fix typo. + +2002-06-13 Werner LEMBERG <wl@gnu.org> + + * Makefile: New file, used for creating the tarballs. + * README: Updated. + * texinput/GB/c10gbsn.fd, texinput/Bg5/c00bsmi.fd, + texinput/Bg5/c00bsmir.fd: New files for fonts from the TeXLive CD. + * doc/chinese/READMEb5.tex, examples/*: Changed to use the fonts + provided by the TeXLive CD. + +2002-06-12 Werner LEMBERG <wl@gnu.org> + + * texinput/JISdnp.enc (\CJK@JISdnpEncoding): Fix position of closing + brace. + +2002-06-07 Werner LEMBERG <wl@gnu.org> + + * texinput/thai/c90enc.def: New file, contributed by Dominique + Unruh <dominique@unruh.de>. + * texinput/thai/thaicjk.ldf: Use it. + * doc/history.txt: Updated. + +2002-05-16 Werner LEMBERG <wl@gnu.org> + + * doc/cjk-enc.doc: Document behaviour for master files without CJK + characters. + * doc/CJK.doc: Explain usage of `~' for BibTeX. + +2002-05-10 Werner LEMBERG <wl@gnu.org> + + * texinput/CJKnumb.sty (\CJKnullspace): New macro to control the + additional space inserted before and after a circle used as a + CJK zero digit. + * doc/history.txt: Updated. + +2002-05-09 Werner LEMBERG <wl@gnu.org> + + * texinput/CJKnumb.sty (\CJK@traditionalNumbers, + \CJK@simplifiedNumbers): New macros. + Use them for GB, GBK, Bg5, Bg5+ hooks. + +2002-05-01 Werner LEMBERG <wl@gnu.org> + + * doc/commands.doc: Minor fix. + + * utils/hbf2gf/config.guess, utils/hbf2gf/config.sub: Updated to + current versions. + * utils/hbf2gf/configure.in: Renamed to... + * utils/hbf2gf/configure.ac: This. + Updated to autoconf 2.53. + * utils/hbf2gf/configure: Regenerated with autoconf 2.53. + * utils/hbf2gf/README: Text improved. + * utils/hbf2gf/hbf2gf.1: Minor typographical fixes. + +2002-04-30 Werner LEMBERG <wl@gnu.org> + + * texinput/CJK.sty (\CJK@errxx, \CJKindent): New macros. + * texinput/CJK.enc (\CJK@spaceChar): Define it for all encodings. + It is used by \CJKindent. + (\CJK@KSHL@enc): Add \CJK@min and \CJK@max. + * texinput/SJIS/SJISdnp.enc (\CJK@SJISdnpEncoding), + texinput/JIS/JISdnp.enc (\CJK@JISdnpEncoding), + texinput/KS/HLaTeX/KSHL.enc (\CJK@KSHLEncoding): Use \CJK@errxx + for unused slots. + + * doc/history.txt, doc/commands.doc: Document \CJKindent. + + * utils/CEFconv/cef5conv.w, utils/CEFconv/cefconv.w: Fix + documentation errors. + * utils/CEFconv/cef5conv.c, utils/CEFconv/cefconv.c: Regenerated. + +2002-04-29 Werner LEMBERG <wl@gnu.org> + + * texinput/CJK.sty (\pickup@font): Add comment character. + +2002-04-28 Werner LEMBERG <wl@gnu.org> + + Preparation of release 4.5.0. + + * README: Updated. + +2002-04-27 Werner LEMBERG <wl@gnu.org> + + * texinput/CJK.sty (\CJKsymbol, \CJKsymbols): Simplified. + (\Unicode, \CJKenc): Fix error text. + +2001-10-08 Mike Fabian <mfabian@suse.de> + + * contrib/wadalab/c42goth.fd: Use `dgj' for normal series and add + `\CJKbold' for bold series. + +2001-07-31 Werner LEMBERG <wl@gnu.org> + + * doc/CJK.doc: Note use of \cleardoublepage if problems occur with + two-column printing. + +2001-07-27 Fabrice Popineau <Fabrice.Popineau@supelec.fr> + + * utils/cjklatex/cjklatex.c: New file. + +2001-06-27 Werner LEMBERG <wl@gnu.org> + + * doc/CJK.doc: Add info how to use a CJK environment in the + preamble. + * doc/cjk-enc.doc: Simplify usage of AUC TeX. + Modify definition of `TeX-run-CJK-LaTeX' to handle directories + properly. + +2001-06-15 Werner LEMBERG <wl@gnu.org> + + * texinput/CJK.enc (\CJK@disableMakeUppercase): Define it as \relax + if in preprocessed mode. + +2001-06-14 HANDA Ken'ichi <handa@etl.go.jp> + + * utils/lisp/emacs-20.3/cjk-enc.el (cjk-set-buffer-multibyte): + Use backquote operator to make cjk-enc.elc work correctly. + +2001-06-08 Werner LEMBERG <wl@gnu.org> + + The next LaTeX release will use \textkra, \texttstroke, and + \textTstroke for the missing latin-4 characters. + + * texinput/mule/MULEenc.sty: Use \textkra. Add \TEXTTSTROKE. + * utils/lisp/emacs-20.3/cjk-enc.el, utils/lisp/mule-2.3/cjk-enc.el: + Use \texttstroke and \TEXTTSTROKE. + +2001-05-26 Werner LEMBERG <wl@gnu.org> + + * texinputs/CJK.sty: Restore EOL character before loading `CJK.cfg'. + +2001-05-18 Werner LEMBERG <wl@gnu.org> + + * contrib/wadalab/DNP.doc: Document installation for pdfTeX. + * contrib/wadalab/makefont: Updated to normalize font matrix of + PS fonts. + +2001-04-24 Werner LEMBERG <wl@gnu.org> + + * utils/hbf2gf/config.guess, utils/hbf2gf/config.sub: Updated to + latest version from gnu.org. + +2001-04-21 Werner LEMBERG <wl@gnu.org> + + * examples/muletest.tex: Remove Thai support so that this file can + really be run with Mule 2.3. + Update comment. + * example/CJKbabel.tex, example/rubytest.tex: Update comment. + + * utils/lisp/emacs-20.3/cjk-enc.el (cjk-format-spec-table): Fix + Thai. + * texinput/mule/MULEenc.sty (\mule@char): Don't use delimiter. + * texinput/SJIS/sjisdnp.enc: Update this file also to the changes + introduced 2001-03-15. + +2001-04-17 Werner LEMBERG <wl@gnu.org> + + * examples/*.tex: Added local variables for Emacs to specify + encoding. + * doc/history.txt: Emphasize the need of local variables for the + encoding if `cjk-enc.el' is used. + +2001-04-02 Werner LEMBERG <wl@gnu.org> + + * utils/lisp/emacs-20.3/cjk-enc.el: Fix documentation to follow + Elisp documentation conventions. + +2001-04-01 Werner LEMBERG <wl@gnu.org> + + Make UTF8 encoding work in TOC. + + * texinput/CJK.sty (\CJK@namedef): New macro. + * texinput/UTF8/UTF8.bdg: Use it. + +2001-03-28 Werner LEMBERG <wl@gnu.org> + + * texinput/mule/MULEenc.sty: Use \textnumero instead of \CYRNo + (found by Vladimir Volovich). + +2001-03-18 Werner LEMBERG <wl@gnu.org> + + * utils/lisp/cjkspace.el, INSTALL: Fix documentation. + +2001-03-15 Werner LEMBERG <wl@gnu.org> + + A major change: Preprocessed and non-preprocessed mode can be used + simultaneously! For example, you can now use include a file encoded + in UTF-8 in another file encoded in Big5. + + To achieve this, ^^7f will always start a command in preprocessed + mode, even for CJK macros. + + * texinput/CJK.sty: Require MULEenc.sty. + Remove ^^7f handling. + Remove preprocessed versions of \CJK@XX, \CJK@XXX, and \CJK@XXXX. + (\CJKcaption): Always include .cpx files. + + * texinput/CJK.enc (\CJK@disableMakeUppercase): New macro. + (\CJK@shiftError): New macro. + (\CJK@unicodeError): New macro. + (\CJK@makeEnvironment): Don't handle \MakeUppercase. + (\CJK@*@enc): Always use `true' branch in \CJKpreproc conditionals. + + * texinput/mule/MULEenc.sty (\mule@@@arg, \mule@def): Use \string. + (\mule@@def): New function to set up macros for leading bytes in the + range ^^81-^^fe. + * texinput/extended.enc (\CJK@extendedEncoding), + texinput/Bg5/Bg5.enc (\CJK@Bg5Encoding), texinput/SJIS/SJIS.enc + (\CJK@SJISEncoding): Use \CJK@disableMakeUppercase. + * texinput/pmCbig.enc (\CJK@pmCbigEncoding), texinput/pmCsmall.enc + (\CJK@pmCsmallEncoding), texinput/standard.enc + (\CJK@standardEncoding): Add \relax. + * texinput/CNS/EUC-TW.enc (\CJK@EUC-TWEncoding), + texinput/JIS/EUC-JP.enc (\CJK@EUC-JPEncoding): Use \CJK@shiftError + for single shifts. Add \relax for all other macros. + * texinput/UTF8/UTF8.enc (\CJK@UTF8Encoding): Use \CJK@unicodeError + for three-byte sequences. Add \relax for all other macros. + + * texinput/*/*.cpx: Updated to new preprocessing scheme. + + * utils/*conv/*conv.w: Updated to new preprocessing scheme. + * utils/*conv/*conv.c: Regenerated. + + * utils/lisp/emacs-20.3/cjk-enc.el (cjk-format-spec-table): Updated + to new preprocessing scheme. + (cjk-encode): Fix file header insertion strings. + * utils/lisp/mule-2.3/cjk-enc.el (cjk-enc-table): Updated to new + preprocessing scheme. + (cjk-encode): Fix file header insertion strings. + + * doc/*: Updated and revised. + +2001-03-13 Werner LEMBERG <wl@gnu.org> + + Implement \CJKinput. + + * mule/MULEenc.sty (\CJKinput): New macro. + (\CJKinclude): Fix error message. + + * utils/lisp/emacs-20.3/cjk-enc.el (cjk-write-all-files): Update + docstring. + (tex-input-regexp): New test for \CJKinput. + (do-batch-cjk-write-file): Fix typo. + + * texinput/thai/thaicjk.ldf: Fix typo. + +2001-02-21 Werner LEMBERG <wl@gnu.org> + + * doc/INSTALL: Minor improvements. + +2001-02-13 Werner LEMBERG <wl@gnu.org> + + * utils/hbf2gf/config.{guess,sub}: Updated (from ftp.gnu.org). + +2000-12-17 Werner LEMBERG <wl@gnu.org> + + * utils/SJISconv/sjisconv.w: Fix typo ff -> 7f. + * utils/CEFconv/cef5conv.w, utils/CEFconv/cefconv.w: Ditto. + + * utils/*conv/*conv.w: \XXXpreproc will now contain the version of + the conversion program. + * utils/*conv/*conv.c: Updated. + + * doc/history.txt: Updated. + + * all files: Version number changed to 4.4.0. + +2000-12-03 Werner LEMBERG <wl@gnu.org> + + * utils/hbf2gf/configure.in: Fix kpathsea checking message. + * utils/hbf2gf/configure: Updated. + +2000-12-02 Werner LEMBERG <wl@gnu.org> + + * doc/cjk-enc.doc: Clarify usage of cjk-coding. + * doc/INSTALL: Add hints how to use kpsewhich to check + configuration. + +2000-12-01 Werner LEMBERG <wl@gnu.org> + + * doc/INSTALL: Fix documentation of --with-kpathsea-include. + * doc/cjk-enc.doc: Fix typo. + +2000-09-21 Werner LEMBERG <wl@gnu.org> + + * texinput/{CJK.sty, CJKulem.sty, pinyin.sty, ruby.sty}: Replacing + some \ifdim with \ifnum. + +2000-09-20 Werner LEMBERG <wl@gnu.org> + + * texinput/CJKulem.sty: Fixed two nasty bugs (spotted by Sim Ing + <sim@ubs-aptsocap.org>): No underlining for \CJKglue and no \CJKglue + before and after \uline. + +2000-08-28 Werner LEMBERG <wl@gnu.org> + + * utils/thaifont/texmf/dvips/config/config.{norasi,dbtt}: New files. + * doc/thaifont.doc: Added info about PS font configuration. + +2000-08-24 Werner LEMBERG <wl@gnu.org> + + * utils/lisp/emacs-20.3/thai-word.el (thai-update-word-table): Add + documentation string. + +2000-08-24 HANDA Ken'ichi <handa@etl.go.jp> + + * utils/lisp/emacs-20.3/thai-word.el (thai-update-word-table): New + function. + (thai-find-word-ends): Fix loop. + +2000-08-23 Werner LEMBERG <wl@gnu.org> + + * texinput/thai/thaicjk.ldf: Remove warning about nonexistent + hyphenation patterns. + +2000-08-20 Werner LEMBERG <wl@gnu.org> + + Another big sigh. Wrong glyph names for Norasi's Thai digits. + Additionally, all ligature rules no longer use `>' to make kerning + possible. + + * utils/thaifont/texmf/dvips/base/norasi.enc: Fixed. + * utils/thaifont/tools/{thai.enc,thailigs.vpl}: Updated. + * utils/thaifont/texmf/fonts/{tfm,vf}/public/{dbtt,norasi}/*: + Regenerated. + +2000-08-19 Werner LEMBERG <wl@gnu.org> + + * examples/thai.tex: New file. + * doc/history.txt: Updated. + + * examples/CJKbabel.tex: Doc fixes. + +2000-08-17 Werner LEMBERG <wl@gnu.org> + + * doc/cjk-enc.el, doc/thaifont.doc: Give better URL for thailatex + package. + +2000-08-15 Werner LEMBERG <wl@gnu.org> + + Sigh, another forgotten Thai ligature rule. + + * utils/thaifont/tools/{thai.enc,thailigs.vpl}: Updated. + * utils/thaifont/texmf/fonts/{tfm,vf}/public/{dbtt,norasi}/*: + Regenerated. + +2000-08-15 Werner LEMBERG <wl@gnu.org> + + * texinput/thai/c90{cmr,cmss.cmtt}.fd: Make font substitution + silent. + + * utils/thaifont/texmf/dvips/base/norasi.enc: Fixing typo. + * utils/thaifont/texmf/fonts/{tfm,vf}/public/norasi/*: Updated. + +2000-08-13 Werner LEMBERG <wl@gnu.org> + + Improved support for Thai. + + * doc/thaifont.doc: New file. + + * utils/thaifont/*: Metrics and support files for Thai fonts. + + * texinput/thai/c90{nrsr,dbss}.fd: New font definition files for + dbtt and norasi font families. + * texinput/thai/c90{cmr,cmss,cmtt}.fd: Font alias files. + * texinput/thai/thaicjk.ldf: New file for thai support in Babel. + * texinput/thai/thai.sty: Removed. + + * utils/lisp/emacs20.3/cjk-enc.el: Redesigned Thai support by + HANDA Ken'ichi <handa@etl.go.jp>. + Will now run under XEmacs also (with help of Martin Buchholz + <martin@xemacs.org>). No Thai support yet due to limitations in + current XEmacs version (21.2). + (cjk-write-all-files): New optional argument to force the processing + of all files. + (do-batch-cjk-write-file): New function. + (batch-cjk-write-file): Use do-batch-cjk-write-file. + (batch-force-cjk-write-file): New function. Uses + do-batch-cjk-write-file also. + * utils/lisp/mule-2.3/cjk-enc.el: Rename write-cjk-file to + cjk-write-file for consistency. + * utils/lisp/emacs20.3/thai-word.el: New file written by HANDA + Ken'ichi for Thai word breaking support. Replaces thaiconv. + * utils/thaiconv: Removed. + + * utils/lisp/emacs20/cjk-enc.el: Removed. No longer supported. + + * texinput/mule/MULEenc.sty: Adapted to new cjk-enc.el version. + Make it robust for CJKulem.sty. + + * examples/CJKbabel.tex: Use CJKulem.sty and thaicjk module for + Babel. + * examples/muletest.tex: Remove \if... \fi clause for Thai. + + * doc/history.txt, doc/INSTALL: Updated. + +2000-08-12 Werner LEMBERG <wl@gnu.org> + + * texinput/CJKulem.sty: New file which provides CJK support for + ulem.sty. + * doc/history.txt, doc/CJK.doc: Updated. + +2000-08-09 Werner LEMBERG <wl@gnu.org> + + * utils/hbf2gf/configure.in: Replaced --with-kpathsea-dir with + --with-kpathsea-lib and --with-kpathsea-include. + * utils/hbf2gf/configure, doc/history.txt, doc/INSTALL, + doc/hbf2gf.doc: Updated. + + * texinput/CJK.sty, texinput/mule/MULEenc.sty: New command + \CJKverbatim which disables \Thaiglue and \CJKglue in verbatim + environments if the `verbatim' package is loaded. + * doc/history.txt, doc/CJK.doc, doc/commands.doc: Updated. + +2000-07-30 Werner LEMBERG <wl@gnu.org> + + * utils/hbf2gf/config.guess, utils/hbf2gf/config.sub: Updated to + latest version from ftp.gnu.org. + +2000-07-27 Werner LEMBERG <wl@gnu.org> + + * utils/thaiconv/thaiconv.c: Improve comment. + + * *.fd: Set \hyphenchar to -1 for all CJK fonts. + +2000-06-23 Werner LEMBERG <wl@gnu.org> + + * utils/hbf2gf/config.guess, utils/hbf2gf/config.sub: Updated to + latest version from ftp.gnu.org. + + * texinput/CJK.enc: Removed redefinition of C42 and C49. + +2000-05-03 Werner LEMBERG <wl@gnu.org> + + * texinput/CJK.sty: Specifying an optional argument to the `CJK' + size function will no longer produce a warning message for each + subfont. + + * contrib/wadalab/*.fd, doc/CJK.doc, doc/fonts.doc: Wadalab PS fonts + now use `CJK' size functions instead of `DNP' ones. + + * doc/history.txt: Updated. + +2000-05-02 Werner LEMBERG <wl@gnu.org> + + * texinput/*/*.cpx: Replace incorrect 0xFF with 0x7F. + +2000-04-18 Werner LEMBERG <wl@gnu.org> + + * texinput/CJK.sty, texinput/pinyin.sty, texinput/ruby.sty: + Balancing the small kern control values, e.g. using + `\kern -1sp\kern 1sp' instead of `\kern 1sp' only. + + Replacing kern value of 3sp with 5sp to avoid clash with ulem.sty. + +2000-04-01 Werner LEMBERG <wl@gnu.org> + + Version 4.3.0 released + ====================== + + This version exists on the Tex Live CD 5 only; a lot of files have + been adapted to the special needs of the CD's texmf tree -- these + changes are not in the CVS tree. + +2000-03-15 Werner LEMBERG <wl@gnu.org> + + * contrib/wadalab/wadalab.map: Renamed from Wadalab.map + * contrib/wadalab/DNP.doc: Updated accordingly. + + * utils/hbf2gf/cfg/*: Updated -- if possible, the foundry is used + as the target directory instead of the encoding, e.g. + `tfm/ntu/b5ka12'. + +2000-03-14 Werner LEMBERG <wl@gnu.org> + + * texinput/SJIS/SJISdnp.{chr,enc}: New files to support SJIS + encoding with DNP fontencoding. + * texinput/CJK.enc: Add SJISdnp. + Add forgotten punctuation pattern macro to KSHL encoding. + * doc/history.txt, doc/CJK.doc, doc/command.doc: Update. + +2000-03-13 Werner LEMBERG <wl@gnu.org> + + * texinput/CJK.sty: Fixing definition of ^^7f to do nothing if + written to the TOC file. + +2000-03-12 Werner LEMBERG <wl@gnu.org> + + * texinput/KS/HLaTeX/pshan.sty: Fix typo. + + Call \mj to activate default family correctly. + + * contrib/wadalab/makefont: Add echo commands. + * contrib/wadalab/DNP.doc: Updated. Add info about gsftopk. + +2000-03-03 Werner LEMBERG <wl@gnu.org> + + * utils/hbf2gf/README: New file. + * utils/hbf2gf/hbf2gf.1, doc/hbf2gf.doc: Small improvements. + + * README: Removed `romaji environment' from TODO section. According + to HANDA Ken'ichi <handa@etl.go.jp> it is impossible to provide + hyphenation patterns for transcribed Japanese without semantic + analysis. + +2000-03-02 Werner LEMBERG <wl@gnu.org> + + * README, doc/INSTALL: Slight improvements. + + * utils/hbf2gf/Makefile.in, utils/hbf2gf/configure.in: Fix incorrect + test for NO_STRDUP. Thanks to <Andries.Brouwer@cwi.nl>. + +2000-02-06 Werner LEMBERG <wl@gnu.org> + + * texinput/CJK.sty, texinput/mule/MULEenc.sty, + utils/lisp/*/cjk-enc.el, utils/*conv/*conv.[cw], history.txt, + CJK.doc, cjk-enc.doc: Use 0x7F both as the multiplex character and + as a delimiter -- apparently no package uses this character... + This solves all problems with \uppercase and \lowercase. + + * utils/hbf2gf/cfg/j2so12.cfg: Added `min_char' parameter to get + correct offsets (thanks to Martin Minich + <minich5@kepler.fmph.uniba.sk> for finding this bug). + +2000-01-26 Werner LEMBERG <wl@gnu.org> + + * doc/cjk-enc.doc, doc/history.txt, examples/CJKbabel.tex, + examples/muletest.tex, texinput/mule/MULEenc.sty, + utils/lisp/*/cjk-enc.el: Change X5 to T5. + +2000-01-20 Werner LEMBERG <wl@gnu.org> + + * examples/muletest.tex: Greek added; updated to X5 encoding. + * examples/CJKbabel.tex: Greek added; updated to X5 encoding. + + * texinput/mule/MULEenc.sty: Use \AtBeginDocument for \mule@<accent> + definitions. + +2000-01-14 Werner LEMBERG <wl@gnu.org> + + * doc/cjk-enc.doc: Added info about file variables to specify + document encoding. + +2000-01-03 Ching-Mo CHANG <chingmo@mail.onweb.com.tw> + + * utils/lisp/emacs-20.3/cjk-enc.el (cjk-write-all-files): Always + returned nul for include and bib file names due to incorrect + pattern matching. + +1999-12-18 Werner LEMBERG <wl@gnu.org> + + * utils/hbf2gf/configure.in: Removed `-pedantic' flag which causes + problems with newer gcc versions. + +1999-11-19 Werner LEMBERG <wl@gnu.org> + + * examples/muletest.tex, examples/CJKbabel.tex: Fixing a typo. + +1999-11-07 Werner LEMBERG <wl@gnu.org> + + * doc/CEF.doc: Minor fixes. + + * doc/CJK.doc: Updated; minor fixes. + +1999-11-06 Werner LEMBERG <wl@gnu.org> + + * doc/cjk-enc.doc, doc/commands.doc, doc/fonts.doc: Minor fixes. + + * doc/vertical.doc, doc/history.txt: Updated. + +1999-11-05 Werner LEMBERG <wl@gnu.org> + + * texinput/mule/MULEenc.sty: Added \CJKinclude{<file>} and + \CJKbibliography{<file>}. These functions act identically to + \include resp. \bibliography but load <file>.cjk + resp. <file>-cjk.bib. + + * utils/lisp/emacs-20.3/cjk-enc.el: Using `cjk' throughout as the + prefix to variable and function names. This causes a renaming of + virtually all functions. Some other local variables were renamed + also for consistency. + + Changing ET5 to X5 encoding for Vietnamese. + + (decompose-char): Removed. Not needed at all. + + (cjk-tex-in-comment): New function. Similar to AUC TeX's + TeX-in-comment function; has been added to be independent from AUC + TeX. + + (cjk-write-all-files): New function. It checks for \CJKinclude + and \CJKbibliography commands in the master file and converts the + referenced files accordingly if necessary. Intended as a hook to + AUC TeX to make multiple files work as expected. + +1999-11-02 Werner LEMBERG <wl@gnu.org> + + * doc/cjk-enc.doc: Small improvement in explanation of usage with + AUC TeX. + +1999-10-24 Werner LEMBERG <wl@gnu.org> + + * utils/lisp/emacs-20.3/cjk-enc.el (get-cjk-name): New function. + + (file-write-cjk-file, batch-write-cjk-file): New functions which + do the same as write-cjk-file but operate on a given file (resp. a + suite of files and directories given on the command line). + + (write-cjk-file): Will now properly ask for a file name if the + current buffer is not visiting a file. + + * doc/cjk-enc.doc: Expanded TeX-translate-location-hook to cover + CJK BibTeX input files also. + + TeX-run-CJK-LaTeX now checks whether it must call write-cjk-file + at all (emacs > 20.3 only). + +1999-10-07 Werner LEMBERG <wl@gnu.org> + + * texinput/mule/MULEenc.sty: Removed \textendash wrapper macro. + + * utils/lisp/{emacs-20.3,emacs-20,mule-2.3}/cjk-enc.el: Added + iso-8859-9 (Greek) support (mapped to LGR encoding as used in the + Babel package). + + Fixed character `SOFT-HYPHEN' in iso-8859-x encodings (using `\-' + instead of \textendash). + + * README, doc/cjk-enc.doc, doc/history.txt: Updated. + + * doc/CJK.doc: Fixed a typo. + + * texinput/CJK.enc, texinput/CJK.sty, texinput/*/{*.cap,*.cpx}: + Replaced `\ifx\foo \undefined' with `\@ifundefined{}{}' to fix the + case that a not-defined macro has been tested with \@ifundefined + before. In this case, it is no longer undefined but identical to + \relax. + + * texinput/pmC.chr: Fixed punctuation macros for pmC. + +1999-10-02 Werner LEMBERG <wl@gnu.org> + + * texinput/pinyin.sty: The method with appending `\-' to all + syllables fails (stupid I am :-), so here a solution which really + works. It uses a small kern (4sp, similar to the ruby and CJK + packages) to tell the following pinyin syllable that a + discretionary has to be inserted. + +1999-10-01 Werner LEMBERG <wl@gnu.org> + + * texinput/mule/MULEenc.sty: \lccode and \uccode of ^^ff must not + be modified, otherwise hyphenation patterns containing \ss will + fail (which happens e.g. in German). + +1999-09-28 Werner LEMBERG <wl@gnu.org> + + * doc/history.txt: Updated. + + * utils/pyhyphen/pyhyph.tex, utils/pyhyphen/pytest.tex, + utils/pyhyphen/pinyin.ldf, doc/pyhpyhen.doc: Hyphenation patterns + for unaccented pinyin syllables to be used with the Babel package. + + * utils/pyhyphen/pinyin.c, utils/pyhpyhen/pinyin.tr: Utility files + for creating pinyin hyphenation patterns. + +1999-09-27 Werner LEMBERG <wl@gnu.org> + + * doc/history.txt: Updated. + +1999-09-21 Werner LEMBERG <wl@gnu.org> + + * texinput/pinyin.sty: Adding hyphenation points at the end of all + syllables. + +1999-09-18 Werner LEMBERG <wl@gnu.org> + + * texinput/pinyin.sty: Making accent commands like \py@a robust. + + Added option `useCMmacron' (for LaTeX only) to use a macron accent + from the CM fonts in case the used font doesn't have it + (e.g. some versions of virtual files for Palatino). + +1999-08-26 Werner LEMBERG <wl@gnu.org> + + * utils/hbf2gf/hbf2gf.1: Added some documentation how to find out + the expanded value of a kpathsea variable (like $MISCFONT). + +1999-08-07 Werner LEMBERG <wl@gnu.org> + + * utils/thaiconv/thaiconv.c (adj): Fixed invalid array index in + case of marks without base characters. + +1999-07-07 Werner LEMBERG <wl@gnu.org> + + * texinput/Bg5/Bg5.chr, + texinput/extended.chr: Fixed a typo \CJK@temp->\CJK@gtemp + +1999-06-30 Werner LEMBERG <wl@gnu.org> + + * utils/lisp/emacs-20/cjk-enc.el, + utils/lisp/emacs-20.3/cjk-enc.el, + utils/lisp/mule-2.3: Fixed code for 0x80 multiplex character. + +1999-06-22 Werner LEMBERG <wl@gnu.org> + + * doc/TDS.doc: Completely revised. + +1999-06-10 Werner LEMBERG <wl@gnu.org> + + * utils/hbf2gf/configure.in: Removed `-ansi' flag which can cause + problems with the kpathsea library (which is not compiled with + -ansi). + +1999-06-07 Werner LEMBERG <wl@gnu.org> + + * utils/hbf2gf/hbf2gf.1: Added documentation about MiKTeX. + + * utils/hbf2gf/hbf2gf.w: Added support for MiKTeX file search + library. + + * texinput/CEF/*.fd: Removed -- these files were erroneously + included into the CVS repository. + +1999-06-04 Werner LEMBERG <wl@gnu.org> + + * *.fd files: minor documentation addition regarding font + encoding. + + * all files: Changed date/version to 4.3.0. + +1999-06-02 Werner LEMBERG <wl@gnu.org> + + * README: Added info about http and ftp home sites and how to + access the CVS repository. + +1999-06-01 Werner LEMBERG <wl@gnu.org> + + * README: Added info about CVS mailing list. + +1999-05-29 Werner LEMBERG <wl@gnu.org> + + * README: Added mailing list. + + * doc/INSTALL: Small correction. + + * README: Small additions. + +;; Local Variables: +;; coding: utf-8 +;; End: + + Copyright (C) 1999, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 + Werner Lemberg <wl@gnu.org> + + This file is part of the CJK package for using Asian logographs + (Chinese/Japanese/Korean) with LaTeX2e. + + 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, 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 GNU Emacs; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/README b/Build/source/texk/cjkutils/cjkutils-4.8.2/README new file mode 100644 index 00000000000..f66b64c24ec --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/README @@ -0,0 +1,35 @@ +Welcome to CJK version 4.8.2 (29-Dec-2008), a LaTeX2e macro package which +enables the use of CJK scripts (Chinese/Japanese/Korean) in various +encodings, written by Werner Lemberg <wl@gnu.org>. + +A mailing list exists at cjk@ffii.org; bugs should be sent to +cjk-bug@ffii.org. To subscribe one of the lists, send a mail with the +subject `subscribe' (without the quotes) to <list>-request@ffii.org, e.g., +cjk-request@ffii.org. + +If you are interested in the process of development you may observe + + http://git.savannah.gnu.org/gitweb/?p=cjk.git;a=summary + +to see the commitments to the git repository of the CJK package, and which +also provides snapshots. + +The home site of the CJK package is + + http://cjk.ffii.org + +Additionally, the latest non-development version can be found on all CTAN +hosts and its mirrors in the directory <CTAN>/language/chinese. + + +The package comes in two parts: + + cjk-4.8.2.tar.gz: The source files. Needed for all platforms. + cjk-4.8.2-doc.tar.gz: Preformatted documentation files: DVI, PS, + output from cjk-enc.el, etc. + +Note that on CTAN and its mirrors, the `src' archive is unpacked; you must +thus get all files and subdirectories from language/chinese/CJK/. + + +---End of README--- diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/SJISconv/sjisconv.1 b/Build/source/texk/cjkutils/cjkutils-4.8.2/SJISconv/sjisconv.1 new file mode 100644 index 00000000000..0ffd2460885 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/SJISconv/sjisconv.1 @@ -0,0 +1,110 @@ +.\" man page for sjisconv +.\" Copyright (C) 1994-2008 Werner Lemberg <wl@gnu.org> +.\" +.\" 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 in doc/COPYING; if not, write to the Free +.\" Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +.\" MA 02110-1301 USA +. +.TH SJISCONV 1 29-Dec-2008 "CJK Version 4.8.2" +. +.\" ==== +.\" ==== macro definitions +.\" ==== +. +.\" here we define \TeX for troff and nroff +.if t .ds TX \fRT\\h'-0.1667m'\\v'0.20v'E\\v'-0.20v'\\h'-0.125m'X\fP +.if n .ds TX TeX +. +.\" and here the same for \LaTeX +.if t \{\ +.ie '\*(.T'dvi' \ +.ds LX \fRL\h'-0.36m'\v'-0.15v'\s-3A\s0\h'-0.15m'\v'0.15v'\fP\*(TX +.el .ds LX \fRL\h'-0.36m'\v'-0.22v'\s-2A\s0\h'-0.15m'\v'0.22v'\fP\*(TX +.\} +.if n .ds LX LaTeX +. +.\" \LaTeXe +.\" note that we need \vareps for TeX instead of \eps which can only be +.\" accessed with the \N escape sequence (in the Math Italic font) +.if t \{\ +.ie '\*(.T'dvi' .ds LE \*(LX\h'0.15m'2\v'0.20v'\f(MI\N'34'\fP\v'-0.20v' +.el .ds LE \*(LX\h'0.15m'2\v'0.20v'\(*e\v'-0.20v' +.\} +.if n .ds LE LaTeX\ 2e +. +.\" a typewriter font +.if t \{\ +.de C +\fC\\$1\fP\\$2 +.. +.\} +.if n \{\ +.de C +\\$1\\$2 +.. +.\} +. +.\" ==== +.\" ==== end of macro definitions +.\" ==== +. +. +. +.SH NAME +sjisconv \- convert a TeX document in SJIS encoding into `preprocessed' +form. +. +. +.SH SYNOPSIS +.B sjisconv +< +.I infile +> +.I outfile +. +. +.SH DESCRIPTION +SJIS encoding for Japanese uses the characters +.C { , +.C } , +and +.C \e +which have special meanings in \*(TX +documents. +.PP +After processing a \*(LE +document which contains SJIS characters with +.B \%sjisconv +you need not care about these special characters. +.PP +This filter is part of the +.B CJK +macro package for \*(LE. +. +. +.SH "SEE ALSO" +.BR bg5conv (1), +.BR \%cefconv (1), +.BR cef5conv (1), +.BR \%cefsconv (1), +.BR \%extconv (1), +.br +the +.B CJK +documentation files. +. +. +.SH AUTHOR +Werner Lemberg +.C <wl@gnu.org> diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/SJISconv/sjisconv.c b/Build/source/texk/cjkutils/cjkutils-4.8.2/SJISconv/sjisconv.c new file mode 100644 index 00000000000..6b1b5409bf3 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/SJISconv/sjisconv.c @@ -0,0 +1,36 @@ +#define banner \ +"sjisconv (CJK ver. 4.8.2)" \ + +/*2:*/ +#line 93 "/home/wl/git/cjk/cjk-4.8.2/utils/SJISconv/sjisconv.w" + +#include <stdio.h> +#include <stdlib.h> + + +int main(argc,argv) +int argc; +char*argv[]; + +{int ch; + +fprintf(stdout,"\\def\\CJKpreproc{%s}",banner); + +ch= fgetc(stdin); + +while(!feof(stdin)) +{if((ch>=0x81&&ch<=0x9F)||(ch>=0xE0&&ch<=0xEF)) +{fprintf(stdout,"\177%c\177",ch); + +ch= fgetc(stdin); +if(!feof(stdin)) +fprintf(stdout,"%d\177",ch); +} +else +fputc(ch,stdout); + +ch= fgetc(stdin); +} +exit(EXIT_SUCCESS); +return 0; +}/*:2*/ diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/SJISconv/sjisconv.w b/Build/source/texk/cjkutils/cjkutils-4.8.2/SJISconv/sjisconv.w new file mode 100644 index 00000000000..26469af5c57 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/SJISconv/sjisconv.w @@ -0,0 +1,120 @@ +% This is the cweb file sjisconv.w of the CJK Package Ver. 4.8.2 29-Dec-2008 + +% Copyright (C) 1994-2008 Werner Lemberg <wl@@gnu.org> +% +% 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 in doc/COPYING; if not, write to the Free +% Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +% MA 02110-1301 USA + +% To print this CWEB file you should (but not must) use the CWEAVE of the +% c2cweb-package (found at the CTAN archives, e.g. ftp.dante.de) and then say +% +% cweave +a sjisconv.w +% +% This (fully compatible) CWEAVE can transform CWEB-files with alternative +% output rules (look at the position of braces below!) the author (it's me +% too :-) prefer. Otherwise this file will be formatted traditionally. + +\def\title{sjisconv (CJK Version 4.8.2)} + +\def\topofcontents{ + \null\vfill + \centerline{\titlefont The {\ttitlefont sjisconv} program} + \vskip 20pt + \centerline{(CJK Version 4.8.2)} + \vfill} + +\def\botofcontents{ + \vfill + \noindent + Copyright \copyright\ 1996, 1998 by Werner Lemberg + \bigskip\noindent + Permission is granted to make and distribute verbatim copies of this + document provided that the copyright notice and this permission notice + are preserved on all copies. + + \smallskip\noindent + Permission is granted to copy and distribute modified versions of this + document under the conditions for verbatim copying, provided that the + entire resulting derived work is distributed under the terms of a + permission notice identical to this one.} + +\pageno=\contentspagenumber \advance\pageno by 1 +\let\maybe=\iftrue +\fullpageheight=240mm +\pageheight=223mm +\pagewidth=158mm +\setpage +\frenchspacing + +\noinx +\nosecs +\nocon + +@* Function and Use. +This small program will convert SJIS encoded Japanese characters into a +`preprocessed' form. The need of this program arises from the fact that this +encoding uses the characters `\.{\\}', `\.{\{}', and `\.{\}}' which have +special meanings in \TeX. + +Use this program as a filter: + +\hskip 2em \.{sjisconv < input\_file > output\_file} + + +@* The program. +The only function of this program is to replace all occurrences of SJIS +encoded two byte characters \.{XY} with +\.{\char94 \char94 7fX\char94 \char94 7fZZZ\char94 \char94 7f} (\.{X} +and \.{Y} are the first and the second byte of the character; \.{ZZZ} +represents the second byte as a decimal number). + +Additionally we define a \TeX\ macro at the very beginning to signal a +preprocessed file. + +The following code is very simple. No error detection is done because \TeX\ +which will see the output of \.{sjisconv} complains loudly if something is +wrong. + +@d banner +"sjisconv (CJK ver. 4.8.2)" + +@c +#include <stdio.h> +#include <stdlib.h>@# + + +int main(int argc, char *argv[]) + {int ch; + + fprintf(stdout, "\\def\\CJKpreproc{%s}", banner);@# + + ch = fgetc(stdin);@# + + while(!feof(stdin)) + {if((ch >= 0x81 && ch <= 0x9F) || (ch >= 0xE0 && ch <= 0xEF)) + {fprintf(stdout, "\177%c\177", ch);@# + + ch = fgetc(stdin); + if(!feof(stdin)) + fprintf(stdout, "%d\177", ch); + } + else + fputc(ch, stdout);@# + + ch = fgetc(stdin); + } + exit(EXIT_SUCCESS); + return 0; /* never reached */ + } diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/SJISconv/sjislatex b/Build/source/texk/cjkutils/cjkutils-4.8.2/SJISconv/sjislatex new file mode 100755 index 00000000000..d794a7c7f5e --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/SJISconv/sjislatex @@ -0,0 +1,43 @@ +#! /bin/sh + +# Copyright (C) 1994-2008 Werner Lemberg <wl@gnu.org> +# +# 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 in doc/COPYING; if not, write to the Free +# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +# MA 02110-1301 USA + +n=1 +argv= + +# get last argument +while test 1 -lt $#; do + eval argv$n=\$1 + argv="$argv \"\$argv$n\"" + n=`expr $n + 1` + shift +done + +# replace extension with .cjk or append .cjk if there is no extension +tex=$1 +case $tex in +""|*.cjk) + echo >&2 "Usage: $0 [options] latex-file" + exit 1;; +*) + aux=`expr "X$tex" : 'X\(.*\)\.[^/]*$' \| "X$tex" : 'X\(.*\)'`.cjk;; +esac + +sjisconv < "$tex" > "$aux" && eval latex "$argv" "\$aux" + +# EOF diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/SJISconv/sjisltx.bat b/Build/source/texk/cjkutils/cjkutils-4.8.2/SJISconv/sjisltx.bat new file mode 100644 index 00000000000..5702c113bdf --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/SJISconv/sjisltx.bat @@ -0,0 +1,3 @@ +call f_name %1
+sjisconv < %1 > %fd%%fp%%fn%.cjk
+latex %fd%%fu%%fn%.cjk
diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/SJISconv/sjisltx.cmd b/Build/source/texk/cjkutils/cjkutils-4.8.2/SJISconv/sjisltx.cmd new file mode 100644 index 00000000000..ff8955dfba2 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/SJISconv/sjisltx.cmd @@ -0,0 +1,44 @@ +/*----------------------------------------------------------------------*\ + sjisltx.cmd + + This file is part of the CJK macro package for LaTeX2e ver. 4.8.2 + + Copyright (C) 1994-2008 Wonkoo Kim <wkim+@pitt.edu> + + 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 in doc/COPYING; if not, write to the Free + Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + MA 02110-1301 USA + + Wonkoo Kim (wkim+@pitt.edu), September 2, 1996 +\*----------------------------------------------------------------------*/ + +Call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs' +Call SysLoadFuncs + +parse arg file + +drive = filespec('drive', file) +path = filespec('path', file) +fname = filespec('name', file) +m = lastpos('.', fname) +if (m = 0) then m = length(fname) + 1 +cjkfile = drive||path||delstr(fname, m)||'.cjk' + +'sjisconv <' file '>' cjkfile + +ucjkfile = translate(cjkfile,'/','\') +if stream(cjkfile, 'C', 'QUERY EXISTS') \= '' then + 'call latex.cmd' ucjkfile + +/* End of sjisltx.cmd */ diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/SJISconv/sjispdflatex b/Build/source/texk/cjkutils/cjkutils-4.8.2/SJISconv/sjispdflatex new file mode 100755 index 00000000000..50daf343502 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/SJISconv/sjispdflatex @@ -0,0 +1,43 @@ +#! /bin/sh + +# Copyright (C) 1994-2008 Werner Lemberg <wl@gnu.org> +# +# 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 in doc/COPYING; if not, write to the Free +# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +# MA 02110-1301 USA + +n=1 +argv= + +# get last argument +while test 1 -lt $#; do + eval argv$n=\$1 + argv="$argv \"\$argv$n\"" + n=`expr $n + 1` + shift +done + +# replace extension with .cjk or append .cjk if there is no extension +tex=$1 +case $tex in +""|*.cjk) + echo >&2 "Usage: $0 [options] latex-file" + exit 1;; +*) + aux=`expr "X$tex" : 'X\(.*\)\.[^/]*$' \| "X$tex" : 'X\(.*\)'`.cjk;; +esac + +sjisconv < "$tex" > "$aux" && eval pdflatex "$argv" "\$aux" + +# EOF diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/cjklatex/cjklatex.c b/Build/source/texk/cjkutils/cjkutils-4.8.2/cjklatex/cjklatex.c new file mode 100644 index 00000000000..6518cc63491 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/cjklatex/cjklatex.c @@ -0,0 +1,297 @@ +/* + Purpose: call LATEX after preprocessing of the .tex file by + the cjk conversion tool. The old f_name.bat script + is not working anymore. + Author : F. Popineau <Fabrice.Popineau@supelec.fr> + Date : <29/06/2001> +*/ + +#ifndef LATEX +#define LATEX "latex" +#endif + +/* + Copyright (C) 2001-2008 F. Popineau <Fabrice.Popineau@supelec.fr> + + 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 in doc/COPYING; if not, write to the Free + Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + MA 02110-1301 USA +*/ + +#include <stdio.h> +#include <stdlib.h> + +#include <kpathsea/config.h> +#include <kpathsea/lib.h> +#include <kpathsea/getopt.h> + +#if defined(WIN32) && !defined(__MINGW32__) +#include <kpathsea/win32lib.h> +#endif + +static const char *cjklatex_version_string = "1.0"; + +static const char *usage_str[] = { + "Usage: %s OPTIONS FILE\n", + "Calls `" LATEX "' on FILE after conversion by the filter\n", + "specified by OPTIONS.\n", + "--conv=bg5\tfor traditional Chinese, encoding Big 5,\n", + "--conv=cef\tfor Chinese Encoding Framework, encoding CEF,\n", + "--conv=cef5\tidem CEF, also converts Big5 characters,\n", + "--conv=cefs\tidem CEF, also converts SJIS characters,\n", + "--conv=gbk\tfor Chinese, encoding GBK,\n", + "--conv=sjis\tfor Japanese, SJIS encoding.", + "\nAlternatively, for compatibility with the previous DOS batch files,\n", + "you can also copy this program to any of the following names:\n", + "bg5" LATEX ".exe, cef5" LATEX ".exe, cef" LATEX ".exe, cefs" LATEX ".exe,\n", + "gbk" LATEX ".exe and sjis" LATEX ".exe .\n", + "Then running one of these programs will be identical to specify\n", + "the corresponding option.\n", + "\nAdditional options:\n", + "--verbose\tbe a bit more verbose about what is happening,\n", + "--nocleanup\tdo not remove intermediate files,\n", + "--latex=engine\tuse `engine' instead of `" LATEX "' to process the file.\n", + NULL +}; + +static char *progname = NULL; + +static struct _conv_table { + const char *progname; + const char *processor; +} CJKtable[] = { + { "cjk" LATEX, "" }, + { "bg5" LATEX, "bg5conv" }, + { "cef" LATEX, "cefconv" }, + { "cef5" LATEX, "cef5conv" }, + { "cefs" LATEX, "cefsconv" }, + { "gbk" LATEX, "extconv" }, + { "sjis" LATEX, "sjisconv" } +}; + +#define PROGRAM_IS(p) FILESTRCASEEQ (p, progname) +#define ARGUMENT_IS(a) STREQ (long_options[option_index].name, a) + +static int program_number = -1; +static int opt_verbose = 0; +static int opt_nocleanup = 0; +static char *texname, *cjkname, *texengine; + +static struct option long_options [] = { + { "debug", 1, 0, 0}, + { "help", 0, 0, 0}, + { "version", 0, 0, 0}, + { "verbose", 0, 0, 0}, + { "nocleanup", 0, 0, 0}, + { "latex", 1, 0, 0}, + { "conv", 1, 0, 0}, + {0, 0, 0, 0} +}; + +static BOOL sigint_handler(DWORD dwCtrlType) +{ + /* Fix me : there is a problem if a system() command is running. + We should wait for the son process to be interrupted. + Only way I can think of to do that : rewrite system() based on + spawn() with parsing of the command line and set a global pid + Next cwait(pid) in the HandlerRoutine. + */ + + /* This is not that good, but else we would need to wait for + the child processes to finish ! */ + Sleep(250); + + fprintf(stderr, "Sending Ctrl+Break!\n"); + GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, 0); + + if (! opt_nocleanup) + unlink(cjkname); + + exit(1); + + return FALSE; /* return value obligatory */ +} + +static void usage(void) +{ + int i; + fprintf(stderr, "CJK" LATEX " version %s\n", cjklatex_version_string); + fprintf(stderr,usage_str[0], progname ); + fputs("\n", stderr); + for(i = 1; usage_str[i]; ++i) + fputs(usage_str[i], stderr); +} + +static int do_process(const char *processor, const char *filename) +{ + char *ext, *p; + char cmd[_MAX_PATH*3]; + DWORD dwFA; + int ret; + + if (strlen(filename) > 4 && _strnicmp(filename + strlen(filename) - 4, ".tex", 4) == 0) { + texname = xstrdup(filename); + } + else { + texname = concat(filename, ".tex"); + } + for (p = texname; p && *p; p++) + *p = (*p == '\\' ? '/' : *p); + + dwFA = GetFileAttributes(texname); + if (dwFA == 0xFFFFFFFF || (dwFA & FILE_ATTRIBUTE_DIRECTORY)) { + fprintf(stderr, "%s: %s is an invalid input file.\n", + progname, texname); + ret = 1; + } + else { + cjkname = xstrdup(texname); + ext = strrchr(cjkname, '.'); + assert(ext != NULL); + strcpy(cjkname + (ext - cjkname), ".cjk"); + + sprintf(cmd, "%s < %s > %s", processor, texname, cjkname); + if (opt_verbose) + fprintf(stderr, "%s: running command `%s'.\n", progname, cmd); + ret = system(cmd); + if (ret == 0) { + sprintf(cmd, "%s %s", texengine, cjkname); + if (opt_verbose) + fprintf(stderr, "%s: running command `%s'.\n", progname, cmd); + ret = system(cmd); + if (! opt_nocleanup) + unlink(cjkname); + } + } + + free(texname); + free(cjkname); + + return ret; +} + +int main(int argc, char *argv[]) +{ + int g; /* getopt return code */ + int i; + int option_index; + char *filename; + + if (!progname) + progname = argv[0]; + + kpse_set_program_name (progname, NULL); + progname = kpse_program_name; + + for (i = 0; i < sizeof(CJKtable)/sizeof(CJKtable[0]) && program_number < 0; i++) { + if (STREQ(progname, CJKtable[i].progname) +#if 0 + || (STREQ(progname, CJKtable[i].progname) + && STREQ(progname+strlen(CJKtable[i].progname), ".exe")) +#endif + ) { + program_number = i; + } + } + + if (program_number == -1) { + fprintf(stderr, "%s: this program has been incorrecty copied to the name %s.\n", progname, progname); + usage(); + exit(1); + } + + for(;;) { + g = getopt_long_only (argc, argv, "", long_options, &option_index); + + if (g == EOF) + break; + + if (g == '?') { + usage(); /* Unknown option. */ + exit(1); + } + + /* assert (g == 0); */ /* We have no short option names. */ + /* + FIXME : try 'mktexpk --mfmode --bdpi 600 ...' + */ + if (ARGUMENT_IS ("debug")) { + kpathsea_debug |= atoi (optarg); + } + else if (ARGUMENT_IS ("help")) { + usage(); + exit(0); + } + else if (ARGUMENT_IS ("verbose")) { + opt_verbose = 1; + } + else if (ARGUMENT_IS ("nocleanup")) { + opt_nocleanup = 1; + } + else if (ARGUMENT_IS ("latex")) { + texengine = xstrdup(optarg); + } + else if (ARGUMENT_IS ("version")) { + fprintf(stderr, "%s of %s.\n", progname, cjklatex_version_string); + exit(0); + } + else if (PROGRAM_IS("cjk" LATEX)) { + if (ARGUMENT_IS("conv")) { + for (i = 1; i < sizeof(CJKtable)/sizeof(CJKtable[0]) && program_number <= 0; i++) { + if (STRNEQ(optarg, CJKtable[i].progname, strlen(optarg))) { + program_number = i; + } + } + } + } + } + + /* shifting options from argv[] list */ + for (i = 1; optind < argc; i++, optind++) + argv[i] = argv[optind]; + argv[i] = NULL; + + argc = i; + + if (argc < 2) { + fprintf (stderr, "%s: Missing argument(s).\nTry `%s --help' for more information.\n", progname, kpse_program_name); + exit(1); + } + + if (argc > 2) { + fprintf(stderr, "%s: Extra arguments", progname); + for (i = 2; i < argc; i++) + fprintf (stderr, " \"%s\"", argv[i]); + fprintf (stderr, "\nTry `%s --help' for more information.\n", + kpse_program_name); + exit(1); + } + + SetConsoleCtrlHandler((PHANDLER_ROUTINE)sigint_handler, TRUE); + + filename = xstrdup(argv[1]); + + assert(program_number > 0); + + if (! texengine) { + texengine = xstrdup(LATEX); + } + + do_process(CJKtable[program_number].processor, filename); + + free(filename); + free(texengine); + + return 0; +} diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/extconv/bg5+latex b/Build/source/texk/cjkutils/cjkutils-4.8.2/extconv/bg5+latex new file mode 100755 index 00000000000..4136537872e --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/extconv/bg5+latex @@ -0,0 +1,43 @@ +#! /bin/sh + +# Copyright (C) 1994-2008 Werner Lemberg <wl@gnu.org> +# +# 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 in doc/COPYING; if not, write to the Free +# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +# MA 02110-1301 USA + +n=1 +argv= + +# get last argument +while test 1 -lt $#; do + eval argv$n=\$1 + argv="$argv \"\$argv$n\"" + n=`expr $n + 1` + shift +done + +# replace extension with .cjk or append .cjk if there is no extension +tex=$1 +case $tex in +""|*.cjk) + echo >&2 "Usage: $0 [options] latex-file" + exit 1;; +*) + aux=`expr "X$tex" : 'X\(.*\)\.[^/]*$' \| "X$tex" : 'X\(.*\)'`.cjk;; +esac + +extconv < "$tex" > "$aux" && eval latex "$argv" "\$aux" + +# EOF diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/extconv/bg5+pdflatex b/Build/source/texk/cjkutils/cjkutils-4.8.2/extconv/bg5+pdflatex new file mode 100755 index 00000000000..e28761ef423 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/extconv/bg5+pdflatex @@ -0,0 +1,43 @@ +#! /bin/sh + +# Copyright (C) 1994-2008 Werner Lemberg <wl@gnu.org> +# +# 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 in doc/COPYING; if not, write to the Free +# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +# MA 02110-1301 USA + +n=1 +argv= + +# get last argument +while test 1 -lt $#; do + eval argv$n=\$1 + argv="$argv \"\$argv$n\"" + n=`expr $n + 1` + shift +done + +# replace extension with .cjk or append .cjk if there is no extension +tex=$1 +case $tex in +""|*.cjk) + echo >&2 "Usage: $0 [options] pdflatex-file" + exit 1;; +*) + aux=`expr "X$tex" : 'X\(.*\)\.[^/]*$' \| "X$tex" : 'X\(.*\)'`.cjk;; +esac + +extconv < "$tex" > "$aux" && eval pdflatex "$argv" "\$aux" + +# EOF diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/extconv/bg5pltx.bat b/Build/source/texk/cjkutils/cjkutils-4.8.2/extconv/bg5pltx.bat new file mode 100644 index 00000000000..ccc6c76acd5 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/extconv/bg5pltx.bat @@ -0,0 +1,3 @@ +call f_name %1
+extconv < %1 > %fd%%fp%%fn%.cjk
+latex %fd%%fu%%fn%.cjk
diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/extconv/bg5pltx.cmd b/Build/source/texk/cjkutils/cjkutils-4.8.2/extconv/bg5pltx.cmd new file mode 100644 index 00000000000..64b768ee178 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/extconv/bg5pltx.cmd @@ -0,0 +1,44 @@ +/*----------------------------------------------------------------------*\ + bg5pltx.cmd + + This file is part of the CJK macro package for LaTeX2e ver. 4.8.2 + + Copyright (C) 1994-2008 Wonkoo Kim <wkim+@pitt.edu> + + 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 in doc/COPYING; if not, write to the Free + Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + MA 02110-1301 USA + + Wonkoo Kim (wkim+@pitt.edu), September 2, 1996 +\*----------------------------------------------------------------------*/ + +Call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs' +Call SysLoadFuncs + +parse arg file + +drive = filespec('drive', file) +path = filespec('path', file) +fname = filespec('name', file) +m = lastpos('.', fname) +if (m = 0) then m = length(fname) + 1 +cjkfile = drive||path||delstr(fname, m)||'.cjk' + +'extconv <' file '>' cjkfile + +ucjkfile = translate(cjkfile,'/','\') +if stream(cjkfile, 'C', 'QUERY EXISTS') \= '' then + 'call latex.cmd' ucjkfile + +/* End of bg5pltx.cmd */ diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/extconv/extconv.1 b/Build/source/texk/cjkutils/cjkutils-4.8.2/extconv/extconv.1 new file mode 100644 index 00000000000..d8494edc1e1 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/extconv/extconv.1 @@ -0,0 +1,111 @@ +.\" man page for bg5conv +.\" +.\" Copyright (C) 1994-2008 Werner Lemberg <wl@gnu.org> +.\" +.\" 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 in doc/COPYING; if not, write to the Free +.\" Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +.\" MA 02110-1301 USA +. +.TH EXTCONV 1 29-Dec-2008 "CJK Version 4.8.2" +. +.\" ==== +.\" ==== macro definitions +.\" ==== +. +.\" here we define \TeX for troff and nroff +.if t .ds TX \fRT\\h'-0.1667m'\\v'0.20v'E\\v'-0.20v'\\h'-0.125m'X\fP +.if n .ds TX TeX +. +.\" and here the same for \LaTeX +.if t \{\ +.ie '\*(.T'dvi' \ +.ds LX \fRL\h'-0.36m'\v'-0.15v'\s-3A\s0\h'-0.15m'\v'0.15v'\fP\*(TX +.el .ds LX \fRL\h'-0.36m'\v'-0.22v'\s-2A\s0\h'-0.15m'\v'0.22v'\fP\*(TX +.\} +.if n .ds LX LaTeX +. +.\" \LaTeXe +.\" note that we need \vareps for TeX instead of \eps which can only be +.\" accessed with the \N escape sequence (in the Math Italic font) +.if t \{\ +.ie '\*(.T'dvi' .ds LE \*(LX\h'0.15m'2\v'0.20v'\f(MI\N'34'\fP\v'-0.20v' +.el .ds LE \*(LX\h'0.15m'2\v'0.20v'\(*e\v'-0.20v' +.\} +.if n .ds LE LaTeX\ 2e +. +.\" a typewriter font +.if t \{\ +.de C +\fC\\$1\fP\\$2 +.. +.\} +.if n \{\ +.de C +\\$1\\$2 +.. +.\} +. +.\" ==== +.\" ==== end of macro definitions +.\" ==== +. +. +. +.SH NAME +extconv \- convert a TeX document in either Big\ 5+ or GBK encoding into +`preprocessed' form. +. +. +.SH SYNOPSIS +.B extconv +< +.I infile +> +.I outfile +. +. +.SH DESCRIPTION +Big\ 5+ and GBK encodings use the characters +.C { , +.C } , +and +.C \e +which have special meanings in \*(TX +documents. +.PP +After processing a \*(LE +document which contains such characters with +.B \%extconv +you need not care about these special characters. +.PP +This filter is part of the +.B CJK +macro package for \*(LE. +. +. +.SH "SEE ALSO" +.BR bg5conv (1), +.BR \%sjisconv (1), +.BR \%cefconv (1), +.BR cef5conv (1), +.BR \%cefsconv (1), +.br +the +.B CJK +documentation files. +. +. +.SH AUTHOR +Werner Lemberg +.C <wl@gnu.org> diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/extconv/extconv.c b/Build/source/texk/cjkutils/cjkutils-4.8.2/extconv/extconv.c new file mode 100644 index 00000000000..1b1753fd08b --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/extconv/extconv.c @@ -0,0 +1,37 @@ +#define banner \ +"extconv (CJK ver. 4.8.2)" \ + +/*2:*/ +#line 94 "/home/wl/git/cjk/cjk-4.8.2/utils/extconv/extconv.w" + +#include <stdio.h> +#include <stdlib.h> + + +int main(argc,argv) +int argc; +char*argv[]; + +{int ch; + + +fprintf(stdout,"\\def\\CJKpreproc{%s}",banner); + +ch= fgetc(stdin); + +while(!feof(stdin)) +{if(ch>=0x81&&ch<=0xFE) +{fprintf(stdout,"\177%c\177",ch); + +ch= fgetc(stdin); +if(!feof(stdin)) +fprintf(stdout,"%d\177",ch); +} +else +fputc(ch,stdout); + +ch= fgetc(stdin); +} +exit(EXIT_SUCCESS); +return 0; +}/*:2*/ diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/extconv/extconv.w b/Build/source/texk/cjkutils/cjkutils-4.8.2/extconv/extconv.w new file mode 100644 index 00000000000..554106fe78e --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/extconv/extconv.w @@ -0,0 +1,122 @@ +% This is the cweb file extconv.w of the CJK Package Ver. 4.8.2 29-Dec-2008 + +% Copyright (C) 1994-2008 Werner Lemberg <wl@@gnu.org> +% +% 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 in doc/COPYING; if not, write to the Free +% Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +% MA 02110-1301 USA + +% To print this CWEB file you should (but not must) use the CWEAVE of the +% c2cweb-package (found at the CTAN archives, e.g. ftp.dante.de) and then say +% +% cweave +a extconv.w +% +% This (fully compatible) CWEAVE can transform CWEB-files with alternative +% output rules (look at the position of braces below!) the author (it's me +% too :-) prefer. Otherwise this file will be formatted traditionally. + +\def\title{extconv (CJK Version 4.8.2)} + +\def\topofcontents{ + \null\vfill + \centerline{\titlefont The {\ttitlefont extconv} program} + \vskip 20pt + \centerline{(CJK Version 4.8.2)} + \vfill} + +\def\botofcontents{ + \vfill + \noindent + Copyright \copyright\ 1996, 1998 by Werner Lemberg + \bigskip\noindent + Permission is granted to make and distribute verbatim copies of this + document provided that the copyright notice and this permission notice + are preserved on all copies. + + \smallskip\noindent + Permission is granted to copy and distribute modified versions of this + document under the conditions for verbatim copying, provided that the + entire resulting derived work is distributed under the terms of a + permission notice identical to this one.} + +\pageno=\contentspagenumber \advance\pageno by 1 +\let\maybe=\iftrue +\fullpageheight=240mm +\pageheight=223mm +\pagewidth=158mm +\setpage +\frenchspacing + +\noinx +\nosecs +\nocon + +@* Function and Use. +This small program will convert Big~5+ or GBK encoded Chinese characters +into a `preprocessed' form. The need of this program arises from the fact +that these two encodings use the characters `\.{\\}', `\.{\{}', and `\.{\}}' +which have special meanings in \TeX. + +Use this program as a filter: + +\hskip 2em \.{extconv < input\_file > output\_file} + + +@* The program. +The only function of this program is to replace all occurrences of Big~5+ +and GBK encoded characters \.{XY} (\.{X} and \.{Y} are the first and the +second byte of the character) with +\.{\char94 \char94 7fX\char94 \char94 7fZZZ\char94 \char94 7f}, where \.{ZZZ} +represents the second byte as a decimal number. \.{0x7F} is used as an active +character and delimiter. + +Additionally we define a \TeX\ macro at the very beginning to signal a +preprocessed file. + +The following code is very simple. No error detection is done because \TeX\ +which will see the output of \.{extconv} complains loudly if something is +wrong. + +@d banner +"extconv (CJK ver. 4.8.2)" + +@c +#include <stdio.h> +#include <stdlib.h>@# + + +int main(int argc, char *argv[]) + {int ch; + + + fprintf(stdout, "\\def\\CJKpreproc{%s}", banner);@# + + ch = fgetc(stdin);@# + + while(!feof(stdin)) + {if(ch >= 0x81 && ch <= 0xFE) + {fprintf(stdout, "\177%c\177", ch);@# + + ch = fgetc(stdin); + if(!feof(stdin)) + fprintf(stdout, "%d\177", ch); + } + else + fputc(ch, stdout);@# + + ch = fgetc(stdin); + } + exit(EXIT_SUCCESS); + return 0; /* never reached */ + } diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/extconv/gbklatex b/Build/source/texk/cjkutils/cjkutils-4.8.2/extconv/gbklatex new file mode 100755 index 00000000000..4136537872e --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/extconv/gbklatex @@ -0,0 +1,43 @@ +#! /bin/sh + +# Copyright (C) 1994-2008 Werner Lemberg <wl@gnu.org> +# +# 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 in doc/COPYING; if not, write to the Free +# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +# MA 02110-1301 USA + +n=1 +argv= + +# get last argument +while test 1 -lt $#; do + eval argv$n=\$1 + argv="$argv \"\$argv$n\"" + n=`expr $n + 1` + shift +done + +# replace extension with .cjk or append .cjk if there is no extension +tex=$1 +case $tex in +""|*.cjk) + echo >&2 "Usage: $0 [options] latex-file" + exit 1;; +*) + aux=`expr "X$tex" : 'X\(.*\)\.[^/]*$' \| "X$tex" : 'X\(.*\)'`.cjk;; +esac + +extconv < "$tex" > "$aux" && eval latex "$argv" "\$aux" + +# EOF diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/extconv/gbklatex.bat b/Build/source/texk/cjkutils/cjkutils-4.8.2/extconv/gbklatex.bat new file mode 100644 index 00000000000..ccc6c76acd5 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/extconv/gbklatex.bat @@ -0,0 +1,3 @@ +call f_name %1
+extconv < %1 > %fd%%fp%%fn%.cjk
+latex %fd%%fu%%fn%.cjk
diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/extconv/gbklatex.cmd b/Build/source/texk/cjkutils/cjkutils-4.8.2/extconv/gbklatex.cmd new file mode 100644 index 00000000000..7f19637ade8 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/extconv/gbklatex.cmd @@ -0,0 +1,44 @@ +/*----------------------------------------------------------------------*\ + gbklatex.cmd + + This file is part of the CJK macro package for LaTeX2e ver. 4.8.2 + + Copyright (C) 1994-2008 Wonkoo Kim <wkim+@pitt.edu> + + 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 in doc/COPYING; if not, write to the Free + Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + MA 02110-1301 USA + + Wonkoo Kim (wkim+@pitt.edu), September 2, 1996 +\*----------------------------------------------------------------------*/ + +Call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs' +Call SysLoadFuncs + +parse arg file + +drive = filespec('drive', file) +path = filespec('path', file) +fname = filespec('name', file) +m = lastpos('.', fname) +if (m = 0) then m = length(fname) + 1 +cjkfile = drive||path||delstr(fname, m)||'.cjk' + +'extconv <' file '>' cjkfile + +ucjkfile = translate(cjkfile,'/','\') +if stream(cjkfile, 'C', 'QUERY EXISTS') \= '' then + 'call latex.cmd' ucjkfile + +/* End of gbklatex.cmd */ diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/extconv/gbkpdflatex b/Build/source/texk/cjkutils/cjkutils-4.8.2/extconv/gbkpdflatex new file mode 100755 index 00000000000..e28761ef423 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/extconv/gbkpdflatex @@ -0,0 +1,43 @@ +#! /bin/sh + +# Copyright (C) 1994-2008 Werner Lemberg <wl@gnu.org> +# +# 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 in doc/COPYING; if not, write to the Free +# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +# MA 02110-1301 USA + +n=1 +argv= + +# get last argument +while test 1 -lt $#; do + eval argv$n=\$1 + argv="$argv \"\$argv$n\"" + n=`expr $n + 1` + shift +done + +# replace extension with .cjk or append .cjk if there is no extension +tex=$1 +case $tex in +""|*.cjk) + echo >&2 "Usage: $0 [options] pdflatex-file" + exit 1;; +*) + aux=`expr "X$tex" : 'X\(.*\)\.[^/]*$' \| "X$tex" : 'X\(.*\)'`.cjk;; +esac + +extconv < "$tex" > "$aux" && eval pdflatex "$argv" "\$aux" + +# EOF diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/Makefile.gnu b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/Makefile.gnu new file mode 100644 index 00000000000..6ecf115b5dd --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/Makefile.gnu @@ -0,0 +1,127 @@ +# This file is part of the CJK package Version 4.8.2 (29-Dec-2008) + +# Copyright (C) 1994-2008 Werner Lemberg <wl@gnu.org> +# +# 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 in doc/COPYING; if not, write to the Free +# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +# MA 02110-1301 USA + +# GNU Makefile for hbf2gf + +.PHONY: default all debug documentation clean \ + do_all + +.CAUTIOUS: hbf2gf.c + +default: + @echo " say " + @echo ". " + @echo " make TARGET OS=SYSTEM " + @echo ". " + @echo " SYSTEM can be one of the following: " + @echo ". " + @echo " os2 bound (emx) " + @echo " dos (djgpp) " + @echo ". " + @echo " TARGET can be one of the following: " + @echo ". " + @echo " all debug " + @echo " documentation (needs cweave package)" + @echo " clean " + +ifdef OS + + # default values (bound executables built with emx) + FS = msdos + CC = gcc -Wall -O -DHAVE_EMTEXDIR + LIB = + O = .o + EXE = .exe + RM = del + + ifeq ($(OS),os2) + FS = msdos + CC = gcc -Wall -Zomf -Zmtd -O -DHAVE_EMTEXDIR + LIB = hbf2gf.def + O = .obj + EXE = .exe + RM = del + endif + + ifeq ($(OS),dos) + FS = msdos + CC = gcc -Wall -O -DHAVE_EMTEXDIR + LIB = + O = .o + EXE = .exe + RM = del + endif + + + %$O: %.c + $(CC) $(CFLAGS) -c -D$(FS) -o $@ $< + + %.c: %.w %.ch + $(CTANGLE) $^ $@ + %.c: %.w + $(CTANGLE) $< + + %.tex: %.w %.ch + $(CWEAVE) +ai $^ $@ + %.tex: %.w + $(CWEAVE) +ai $< + + %.dvi: %.tex + $(TEX) $* + + + all: + $(MAKE) -f Makefile.gnu do_all CFLAGS=-s + + debug: + $(MAKE) -f Makefile.gnu do_all CFLAGS=-g + + # this builds the .dvi-file + documentation: hbf2gf.dvi + + # remove the unnecessary files; + clean: + -$(RM) *.scn + -$(RM) *.toc + -$(RM) *.idx + -$(RM) *.log + -$(RM) *.o + + + do_all: hbf2gf$(EXE) + + hbf2gf$(EXE): hbf2gf$O hbf$O emdir$O emtexdir$O + ifeq ($(OS),dos) + $(CC) $(CFLAGS) -o $(basename $@) $^ + strip $(basename $@) + coff2exe $(basename $@) + -del $(basename $@) + else + $(CC) $(CFLAGS) -o $@ $^ $(LIB) + endif + + hbf$O: hbf.c hbf.h + emdir$O: emdir.c emdir.h + emtexdir$O: emtexdir.c emtexdir.h emdir.h + +else # ifdef OS + + all debug documentation clean: default + +endif diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/Makefile.in b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/Makefile.in new file mode 100644 index 00000000000..ece2f79c89a --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/Makefile.in @@ -0,0 +1,127 @@ +# Makefile for hbf2gf -- wl@gnu.org + +# Copyright (C) 1994-2008 Werner Lemberg <wl@gnu.org> +# +# 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 in doc/COPYING; if not, write to the Free +# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +# MA 02110-1301 USA + +VPATH = @srcdir@ +srcdir = @srcdir@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +libdir = @libdir@ +bindir = @bindir@ +mandir = @mandir@ + +RM = @RM@ +RMF = @RM@ -f + +TEX = tex +CTANGLE = ctangle +CWEAVE = cweave + +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ + +CC = @CC@ +CPP = @CPP@ + +MKINSTALLDIRS = $(srcdir)/mkinstalldirs + +CFLAGS = @CFLAGS@ +CPPFLAGS = @CPPFLAGS@ @DEFS@ @no_strdup@ -Dunix +MY_CFLAGS = $(CFLAGS) $(CPPFLAGS) @XX_CFLAGS@ +LDFLAGS = @LDFLAGS@ @LIBS@ + +SRC = hbf2gf.c $(srcdir)/hbf.c +OBJ = hbf2gf.o hbf.o + + +.SUFFIXES: .dvi .tex .w + + +.w.c: + $(CTANGLE) $< +.c.o: + $(CC) -c $(MY_CFLAGS) $< + +.w.tex: + $(CWEAVE) +ai $< + +.tex.dvi: + $(TEX) $< + + + +PROGRAMS = hbf2gf + +default all: $(PROGRAMS) + +hbf2gf.c: $(srcdir)/hbf2gf.w + +hbf2gf: $(OBJ) + $(CC) $(MY_CFLAGS) -o hbf2gf $(OBJ) $(LDFLAGS) + +documentation: hbf2gf.dvi + +install: $(PROGRAMS) + $(MKINSTALLDIRS) $(bindir) $(mandir)/man1 + for P in $(PROGRAMS) ; do \ + $(INSTALL_PROGRAM) $$P $(bindir)/$$P ; \ + $(INSTALL_DATA) $(srcdir)/$$P.1 $(mandir)/man1 ; \ + done + +uninstall: + -for P in $(PROGRAMS) ; do \ + $(RMF) $(bindir)/$$P ; \ + $(RMF) $(mandir)/man1/$$P.1 ; \ + done + +clean: do_clean + +distclean: do_clean + -$(RMF) dep.end $(PROGRAMS) *.dvi + -$(RMF) *~ *.orig core *.core + -$(RMF) config.cache config.log config.status Makefile + +do_clean: + -$(RMF) *.o + -$(RMF) *.scn *.toc *.idx *.log + +maintainer-clean: distclean + -$(RMF) hbf2gf.c + +depend: $(SRC) + (echo '/^#.* PUT NO STUFF BELOW/,$$d'; echo w; echo q) | \ + ed - Makefile + echo '# Dependencies generated by make depend: PUT NO STUFF BELOW' \ + >> Makefile + for file in $(SRC) ; do \ + $(CPP) $(CPPFLAGS) $$file | \ + sed -n -e 's|^# [1-9][0-9]* "\([^/].*\.h\)".*|\1|p' \ + -e 's|^# [1-9][0-9]* "\($(srcdir)/.*\.h\)".*|\1|p' | \ + sed -e 's|/\./|.|g' -e "s/^/`basename $$file .c`.o: /" ; \ + done | \ + sort -u | \ + awk '{ if (LINE == 1) \ + { line = last = $$1 } \ + else if ($$1 != last) \ + { print line ; line = last = $$1 } \ + line = line " " $$2 } \ + END { print line }' >> Makefile + +# Dependencies generated by make depend: PUT NO STUFF BELOW diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/README b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/README new file mode 100644 index 00000000000..a7de0ec1402 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/README @@ -0,0 +1,2 @@ +Additional installation documentation can be found in the files `INSTALL' +(in the top directory) and `doc/hbf2gf.txt'. diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/README b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/README new file mode 100644 index 00000000000..689d59e7397 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/README @@ -0,0 +1,10 @@ +In this directory you find some hbf2gf configuration files for common CJK +bitmap fonts. + +No paths are specified for the HBF files -- under web2c you should add the +path for these fonts to the `MISCFONTS' variable in texmf.cnf; under emTeX +you should set the environment variable `HBFONTS'. + +The font paths used here in the config files of this directory are TDS +compliant; only the `HBF_TARGET' environment variable is used (an example +would be `set HBF_TARGET=/usr/local/TeX/texmf/fonts'). diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/b5ka12.cfg b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/b5ka12.cfg new file mode 100644 index 00000000000..f5c142f0235 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/b5ka12.cfg @@ -0,0 +1,28 @@ + +hbf_header ntukai48.hbf +mag_x 1 +threshold 128 +comment Big 5 normal 48x48 pixel font scaled and adapted to 12pt + +design_size 12 + +x_offset 2 +y_offset -12 + +nmb_files -1 + +output_name b5ka12 + +checksum 123456789 + +dpi_x 300 + +pk_files no +tfm_files yes + + long_extension no + +coding codingscheme Big 5 encoded TeX text + +pk_directory $HBF_TARGET/pk/modeless/ntu/b5ka12/ +tfm_directory $HBF_TARGET/tfm/ntu/b5ka12/ diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/b5kr12.cfg b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/b5kr12.cfg new file mode 100644 index 00000000000..9d9da2c1a2f --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/b5kr12.cfg @@ -0,0 +1,30 @@ + +hbf_header ntukai48.hbf +mag_x 1 +threshold 128 +comment Big 5 normal 48x48 pixel font rotated, scaled and adapted to 12pt + +design_size 12 + +x_offset 2 +y_offset -10 + +rotation yes + +nmb_files -1 + +output_name b5kr12 + +checksum 123456789 + +dpi_x 300 + +pk_files no +tfm_files yes + + long_extension no + +coding codingscheme Big 5 encoded TeX text + +pk_directory $HBF_TARGET/pk/modeless/ntu/b5kr12/ +tfm_directory $HBF_TARGET/tfm/ntu/b5kr12/ diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/b5so12.cfg b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/b5so12.cfg new file mode 100644 index 00000000000..dc0bcd9fbf0 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/b5so12.cfg @@ -0,0 +1,31 @@ + +hbf_header et24.hbf +mag_x 2.076 +threshold 128 +comment fanti songti 24x24 pixel font magnified and adapted for 12pt + +design_size 12.0 + +x_offset 3 +y_offset -8 + +nmb_files -1 + +output_name b5so12 + +checksum 123456789 + +dpi_x 300 + +tfm_files yes +pk_files no + +coding codingscheme Big 5 encoded TeX text + +pk_directory $HBF_TARGET/pk/modeless/eten/b5so12/ +tfm_directory $HBF_TARGET/tfm/eten/b5so12/ + + rm_command del + cp_command copy + long_extension no + job_extension .cmd diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/c1so12.cfg b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/c1so12.cfg new file mode 100644 index 00000000000..de5b32b3efc --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/c1so12.cfg @@ -0,0 +1,28 @@ + +hbf_header cns40-1.hbf +mag_x 1 +threshold 128 +comment CNS plane 1 song 40x40 pixel font scaled and adapted to 12pt + +design_size 12.0 + +x_offset 2 +y_offset -8 + +nmb_files -1 + +output_name c1so12 + +checksum 123456789 + +dpi_x 300 + +pk_files no +tfm_files yes + + long_extension no + +coding codingscheme CNS plane 1 encoded TeX text + +pk_directory $HBF_TARGET/pk/modeless/cns/c1so12/ +tfm_directory $HBF_TARGET/tfm/cns/c1so12/ diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/c2so12.cfg b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/c2so12.cfg new file mode 100644 index 00000000000..969af8fae14 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/c2so12.cfg @@ -0,0 +1,28 @@ + +hbf_header cns40-2.hbf +mag_x 1 +threshold 128 +comment CNS plane 2 song 40x40 pixel font scaled and adapted to 12pt + +design_size 12.0 + +x_offset 2 +y_offset -8 + +nmb_files -1 + +output_name c2so12 + +checksum 123456789 + +dpi_x 300 + +pk_files no +tfm_files yes + + long_extension no + +coding codingscheme CNS plane 2 encoded TeX text + +pk_directory $HBF_TARGET/pk/modeless/cns/c2so12/ +tfm_directory $HBF_TARGET/tfm/cns/c2so12/ diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/c3so12.cfg b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/c3so12.cfg new file mode 100644 index 00000000000..0e65768ee5e --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/c3so12.cfg @@ -0,0 +1,28 @@ + +hbf_header cns40-3.hbf +mag_x 1 +threshold 128 +comment CNS plane 3 song 40x40 pixel font scaled and adapted to 12pt + +design_size 12.0 + +x_offset 2 +y_offset -8 + +nmb_files -1 + +output_name c3so12 + +checksum 123456789 + +dpi_x 300 + +pk_files no +tfm_files yes + + long_extension no + +coding codingscheme CNS plane 3 encoded TeX text + +pk_directory $HBF_TARGET/pk/modeless/cns/c3so12/ +tfm_directory $HBF_TARGET/tfm/cns/c3so12/ diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/c4so12.cfg b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/c4so12.cfg new file mode 100644 index 00000000000..8ea3a8b270c --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/c4so12.cfg @@ -0,0 +1,28 @@ + +hbf_header cns40-4.hbf +mag_x 1 +threshold 128 +comment CNS plane 4 song 40x40 pixel font scaled and adapted to 12pt + +design_size 12.0 + +x_offset 2 +y_offset -8 + +nmb_files -1 + +output_name c4so12 + +checksum 123456789 + +dpi_x 300 + +pk_files no +tfm_files yes + + long_extension no + +coding codingscheme CNS plane 4 encoded TeX text + +pk_directory $HBF_TARGET/pk/modeless/cns/c4so12/ +tfm_directory $HBF_TARGET/tfm/cns/c4so12/ diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/c5so12.cfg b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/c5so12.cfg new file mode 100644 index 00000000000..1b81c90a0d3 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/c5so12.cfg @@ -0,0 +1,28 @@ + +hbf_header cns40-5.hbf +mag_x 1 +threshold 128 +comment CNS plane 5 song 40x40 pixel font scaled and adapted to 12pt + +design_size 12.0 + +x_offset 2 +y_offset -8 + +nmb_files -1 + +output_name c5so12 + +checksum 123456789 + +dpi_x 300 + +pk_files no +tfm_files yes + + long_extension no + +coding codingscheme CNS plane 5 encoded TeX text + +pk_directory $HBF_TARGET/pk/modeless/cns/c5so12/ +tfm_directory $HBF_TARGET/tfm/cns/c5so12/ diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/c6so12.cfg b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/c6so12.cfg new file mode 100644 index 00000000000..5b9c912ce53 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/c6so12.cfg @@ -0,0 +1,28 @@ + +hbf_header cns40-6.hbf +mag_x 1 +threshold 128 +comment CNS plane 6 song 40x40 pixel font scaled and adapted to 12pt + +design_size 12.0 + +x_offset 2 +y_offset -8 + +nmb_files -1 + +output_name c6so12 + +checksum 123456789 + +dpi_x 300 + +pk_files no +tfm_files yes + + long_extension no + +coding codingscheme CNS plane 6 encoded TeX text + +pk_directory $HBF_TARGET/pk/modeless/cns/c6so12/ +tfm_directory $HBF_TARGET/tfm/cns/c6so12/ diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/c7so12.cfg b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/c7so12.cfg new file mode 100644 index 00000000000..051b2601426 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/c7so12.cfg @@ -0,0 +1,28 @@ + +hbf_header cns40-7.hbf +mag_x 1 +threshold 128 +comment CNS plane 7 song 40x40 pixel font scaled and adapted to 12pt + +design_size 12.0 + +x_offset 2 +y_offset -8 + +nmb_files -1 + +output_name c7so12 + +checksum 123456789 + +dpi_x 300 + +pk_files no +tfm_files yes + + long_extension no + +coding codingscheme CNS plane 7 encoded TeX text + +pk_directory $HBF_TARGET/pk/modeless/cns/c7so12/ +tfm_directory $HBF_TARGET/tfm/cns/c7so12/ diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/csso12.cfg b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/csso12.cfg new file mode 100644 index 00000000000..9ad91b0c574 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/csso12.cfg @@ -0,0 +1,28 @@ + +hbf_header cns40-b5.hbf +mag_x 1 +threshold 128 +comment CNS song 40x40 pixel font (Bg5 encoded) scaled and adapted to 12pt + +design_size 12.0 + +x_offset 2 +y_offset -8 + +nmb_files -1 + +output_name csso12 + +checksum 123456789 + +dpi_x 300 + +pk_files no +tfm_files yes + + long_extension no + +coding codingscheme Big 5 encoded TeX text + +pk_directory $HBF_TARGET/pk/modeless/cns/csso12/ +tfm_directory $HBF_TARGET/tfm/cns/csso12/ diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/gsfs14.cfg b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/gsfs14.cfg new file mode 100644 index 00000000000..4b397aca464 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/gsfs14.cfg @@ -0,0 +1,27 @@ + +hbf_header jfs56.hbf +mag_x 1 +threshold 128 +comment jianti fansongti 56x56 pixel font scaled and adapted to 14.4pt + +design_size 14.4 + +y_offset -13 + +nmb_files -1 + +output_name gsfs14 + +checksum 123456789 + +dpi_x 300 + +pk_files no +tfm_files yes + + long_extension no + +coding codingscheme GuoBiao encoded TeX text + +pk_directory $HBF_TARGET/pk/modeless/ccdos/gsfs14/ +tfm_directory $HBF_TARGET/tfm/ccdos/gsfs14/ diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/j2so12.cfg b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/j2so12.cfg new file mode 100644 index 00000000000..7e0d70b5c0f --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/j2so12.cfg @@ -0,0 +1,30 @@ + +hbf_header jisksp40.hbf +mag_x 1.0 +threshold 128 +comment supplemental kanji normal 40x40 pixel font scaled and adapted to 12pt + +design_size 12 + +min_char 0x2121 + +x_offset 2 +y_offset -7 + +nmb_files -1 + +output_name j2so12 + +checksum 123456789 + +dpi_x 300 + +pk_files no +tfm_files yes + + long_extension no + +coding codingscheme JIS2 encoded TeX text + +pk_directory $HBF_TARGET/pk/modeless/jisx0212/j2so12/ +tfm_directory $HBF_TARGET/tfm/jisx0212/j2so12/ diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/jsso12.cfg b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/jsso12.cfg new file mode 100644 index 00000000000..9bdfc7b1e8a --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/jsso12.cfg @@ -0,0 +1,28 @@ + +hbf_header kanji48.hbf +mag_x 0.83 +threshold 128 +comment kanji normal 48x48 pixel font scaled and adapted to 12pt + +design_size 12 + +x_offset 2 +y_offset -7 + +nmb_files -1 + +output_name jsso12 + +checksum 123456789 + +dpi_x 300 + +pk_files no +tfm_files yes + + long_extension no + +coding codingscheme JIS encoded TeX text + +pk_directory $HBF_TARGET/pk/modeless/jisx0208/jsso12/ +tfm_directory $HBF_TARGET/tfm/jisx0208/jsso12/ diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/ksso17.cfg b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/ksso17.cfg new file mode 100644 index 00000000000..c82f7e7eee4 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/cfg/ksso17.cfg @@ -0,0 +1,27 @@ + +hbf_header hanja65.hbf +mag_x 1 +threshold 128 +comment hanja normal 65x65 pixel font scaled and adapted to 17.28pt + +design_size 17.28 + +y_offset -16 + +nmb_files -1 + +output_name ksso17 + +checksum 123456789 + +dpi_x 300 + +pk_files no +tfm_files yes + + long_extension no + +coding codingscheme KS encoded TeX text + +pk_directory $HBF_TARGET/pk/modeless/ksc5601/ksso17/ +tfm_directory $HBF_TARGET/tfm/ksc5601/ksso17/ diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/configure.ac b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/configure.ac new file mode 100644 index 00000000000..2cd5796a51a --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/configure.ac @@ -0,0 +1,131 @@ +dnl This file is part of the CJK package ver. 4.8.2 + +dnl Copyright (C) 1994-2008 Werner Lemberg <wl@gnu.org> + +dnl This program is free software; you can redistribute it and/or modify +dnl it under the terms of the GNU General Public License as published by +dnl the Free Software Foundation; either version 2 of the License, or +dnl (at your option) any later version. + +dnl This program is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +dnl GNU General Public License for more details. + +dnl You should have received a copy of the GNU General Public License +dnl along with this program in doc/COPYING; if not, write to the Free +dnl Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +dnl MA 02110-1301 USA + +dnl Process this file with autoconf to produce a configure script. +AC_INIT +AC_CONFIG_SRCDIR([hbf.h]) + + +dnl check host +AC_CANONICAL_TARGET([]) + + +dnl Checks for programs. +AC_PROG_CC + + +dnl Checks for header files. +AC_HEADER_STDC + +AC_ARG_WITH(kpathsea-include, + [ --with-kpathsea-include=DIR + location of the kpathsea include dir],[ + if test x$withval = xyes; then + AC_MSG_WARN(Usage is: --with-kpathsea-include=includedir) + else + if test x$withval = xno; then + AC_MSG_WARN(Usage is: --with-kpathsea-include=includedir) + else + kpathsea_include=$withval + fi + fi +]) + + +dnl Checks for libraries. +AC_ARG_WITH(kpathsea-lib, + [ --with-kpathsea-lib=DIR + location of the kpathsea lib dir],[ + if test x$withval = xyes; then + AC_MSG_WARN(Usage is: --with-kpathsea-lib=libdir) + else + if test x$withval = xno; then + AC_MSG_WARN(Usage is: --with-kpathsea-lib=libdir) + else + kpathsea_lib=$withval + fi + fi +]) + + +if test -n "$kpathsea_include" -o -n "$kpathsea_lib"; then + LIBS="$LIBS -L$kpathsea_lib" + CPPFLAGS="$CPPFLAGS -I$kpathsea_include -I$srcdir" + + dnl the function kpse_set_program_name() is available since kpathsea 3.2 + AC_CHECK_LIB(kpathsea, kpse_set_program_name, , AC_DEFINE(OLD_KPATHSEA)) + + AC_CHECK_LIB(kpathsea, kpse_init_prog, ,[ + AC_MSG_ERROR([Can't find kpathsea library! Use --with-kpathsea-lib option.])]) + + dnl the header file kpathsea.h doesn't exist in kpathsea 2.6 and before + AC_CHECK_HEADER(kpathsea/kpathsea.h, , AC_DEFINE(VERY_OLD_KPATHSEA)) + + AC_CHECK_HEADER(kpathsea/c-auto.h, ,[ + AC_MSG_ERROR([Can't find kpathsea include files! Use --with-kpathsea-include option.])]) +else + CPPFLAGS="$CPPFLAGS -I$srcdir" +fi + + +dnl Get compiler flags right. +if test "x$CC" = xgcc; then + XX_CFLAGS="-Wall" +else + case "$host" in + alpha-dec-osf*) + XX_CFLAGS="-std1 -O2 -g3" + ;; + *) + XX_CFLAGS= + ;; + esac +fi +AC_SUBST(XX_CFLAGS) + + +dnl Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_STRUCT_TM + + +dnl Checks for library functions. +AC_FUNC_VPRINTF +AC_CHECK_FUNCS(strdup strstr strtol strtoul) + +dnl we need this for hbf.c +if test "x$ac_cv_func_strdup" = xno; then + no_strdup=-DNO_STRDUP +fi +AC_SUBST(no_strdup) + +AC_CHECK_PROG(RM, rm, rm) +AC_PROG_INSTALL + +if test -z "$kpathsea_include" -a -z "$kpathsea_lib"; then + AC_MSG_WARN([ + + hbf2gf will be compiled without file search library support! + For kpathsea support use the --with-kpathsea-lib and + --with-kpathsea-include options. + ]) +fi + +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/dvidrv.btm b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/dvidrv.btm new file mode 100644 index 00000000000..daeba96f01c --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/dvidrv.btm @@ -0,0 +1,352 @@ +setdos /y1 +:: +:: Copyright (C) 1994-2008 Werner Lemberg <wl@gnu.org> +:: +:: 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 in doc/COPYING; if not, write to the Free +:: Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +:: MA 02110-1301 USA +:: +:: +:: This is dvidrv.btm, a batch file for 4DOS/4OS2 written by +:: Werner Lemberg <wl@gnu.org> partially based on the +:: dvidrv.btm file of the 4allTeX package written by Phons Bloemen. +:: +:: It is a replacement for dvidrv.exe of the emTeX package. +:: +:: Additional features: support of ps2pk +:: support of ttf2pk +:: support of hbf2gf for HBFs (Hanzi bitmap fonts) +:: +:: Only quadratic printer modes are supported for ttf2pk! +:: +:: All needed binaries will be searched in the path. + +iff %# lt 2 then + echo `` + echo Usage: %0 dvi-driver dvi-file [parameters] + quit +endiff + +setlocal + :: we set a default value only if the corresponding environment variable + :: is empty. The `=' must follow the variable name immediately. + alias set_def `iff "%[%@word["=",0,%1]]" eq "" then %+ set %& %+ endiff` + + :: ========================================= + :: ======== User defined variables. ======== + :: ========================================= + :: + :: Can be overridden in the environment (except %ps2pk, %ttf2pk, %hbf2gf, + :: %pre_dpi, and %post_dpi). + + :: Comment out the programs you don't want to use. + set ps2pk=yes + set ttf2pk=yes + set hbf2gf=yes + + :: where the PK files will be installed created by ps2pk, ttf2pk, and + :: hbf2gf. + :: dvidrv.btm adds `\modeless\XXXdpi' to this string (see below for the + :: exact string). + set_def pkdir=%emtexdir\pixel\tmp\pk + + :: where the TrueType fonts reside. + set_def ttfonts=%emtexdir\fonts\truetype + :: where auxiliary files of ttf2pk are located. + set_def ttfcfg=%emtexdir\ttf2pk + + :: where the HBF files reside. + set_def hbfonts=%emtexdir\fonts\hbf + :: where the hbf2gf config files are. + set_def hbfcfg=%emtexdir\hbf2gf + + :: the dpi-subdirectory has various forms; the most common are XXXdpi and + :: dpiXXX, e.g. 300dpi and dpi300. Here we define two variables which + :: control this behaviour. + :: [dpiXXX is used for TDS compatible TeX trees.] + set pre_dpi=dpi + set post_dpi= + + :: ================================================ + :: ======== End of user defined variables. ======== + :: ================================================ + + :: the base name for log files etc. + set basename=%@name[%1] + + :: do we run dvips? + iff "%basename" ne "dvips" then + goto nodvips1 + endiff + + :: we delete dvips.mfj if it exists. + del dvips.mfj >& nul + + :: now we run dvips with all supplied parameters. + %& + + :: do we have to generate fonts? + iff exist dvips.mfj then + goto generate_fonts + endiff + + :: else all is done. + goto end + + +:nodvips1 + :: here we call the dvi driver with all supplied parameters. + %& -pj:%basename.mfj + + :: do we have to generate fonts? + iff errorlevel 8 then + goto generate_fonts + endiff + + :: else all is done. + goto end + + +:generate_fonts + gosub call_mfjob + + :: do we run dvips? + iff "%basename" ne "dvips" then + goto nodvips2 + endiff + + :: we now call dvips a second time + %& + + :: since no fonts will be generated in the second run we remove dvips.mfj + del dvips.mfj >& nul + + goto end + + +:nodvips2 + :: we call the dvi driver a second time (without font generation). + %& -pj -fm + + del %basename.mfj >& nul + + goto end + + +:: this is the main subroutine which calls mfjob and then parses the mfjob +:: file for fonts which can be handled by ps2pk, ttf2pk, or hbf2gf. +:call_mfjob + :: this alias prints a message on the screen and writes it into the logfile. + alias echolog=`echo %& | tee /a %basename.mlg` + + echo ======== DVIDRV.BTM logfile ======== > %basename.mlg + echo Commandline: dvidrv.btm %& >> %basename.mlg + echo `` >> %basename.mlg + echo basename=%basename >> %basename.mlg + echo emtexdir=%emtexdir >> %basename.mlg + echo dvidrvfonts=%dvidrvfonts >> %basename.mlg + echo mfinput=%mfinput >> %basename.mlg + echo mfjobopt=%mfjobopt >> %basename.mlg + echo textfm=%textfm >> %basename.mlg + echo psfonts=%psfonts >> %basename.mlg + echo ttfonts=%ttfonts >> %basename.mlg + echo ttfcfg=%ttfcfg >> %basename.mlg + echo hbfonts=%hbfonts >> %basename.mlg + echo hbfcfg=%hbfcfg >> %basename.mlg + echo `` >> %basename.mlg + + iff "%@search[mfjob]" eq "" then + echolog MFJOB not found in the path. + echolog Can't generate PK fonts from METAFONT automatically. + echo `` + quit + endiff + + :: now we call mfjob. + echolog mfjob %mfjobopt -g%basename.mfl %basename.mfj + mfjob %mfjobopt -g%basename.mfl %basename.mfj + iff %? gt 0 then + echolog `` + echolog Something went wrong while running METAFONT. + echolog Look into the log files... + echolog `` + endiff + + :: after running mfjob we scan the mfjob input file for fonts which can + :: be handled by ps2pk, ttf2pk or hbf2gf. + set lnnr=0 + set totlines=%@lines[%basename.mfj] + + do while %lnnr le %totlines + :: input a line. + set scratch=%@line[%basename.mfj,%lnnr] + set lnnr=%@inc[%lnnr] + + :: get resolutions (METAFONT mode will be ignored). + :: example: + :: mode=lqlores[180 180]; + iff %@index[%scratch,mode] ge 0 then + set temp=%@word["[]",1,%scratch] + set xdpi=%@word[0,%temp] + set ydpi=%@word[1,%temp] + endiff + + :: get fontname and magnification; we then compute the font resolutions + :: (rounded to the nearest integer---there is no necessity to adjust + :: these values further because of possible rounding errors since both + :: emTeX's dvi drivers and dvips check neighbored values too). + :: example: + :: {font=cmr10; mag=0.5;} + iff %@index[%scratch,{font] ge 0 then + set testfont=%@word["=;",1,%scratch] + set temp=%@word["=;",3,%scratch] + :: we use highest arithmetic precision for these calculations. + :: Additionally we write 1/2 instead of 0.5 to avoid problems with + :: countries which use a comma instead of a colon as the decimal + :: separator. + set fontresx=%@int[%@eval[%xdpi*%temp+1/2=8]] + set fontresy=%@int[%@eval[%ydpi*%temp+1/2=8]] + set pksubdir=modeless\%[pre_dpi]%[fontresx]%post_dpi + + set success=0 + + :: check whether %testfont leads to a PS font (we call ps2pkmfj). + iff %success == 0 .and. "%ps2pk" ne "" then + gosub call_ps2pk + endiff + + :: check whether %testfont leads to a TrueType font. + iff %success == 0 .and. "%ttf2pk" ne "" then + gosub call_ttf2pk + endiff + + :: check whether %testfont leads to a HBF file. + iff %success == 0 .and. "%hbf2gf" ne "" then + gosub call_hbf2gf + endiff + endiff + enddo + + iff exist %basename.mfp then + echo `` >> %basename.mlg + echo `` >> %basename.mlg + echo ======== PS2PK logfile ======== >> %basename.mlg + echo `` >> %basename.mlg + type %basename.mfp >> %basename.mlg + echo `` >> %basename.mlg + del %basename.mfp >& nul + endiff + + iff exist %basename.mfl then + echo `` >> %basename.mlg + type %basename.mfl >> %basename.mlg + echo `` >> %basename.mlg + del %basename.mfl >& nul + endiff + + return + + +:call_ttf2pk + iff "%@search[ttf2pk]" eq "" then + echolog TTF2PK not found in the path. + echolog Can't generate PK fonts from TrueType fonts automatically. + echo `` + quit + endiff + + echolog ttf2pk -q -n %testfont %fontresx + ttf2pk -q -n %testfont %fontresx + + iff %? == 0 then + echolog Font %pkdir\%pksubdir\%testfont.pk generated. + mkdir /s %pkdir\%pksubdir >& nul + move %testfont.pk %pkdir\%pksubdir >& nul + set success=1 + elseiff %? == 2 then + echolog (%lnnr/%totlines): Font %testfont is no TrueType font. + set success=0 + else + echolog Error running TTF2PK for font %testfont! + endiff + + return + + +:call_hbf2gf + iff "%@search[hbf2gf]" eq "" then + echolog HBF2GF not found in the path. + echolog Can't generate PK fonts from HBF files automatically. + echo `` + quit + endiff + + echolog hbf2gf -q -p -n %testfont %fontresx %fontresy + hbf2gf -q -p -n %testfont %fontresx %fontresy + + iff %? == 0 then + echolog Font %pkdir\%pksubdir\%testfont.pk generated. + mkdir /s %pkdir\%pksubdir >& nul + gftopk %testfont.gf %testfont.pk + move %testfont.pk %pkdir\%pksubdir >& nul + del %testfont.gf >& nul + set success=1 + elseiff %? == 2 then + echolog (%lnnr/%totlines): Font %testfont is no HBF. + set success=0 + else + echolog Error running HBF2GF for font %testfont! + endiff + + return + + +:call_ps2pk + iff not exist %pkdir\%pksubdir\%testfont.pk then + iff "%@search[ps2pkmfj]" eq "" .or. "%@search[ps2pk]" eq "" then + echolog PS2PKMFJ and/or PS2PK not found in the path. + echolog Can't generate PK fonts from PostScript fonts automatically. + echo `` + quit + endiff + + echolog ps2pkmfj -X%fontresx -Y%fontresy %testfont %testfont.pk + ps2pkmfj -X%fontresx -Y%fontresy %testfont %testfont.pk | input %%pspkline + + iff errorlevel != 1 then + %pspkline >> %basename.mfp + iff %? == 0 then + echolog Font %pkdir\%pksubdir\%testfont.pk generated. + mkdir /s %pkdir\%pksubdir >& nul + move %testfont.pk %pkdir\%pksubdir >& nul + success=1 + else + echolog Error running PS2PK for font %testfont! + endiff + else + echolog (%lnnr/%totlines): Font %testfont is no PS font. + success=0 + endiff + else + echolog Font %pkdir\%pksubdir\%testfont.pk already exists. + endiff + + return + + +:end + +endlocal + +:: ==== end of dvidrv.btm ==== diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/emdir.c b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/emdir.c new file mode 100644 index 00000000000..4e759c83eb2 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/emdir.c @@ -0,0 +1,109 @@ +/* emdir.c -- Written by Eberhard Mattes, donated to the public domain */ + +#include "emdir.h" + +#ifdef OS2 + +#undef HPS +#define INCL_DOSFILEMGR +#include <os2.h> +#include <string.h> + +#define FHDIR(b) (*(HDIR *)(b)->reserved) + +static void fconv (struct ll_findbuffer *dst, const FILEFINDBUF *src) +{ + dst->attr = src->attrFile; + dst->time = *(unsigned *)&src->ftimeLastWrite; + dst->date = *(unsigned *)&src->fdateLastWrite; + dst->size = src->cbFile; + strcpy (dst->name, src->achName); +} + + +int ll_findfirst (const char *path, int attr, struct ll_findbuffer *buffer) +{ + USHORT rc; + ULONG count; + HDIR hdir; + FILEFINDBUF ffbuf; + + hdir = HDIR_CREATE; + count = 1; + rc = DosFindFirst ((PSZ)path, &hdir, attr, &ffbuf, sizeof (ffbuf), + &count, 0L); + if (rc != 0 || count != 1) + return 0; + FHDIR (buffer) = hdir; + fconv (buffer, &ffbuf); + return 1; +} + + +int ll_findnext (struct ll_findbuffer *buffer) +{ + USHORT rc; + ULONG count; + HDIR hdir; + FILEFINDBUF ffbuf; + + hdir = FHDIR (buffer); + count = 1; + rc = DosFindNext (hdir, &ffbuf, sizeof (ffbuf), &count); + if (rc != 0 || count != 1) + { + DosFindClose (hdir); + return 0; + } + fconv (buffer, &ffbuf); + return 1; +} + + +#elif defined(DJGPP) + +/* djgpp support by Hartmut Schirmer (hsc@techfak.uni-kiel.de), May 30, 1997 */ + +#include <dos.h> +#include <dir.h> + +static int ll_attr = 0; +int ll_findnext (struct ll_findbuffer *buffer) +{ + int res; + do { + res = _dos_findnext ((struct find_t *)buffer); + if (res != 0) return 0; + } while ( (buffer->attrib&ll_attr) == 0); + return 1; +} + +int ll_findfirst (const char *path, int attr, struct ll_findbuffer *buffer) +{ + int res; + ll_attr = attr; + res = _dos_findfirst((char *)path, attr, (struct find_t *)buffer); + if (res != 0) return 0; + if ( (buffer->attrib&ll_attr) == 0) + return ll_findnext(buffer); + return 1; +} + +#elif !defined(__EMX__) /* if not OS2 nor DJGPP nor __EMX__ defined */ + +/* Not tested */ + +#include <dos.h> + +int ll_findfirst (const char *path, int attr, struct ll_findbuffer *buffer) +{ + return _dos_findfirst (path, attr, (struct find_t *)buffer) == 0; +} + + +int ll_findnext (struct ll_findbuffer *buffer) +{ + return _dos_findnext ((struct find_t *)buffer) == 0; +} + +#endif diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/emdir.h b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/emdir.h new file mode 100644 index 00000000000..0606d476ab1 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/emdir.h @@ -0,0 +1,25 @@ +/* emdir.h -- Written by Eberhard Mattes, donated to the public domain */ + +#if defined(DJGPP) + +/* djgpp support by Hartmut Schirmer (hsc@techfak.uni-kiel.de), May 30, 1997 */ +#include <dos.h> +#define ll_findbuffer find_t +#define attr attrib + +#else + +struct ll_findbuffer +{ + char reserved[21]; + unsigned char attr; + unsigned time; + unsigned date; + long size; + char name[257]; +}; + +#endif + +int ll_findfirst (const char *path, int attr, struct ll_findbuffer *buffer); +int ll_findnext (struct ll_findbuffer *buffer); diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/emtexdir.c b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/emtexdir.c new file mode 100644 index 00000000000..9a35570adb3 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/emtexdir.c @@ -0,0 +1,405 @@ +/* emtexdir.c -- written by Eberhard Mattes, donated to the public domain */ + +#if defined (__EMX__) +#include <emx/syscalls.h> +#else +#include "emdir.h" +#endif +#if defined(DJGPP) || defined(GO32) +#include <unistd.h> +#endif +#include <stdlib.h> +#include <string.h> +#include <fcntl.h> +#include <io.h> +#include "emtexdir.h" + +#define FALSE 0 +#define TRUE 1 + +void (*emtex_dir_find_callback)(const char *name, int ok) = NULL; + +static int setup_add (struct emtex_dir *dst, const char *path) +{ + char *p; + + if (dst->used >= dst->alloc) + { + dst->alloc += 8; + dst->list = realloc (dst->list, dst->alloc * sizeof (*dst->list)); + if (dst->list == NULL) + return (FALSE); + } + p = strdup (path); + if (p == NULL) + return (FALSE); + dst->list[dst->used++] = p; + return (TRUE); +} + + +static int setup_subdir (struct emtex_dir *dst, char *path, size_t add, + unsigned flags, int recurse) +{ + int ok, i, end, len; +#if defined (__EMX__) + struct _find find; +#else + struct ll_findbuffer find; +#endif + + i = dst->used; + strcpy (path + add, "*.*"); +#if defined (__EMX__) + ok = __findfirst (path, 0x10, &find) == 0; +#else + ok = ll_findfirst (path, 0x10, &find); +#endif + while (ok) + { + if ((find.attr & 0x10) + && !(strcmp (find.name, ".") == 0 || strcmp (find.name, "..") == 0)) + { + len = strlen (find.name); + memcpy (path + add, find.name, len); + path[add+len] = '\\'; + path[add+len+1] = 0; + if (!setup_add (dst, path)) + return (FALSE); + } +#if defined (__EMX__) + ok = __findnext (&find) == 0; +#else + ok = ll_findnext (&find); +#endif + } + if (recurse) + { + end = dst->used; + while (i < end) + { + strcpy (path, dst->list[i]); + if (!setup_subdir (dst, path, strlen (path), flags, TRUE)) + return (FALSE); + ++i; + } + } + return (TRUE); +} + + +static int setup_dir (struct emtex_dir *dst, char *path, + const char *base_dir, size_t base_dir_len, + const char *sub_dir, + unsigned flags) +{ + size_t i, len; + + memcpy (path, base_dir, base_dir_len); + i = base_dir_len; + if ((flags & EDS_BANG) && sub_dir == NULL) + { + flags &= ~(EDS_ONESUBDIR|EDS_ALLSUBDIR); + if (i >= 2 && path[i-1] == '!' && path[i-2] == '!') + { + flags |= EDS_ALLSUBDIR; + i -= 2; + } + else if (i >= 1 && path[i-1] == '!') + { + flags |= EDS_ONESUBDIR; + --i; + } + } + if (sub_dir != NULL && *sub_dir != 0) + { + if (i != 0 && path[i-1] != ':' && path[i-1] != '/' && path[i-1] != '\\') + path[i++] = '\\'; + len = strlen (sub_dir); + memcpy (path+i, sub_dir, len); + i += len; + } + if (path[i-1] != ':' && path[i-1] != '/' && path[i-1] != '\\') + path[i++] = '\\'; + path[i] = 0; + if (!setup_add (dst, path)) + return (FALSE); + if (flags & EDS_ALLSUBDIR) + return (setup_subdir (dst, path, i, flags, TRUE)); + else if (flags & EDS_ONESUBDIR) + return (setup_subdir (dst, path, i, flags, FALSE)); + else + return (TRUE); +} + + +/*static */int setup_list (struct emtex_dir *dst, char *path, + const char *list, unsigned flags) +{ + const char *end; + size_t i; + + for (;;) + { + while (*list == ' ' || *list == '\t') + ++list; + if (*list == 0) + return (TRUE); + end = list; + while (*end != 0 && *end != ';') + ++end; + i = end - list; + while (i > 0 && (list[i-1] == ' ' || list[i-1] == '\t')) + --i; + if (i != 0 && !setup_dir (dst, path, list, i, NULL, flags)) + return (FALSE); + if (*end == 0) + return (TRUE); + list = end + 1; + } +} + + +int emtex_dir_setup (struct emtex_dir *ed, const char *env, const char *dir, + unsigned flags) +{ + const char *val; + char path[260]; + + ed->alloc = 0; + ed->used = 0; + ed->list = NULL; + if (env != NULL && (val = getenv (env)) != NULL) + return (setup_list (ed, path, val, flags)); + else if ((val = getenv ("EMTEXDIR")) != NULL) + return (setup_dir (ed, path, val, strlen (val), dir, flags)); + else + return (setup_dir (ed, path, "\\emtex", 6, dir, flags)); +} + + +static void pretty (char *path, unsigned flags) +{ + char *p; + + if (flags & EDF_FSLASH) + for (p = path; *p != 0; ++p) + if (*p == '\\') + *p = '/'; +} + + +#define ADDCHAR(C) \ + if (dst_size < 1) return (EDT_TOOLONG); \ + *dst++ = (C); --dst_size + +int emtex_dir_trunc (char *dst, size_t dst_size, const char *src, + unsigned flags, int method) +{ + int len, truncated, dot; + + if (src[0] != 0 && src[1] == ':') + { + ADDCHAR (src[0]); + ADDCHAR (src[1]); + src += 2; + } + + truncated = FALSE; dot = FALSE; len = 0; + for (;;) + { + switch (*src) + { + case 0: + ADDCHAR (0); + return (truncated ? EDT_CHANGED : EDT_UNCHANGED); + + case ':': + return (EDT_INVALID); + + case '/': + case '\\': + ADDCHAR (*src); + len = 0; dot = FALSE; + break; + + case '.': + if (dot) + return (EDT_INVALID); + ADDCHAR (*src); + + /* ".." is allowed -- don't return EDT_INVALID for the next + dot. */ + + if (!(len == 0 && src[1] == '.' + && (src[2] == 0 || src[2] == '/' || src[2] == '\\'))) + { + len = 0; dot = TRUE; + } + break; + + default: + if (dot && len == 3) + truncated = TRUE; + else if (!dot && len == 8) + { + truncated = TRUE; + if (method == 0) + { + dst[-3] = dst[-2]; + dst[-2] = dst[-1]; + dst[-1] = *src; + } + } + else + { + ADDCHAR (*src); + ++len; + } + break; + } + ++src; + } +} + + +static int find2 (const char *name, unsigned flags) +{ + int ok; + + ok = (access (name, 4) == 0); + if (flags & EDF_TRACE) + emtex_dir_find_callback (name, ok); + return (ok); +} + + +static int find1 (char *path, size_t path_size, const char *dir, + const char *fname, unsigned flags) +{ + char buf[260]; + int method, rc; + size_t len, tmp; + + len = 0; + if (dir != NULL) + { + tmp = strlen (dir); + if (tmp >= sizeof (buf)) + return (FALSE); + memcpy (buf, dir, tmp); + len = tmp; + } + tmp = strlen (fname); + if (len + tmp >= sizeof (buf)) + return (FALSE); + memcpy (buf + len, fname, tmp + 1); + len += tmp; +#if 0 /* wkim */ +/* disabled for Win95's long file name support */ +/* -- Wonkoo Kim (wkim+@pitt.edu), May 18, 1997 */ + if (_osmode == DOS_MODE) + { + rc = emtex_dir_trunc (path, path_size, buf, flags, EDT_5_PLUS_3); + if ((rc == EDT_UNCHANGED || rc == EDT_CHANGED) && find2 (path, flags)) + { + pretty (path, flags); + return (TRUE); + } + rc = emtex_dir_trunc (path, path_size, buf, flags, EDT_8); + if (rc == EDT_CHANGED && find2 (path, flags)) + { + pretty (path, flags); + return (TRUE); + } + return (FALSE); + } + else +#endif /* wkim */ + { + if (len < path_size && find2 (buf, flags)) + { + memcpy (path, buf, len + 1); + pretty (path, flags); + return (TRUE); + } + for (method = 0; method < 2; ++method) + { + rc = emtex_dir_trunc (path, path_size, buf, flags, method); + if (rc == EDT_CHANGED && find2 (path, flags)) + { + pretty (path, flags); + return (TRUE); + } + } + return (FALSE); + } +} + + +int emtex_dir_find (char *path, size_t path_size, + const struct emtex_dir *ed, + const char *fname, unsigned flags) +{ + int i, absp; + const char *p; + + absp = FALSE; + for (p = fname; *p != 0; ++p) + if (*p == ':' || *p == '/' || *p == '\\') + { + absp = TRUE; + break; + } + + if (absp) + return (find1 (path, path_size, NULL, fname, flags)); + + if ((flags & EDF_CWD) && find1 (path, path_size, NULL, fname, flags)) + return (TRUE); + + for (i = 0; i < ed->used; ++i) + if (find1 (path, path_size, ed->list[i], fname, flags)) + return (TRUE); + return (FALSE); +} + + +#if defined (TEST) + +#include <stdio.h> + +int main (int argc, char *argv[]) +{ + struct emtex_dir ed; + int i; + unsigned flags1, flags2; + char path[260]; + + if (argc != 6) + { + puts ("Usage: emtexdir <flags> <flags> <env> <dir> <fname>"); + return (1); + } + + flags1 = (unsigned)strtol (argv[1], NULL, 0); + flags2 = (unsigned)strtol (argv[2], NULL, 0); + + if (!emtex_dir_setup (&ed, argv[3], argv[4], flags1)) + { + fputs ("emtex_dir_setup failed\n", stderr); + return (2); + } + + printf ("Directories:\n"); + for (i = 0; i < ed.used; ++i) + printf (" %s\n", ed.list[i]); + + if (!emtex_dir_find (path, sizeof (path), &ed, argv[5], flags2)) + puts ("File not found"); + else + printf ("Path: %s\n", path); + return (0); +} + +#endif diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/emtexdir.h b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/emtexdir.h new file mode 100644 index 00000000000..a9a986db05b --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/emtexdir.h @@ -0,0 +1,57 @@ +/* emtexdir.h -- written by Eberhard Mattes, donated to the public domain */ + +#if !defined (_EMTEXDIR_H) +#define _EMTEXDIR_H + +#if defined (__cplusplus) +extern "C" { +#endif + + +/* Flags for emtex_dir_setup */ + +#define EDS_ONESUBDIR 0x0001 +#define EDS_ALLSUBDIR 0x0002 +#define EDS_BANG 0x0004 + +/* Flags for emtex_dir_find */ + +#define EDF_CWD 0x0001 +#define EDF_FSLASH 0x0002 +#define EDF_TRACE 0x8000 + +/* Methods for emtex_dir_trunc */ + +#define EDT_5_PLUS_3 0 /* 5+3.3 */ +#define EDT_8 1 /* 8.3 */ + +/* Return values for emtex_dir_trunc */ + +#define EDT_UNCHANGED 0 /* Path name not changed */ +#define EDT_CHANGED 1 /* Path name truncated */ +#define EDT_TOOLONG 2 /* Path name too long */ +#define EDT_INVALID 3 /* Path name invalid */ + +struct emtex_dir +{ + char **list; + int used; + int alloc; +}; + +extern void (*emtex_dir_find_callback)(const char *name, int ok); + +int emtex_dir_setup (struct emtex_dir *ed, const char *env, const char *dir, + unsigned flags); + +int emtex_dir_find (char *path, size_t path_size, const struct emtex_dir *ed, + const char *fname, unsigned flags); + +int emtex_dir_trunc (char *dst, size_t dst_size, const char *src, + unsigned flags, int method); + +#if defined (__cplusplus) +} +#endif + +#endif /* !defined (_EMTEXDIR_H) */ diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/hbf.c b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/hbf.c new file mode 100644 index 00000000000..6056555d704 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/hbf.c @@ -0,0 +1,1496 @@ +/* + * Copyright 1993,1994,1995,2005 by Ross Paterson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * + * Ross Paterson <ross@soi.city.ac.uk> + * 17 October 1995 + * + * The following people have supplied bug fixes: + * + * Simon Chow <khsc@synoptics.com> + * Fung Fung Lee <lee@simd.stanford.edu> + * Man-Chi Pong <mcpong@cs.ust.hk> + * Steven Simpson <simpson@math.psu.edu> + * Charles Wang <charles.wang@infores.com> + * Werner Lemberg <wl@gnu.org> + * + * Ross no longer maintains this code. Please send bug reports to + * Werner Lemberg <wl@gnu.org>. + * + */ + +/* + * Two C interfaces to HBF files. + * + * The multiple interfaces make this code rather messy; I intend + * to clean it up as experience is gained on what is really needed. + * + * There are also two modes of operation: + * - the default is to read each bitmap from its file as demanded + * - if IN_MEMORY is defined, the whole bitmap file is held in memory. + * In this case, if running under Unix, the bitmap files may be gzipped + * (but the filename used in the HBF file should be the name of the + * file before it was gzipped). + */ +#include <stddef.h> +#include <stdlib.h> +#include <stdio.h> +#include <ctype.h> +#include <string.h> +#include "hbf.h" + +#ifdef __MSDOS__ +#define msdos +#endif + +/* + * if the linker complains about an unresolved identifier '_strdup', + * uncomment the following definition. + */ +/* #define NO_STRDUP */ + +#ifdef __STDC__ +# define _(x) x +#else +# define _(x) () +#endif + +#define reg register + +typedef int bool; +#define TRUE 1 +#define FALSE 0 + +#define Bit(n) (1<<(7 - (n))) + +/* + * Messy file system issues + */ + +#ifdef unix +#define PATH_DELIMITER ':' +#define RelativeFileName(fn) ((fn)[0] != '/') +#define LocalFileName(fn) (strchr(fn, '/') == NULL) +#endif /* unix */ +#ifdef msdos +#define PATH_DELIMITER ';' +#define HasDrive(fn) (isalpha((fn)[0]) && (fn)[1] == ':') +#ifdef __EMX__ +#define RelativeFileName(fn) (! HasDrive(fn) && \ + !((fn)[0] == '\\' || (fn)[0] == '/')) +#define LocalFileName(fn) (! HasDrive(fn) && \ + strchr(fn, '\\') == NULL && \ + strchr(fn, '/') == NULL) +#else +#define RelativeFileName(fn) (! HasDrive(fn) && (fn)[0] != '\\') +#define LocalFileName(fn) (! HasDrive(fn) && strchr(fn, '\\') == NULL) +#endif /* __EMX__ */ +#define READ_BINARY "rb" +#endif /* msdos */ +#ifdef vms +#define PATH_DELIMITER ',' +#define RelativeFileName(fn) (strchr(fn, ':') == NULL && ((fn)[0] != '[' || (fn)[1] == '.' || (fn)[1] == '-')) +#define LocalFileName(fn) (strchr(fn, ':') == NULL && strchr(fn, ']') == NULL) +#endif + +#ifndef RelativeFileName +#define RelativeFileName(fn) FALSE +#endif + +#ifndef LocalFileName +#define LocalFileName(fn) FALSE +#endif + +#ifndef READ_BINARY +#define READ_BINARY "r" +#endif + +#define MAX_FILENAME 1024 + +/* + * Internal structures + */ + +typedef unsigned char byte; + +#define PROPERTY struct _PROPERTY +#define BM_FILE struct _BM_FILE +#define B2_RANGE struct _B2_RANGE +#define CODE_RANGE struct _CODE_RANGE + +PROPERTY { + char *prop_name; + char *prop_value; + PROPERTY *prop_next; +}; + +BM_FILE { + char *bmf_name; +#ifdef IN_MEMORY + byte *bmf_contents; +#else + FILE *bmf_file; +#endif + long bmf_size; + BM_FILE *bmf_next; +}; + +B2_RANGE { + byte b2r_start; + byte b2r_finish; + B2_RANGE *b2r_next; +}; + +typedef unsigned short CHAR; +typedef unsigned int CHAR_INDEX; /* character index in file */ +#define BAD_CHAR_INDEX 0xffff + +CODE_RANGE { + CHAR code_start; + CHAR code_finish; + BM_FILE *code_bm_file; + long code_offset; + CHAR_INDEX code_pos; + bool code_transposed; + bool code_inverted; + CODE_RANGE *code_next; +}; + +/* + * Extended internal version of HBF + */ + +typedef struct { + /* fields corresponding to the definition */ + HBF public; + /* plus internal stuff */ + char *filename; + byte *bitmap_buffer; + unsigned int b2_size; /* number of legal byte-2's */ + PROPERTY *property; + B2_RANGE *byte_2_range; + CODE_RANGE *code_range; + BM_FILE *bm_file; +} HBF_STRUCT; + +#define FirstByte(code) ((code)>>8) +#define SecondByte(code) ((code)&0xff) +#define MakeCode(byte1,byte2) (((byte1)<<8)|(byte2)) + +/* size of a bitmap in the file (may be affected by transposition) */ +#define FileBitmapSize(hbfFile,cp) \ + ((cp)->code_transposed ? \ + (hbfBitmapBBox(hbfFile)->hbf_height + 7)/8 * \ + hbfBitmapBBox(hbfFile)->hbf_width : \ + HBF_BitmapSize(hbfFile)) + +#define NEW(type) ((type *)malloc((unsigned)(sizeof(type)))) + +#define QUOTE '"' + +#define MAXLINE 1024 + +#ifdef WIN32 +#define strdup(x) _strdup(x) +#else + extern char *strdup _((const char *s)); +#endif + +static void add_b2r _((B2_RANGE **last_b2r, int start, int finish)); +static bool add_code_range _((HBF_STRUCT *hbf, const char *line)); +static void add_property _((HBF_STRUCT *hbf, const char *lp)); +static CHAR_INDEX b2_pos _((HBF_STRUCT *hbf, HBF_CHAR code)); +static int b2_size _((B2_RANGE *b2r)); +static void clear_bbox _((HBF_BBOX *bbox)); +static void clear_record _((HBF_STRUCT *hbf)); +static char *concat _((const char *dir, int dirlen, const char *stem)); +static char *expand_filename _((const char *name, const char *filename)); +static const byte *get_bitmap + _((HBF_STRUCT *hbf, HBF_CHAR code, byte *buffer)); +static byte *local_buffer _((HBF_STRUCT *hbf)); +static void invert _((byte *buffer, unsigned length)); +#ifdef IN_MEMORY +static bool read_bitmap_file _((BM_FILE *bmf, FILE *f)); +static bool copy_transposed + _((HBF *hbf, byte *bitmap, const byte *source)); +#else +static bool get_transposed _((HBF *hbf, FILE *f, byte *bitmap)); +#endif +static bool match _((const char *lp, const char *sp)); +static bool parse_file _((FILE *f, HBF_STRUCT *hbf)); +static FILE *path_open + _((const char *path, const char *filename, char **fullp)); +static bool real_open _((const char *filename, HBF_STRUCT *hbf)); + +/* Error reporting */ + +int hbfDebug; /* set this for error reporting */ + +#ifdef __STDC__ +#include <stdarg.h> + +static void +eprintf(const char *fmt, ...) +{ + if (hbfDebug) { + va_list args; + + (void)fprintf(stderr, "HBF: "); + va_start(args, fmt); + (void)vfprintf(stderr, fmt, args); + va_end(args); + (void)fprintf(stderr, "\n"); + } +} +#else /* ! __STDC__ */ +/* poor man's variable-length argument list */ +static void +eprintf(fmt, x1, x2, x3, x4, x5, x6, x7, x8, x9) + const char *fmt; + int x1, x2, x3, x4, x5, x6, x7, x8, x9; +{ + if (hbfDebug) { + (void)fprintf(stderr, "HBF: "); + (void)fprintf(stderr, fmt, x1, x2, x3, x4, x5, x6, x7, x8, x9); + (void)fprintf(stderr, "\n"); + } +} +#endif /* __STDC__ */ + +static void +clear_bbox(HBF_BBOX *bbox) +{ + bbox->hbf_width = bbox->hbf_height = 0; + bbox->hbf_xDisplacement = bbox->hbf_yDisplacement = 0; +} + +static void +clear_record(HBF_STRUCT *hbf) +{ + clear_bbox(&(hbf->public.hbf_bitmap_bbox)); + clear_bbox(&(hbf->public.hbf_font_bbox)); + hbf->property = NULL; + hbf->filename = NULL; + hbf->bitmap_buffer = NULL; + hbf->byte_2_range = NULL; + hbf->code_range = NULL; + hbf->bm_file = NULL; +} + +/* + * Byte-2 ranges + */ + +static void +add_b2r(reg B2_RANGE **last_b2r, int start, int finish) +{ +reg B2_RANGE *b2r; + + b2r = NEW(B2_RANGE); + while (*last_b2r != NULL && (*last_b2r)->b2r_start < start) + last_b2r = &((*last_b2r)->b2r_next); + b2r->b2r_next = *last_b2r; + b2r->b2r_start = start; + b2r->b2r_finish = finish; + *last_b2r = b2r; +} + +static CHAR_INDEX +b2_pos(HBF_STRUCT *hbf, HBF_CHAR code) +{ +reg B2_RANGE *b2r; +reg unsigned c; +reg CHAR_INDEX pos; + + c = SecondByte(code); + pos = 0; + for (b2r = hbf->byte_2_range; b2r != NULL; b2r = b2r->b2r_next) + if (b2r->b2r_start <= c && c <= b2r->b2r_finish) + return pos + c - b2r->b2r_start; + else + pos += b2r->b2r_finish - b2r->b2r_start + 1; + return BAD_CHAR_INDEX; +} + +static int +b2_size(reg B2_RANGE *b2r) +{ +reg int size; + + size = 0; + for ( ; b2r != NULL; b2r = b2r->b2r_next) + size += b2r->b2r_finish - b2r->b2r_start + 1; + return size; +} + +/* map a position to a character code */ +static long +code_of(HBF_STRUCT *hbf, long pos) +{ + long code; + int residue; +reg B2_RANGE *b2r; + + code = pos / hbf->b2_size * 256; + residue = pos % hbf->b2_size; + for (b2r = hbf->byte_2_range; b2r != NULL; b2r = b2r->b2r_next) + if (b2r->b2r_start + residue <= b2r->b2r_finish) + return code + b2r->b2r_start + residue; + else + residue -= b2r->b2r_finish - b2r->b2r_start + 1; + /* should never get here */ + return 0L; +} + +/* + * String stuff + */ + +static bool +match(reg const char *lp, reg const char *sp) +{ + while (*lp == *sp && *sp != '\0') { + lp++; + sp++; + } + return (*lp == '\0' || isspace(*lp)) && *sp == '\0'; +} + +#ifdef NO_STRDUP +char * +strdup(const char *s) +{ + char *new_s; + + new_s = malloc((unsigned)strlen(s) + 1); + strcpy(new_s, s); + return new_s; +} +#endif + +/* + * Properties + */ + +static void +add_property(reg HBF_STRUCT *hbf, const char *lp) +{ +reg PROPERTY *prop; + char tmp[MAXLINE]; +reg char *tp; + + prop = NEW(PROPERTY); + + tp = tmp; + while (*lp != '\0' && ! isspace(*lp)) + *tp++ = *lp++; + *tp = '\0'; + prop->prop_name = strdup(tmp); + + while (*lp != '\0' && isspace(*lp)) + lp++; + + tp = tmp; + if (*lp == QUOTE) { + lp++; + while (*lp != '\0' && ! (*lp == QUOTE && *++lp != QUOTE)) + *tp++ = *lp++; + } + else + for (;;) { + while (*lp != '\0' && ! isspace(*lp)) + *tp++ = *lp++; + while (*lp != '\0' && isspace(*lp)) + lp++; + if (*lp == '\0') + break; + *tp++ = ' '; + } + *tp = '\0'; + prop->prop_value = strdup(tmp); + + prop->prop_next = hbf->property; + hbf->property = prop; +} + +const char * +hbfProperty(HBF *hbfFile, const char *propName) +{ +reg HBF_STRUCT *hbf; +reg PROPERTY *prop; + + hbf = (HBF_STRUCT *)hbfFile; + for (prop = hbf->property; prop != NULL; prop = prop->prop_next) + if (strcmp(prop->prop_name, propName) == 0) + return prop->prop_value; + return NULL; +} + +/* + * Compatability routines + */ + +const char * +HBF_GetProperty(HBF *handle, const char *propertyName) +{ + return hbfProperty(handle, propertyName); +} + +int +HBF_GetFontBoundingBox(HBF_Handle handle, + unsigned int *width, unsigned int *height, + int *xDisplacement, int *yDisplacement) +{ + if (width != NULL) + *width = hbfFontBBox(handle)->hbf_width; + if (height != NULL) + *height = hbfFontBBox(handle)->hbf_height; + if (xDisplacement != NULL) + *xDisplacement = hbfFontBBox(handle)->hbf_xDisplacement; + if (yDisplacement != NULL) + *yDisplacement = hbfFontBBox(handle)->hbf_yDisplacement; + return 0; +} + +int +HBF_GetBitmapBoundingBox(HBF_Handle handle, + unsigned int *width, unsigned int *height, + int *xDisplacement, int *yDisplacement) +{ + if (width != NULL) + *width = hbfBitmapBBox(handle)->hbf_width; + if (height != NULL) + *height = hbfBitmapBBox(handle)->hbf_height; + if (xDisplacement != NULL) + *xDisplacement = hbfBitmapBBox(handle)->hbf_xDisplacement; + if (yDisplacement != NULL) + *yDisplacement = hbfBitmapBBox(handle)->hbf_yDisplacement; + return 0; +} + +/* + * Prepend a directory to a relative filename. + */ +static char * +concat(const char *dir, /* not necessarily null-terminated */ + int dirlen, /* number of significant chars in dir */ + const char *stem) /* relative filename */ +{ + char *fullname; + + if (dirlen == 0) /* null: current directory */ + return strdup(stem); +#ifdef unix + fullname = malloc(dirlen + strlen(stem) + 2); + (void)sprintf(fullname, "%.*s/%s", dirlen, dir, stem); +#else +#ifdef msdos + fullname = malloc(dirlen + strlen(stem) + 2); + (void)sprintf(fullname, "%.*s\\%s", dirlen, dir, stem); +#else +#ifdef vms + if (dir[dirlen-1] == ']' && stem[0] == '[' && stem[1] == '-') { + dirlen--; + stem++; + fullname = malloc(dirlen + strlen(stem) + 2); + (void)sprintf(fullname, "%.*s.%s", dirlen, dir, stem); + } + else { + if (dir[dirlen-1] == ']' && stem[0] == '[' && stem[1] == '.') { + dirlen--; + stem++; + } + fullname = malloc(dirlen + strlen(stem) + 1); + (void)sprintf(fullname, "%.*s%s", dirlen, dir, stem); + } +#else + fullname = strdup(stem); +#endif /* vms */ +#endif /* msdos */ +#endif /* unix */ + return fullname; +} + +/* + * Bitmap files + * + * If the host operating system has a heirarchical file system and + * the bitmap file name is relative, it is relative to the directory + * containing the HBF file. + */ +static char * +expand_filename(const char *name, const char *hbf_name) +{ +#ifdef unix +reg char *s; +reg int size; + + size = name[0] != '/' && (s = strrchr(hbf_name, '/')) != NULL ? + s - hbf_name + 1 : 0; + s = malloc((unsigned)size + strlen(name) + 1); + (void)sprintf(s, "%.*s%s", size, hbf_name, name); + return s; +#else +#ifdef msdos +reg char *s; +reg int size; + +#ifdef __EMX__ + s = (unsigned char *)hbf_name + strlen((unsigned char *)hbf_name) - 1; + for(;;) { + if (*s == '\\' || *s == '/') + break; + if (s == hbf_name) { + s = NULL; + break; + } + s--; + } + + size = HasDrive(name) ? 0 : + (name[0] == '\\' || name[0] == '/') ? + (HasDrive(hbf_name) ? 2 : 0) : + s != NULL ? s - hbf_name + 1 : 0; +#else + size = HasDrive(name) ? 0 : + name[0] == '\\' ? (HasDrive(hbf_name) ? 2 : 0) : + (s = strrchr(hbf_name, '\\')) != NULL ? + s - hbf_name + 1 : 0; +#endif /* __EMX__ */ + s = malloc((unsigned)size + strlen(name) + 1); + (void)sprintf(s, "%.*s%s", size, hbf_name, name); + return s; +#else +#ifdef vms +reg char *s; +reg const char *copyto; +reg int size; + + if ((s = strchr(hbf_name, ']')) != NULL && RelativeFileName(name)) + return concat(hbf_name, (s - hbf_name) + 1, name); + + copyto = hbf_name; + if ((s = strstr(copyto, "::")) != NULL && strstr(name, "::") == NULL) + copyto = s+2; + if ((s = strchr(copyto, ':')) != NULL && strchr(name, ':') == NULL) + copyto = s+1; + size = copyto - hbf_name; + s = malloc((unsigned)size + strlen(name) + 1); + (void)sprintf(s, "%.*s%s", size, hbf_name, name); + return s; +#else + return strdup(name); +#endif /* vms */ +#endif /* msdos */ +#endif /* unix */ +} + +static BM_FILE * +find_file(HBF_STRUCT *hbf, const char *filename) +{ + BM_FILE **fp; +reg BM_FILE *file; + FILE *f; + char *bmfname; +#ifdef IN_MEMORY +#ifdef unix + bool from_pipe; +#endif +#endif + + for (fp = &(hbf->bm_file); *fp != NULL; fp = &((*fp)->bmf_next)) { + bmfname = strrchr((*fp)->bmf_name, '/'); + bmfname = (bmfname) ? bmfname + 1 : (*fp)->bmf_name; + if (strcmp(bmfname, filename) == 0) + return *fp; + } + + file = NEW(BM_FILE); + if (file == NULL) { + eprintf("out of memory"); + return NULL; + } + file->bmf_name = expand_filename(filename, hbf->filename); + if (file->bmf_name == NULL) { + free((char *)file); + return NULL; + } + f = fopen(file->bmf_name, READ_BINARY); +#ifdef IN_MEMORY +#ifdef unix + from_pipe = FALSE; + if (f == NULL) { + char tmp[400]; + + sprintf(tmp, "%s.gz", file->bmf_name); + if ((f = fopen(tmp, "r")) != NULL) { + fclose(f); + sprintf(tmp, "gzcat %s.gz", file->bmf_name); + if ((f = popen(tmp, "r")) != NULL) + from_pipe = TRUE; + } + } +#endif /* unix */ +#endif /* IN_MEMORY */ + if (f == NULL) { + eprintf("can't open bitmap file '%s'", file->bmf_name); + free(file->bmf_name); + free((char *)file); + return NULL; + } +#ifdef IN_MEMORY + if (! read_bitmap_file(file, f)) { + free(file->bmf_name); + free((char *)file); + return NULL; + } +#ifdef unix + if (from_pipe) + pclose(f); + else + fclose(f); +#else /* ! unix */ + fclose(f); +#endif /* ! unix */ +#else /* ! IN_MEMORY */ + file->bmf_file = f; + fseek(f, 0L, 2); + file->bmf_size = ftell(f); +#endif /* ! IN_MEMORY */ + file->bmf_next = NULL; + *fp = file; + return file; +} + +#ifdef IN_MEMORY +#define GRAIN_SIZE 512 + +static bool +read_bitmap_file(BM_FILE *bmf, FILE *f) +{ + byte *contents, *cp; + long size; + int c; + + size = 0; + cp = contents = (byte *)malloc((unsigned)GRAIN_SIZE); + if (contents == NULL) { + eprintf("not enough space for bitmap file"); + return NULL; + } + while ((c = getc(f)) != EOF) { + if (size%GRAIN_SIZE == 0) { + contents = (byte *)realloc((char *)contents, + (unsigned)(size + GRAIN_SIZE)); + if (contents == NULL) { + eprintf("not enough space for bitmap file"); + return NULL; + } + cp = contents + size; + } + *cp++ = c; + size++; + } + bmf->bmf_size = size; + bmf->bmf_contents = (byte *)realloc((char *)contents, (unsigned)size); + return TRUE; +} +#endif /* IN_MEMORY */ + +/* + * Code ranges + */ + +/* check that a code range fits within its bitmap file */ +static bool +too_short(HBF_STRUCT *hbf, CODE_RANGE *cp) +{ + int bm_size; + long offset, end_offset; + BM_FILE *bmf; + long start, finish; + + bm_size = FileBitmapSize(&(hbf->public), cp); + offset = cp->code_offset; + start = cp->code_start; + finish = cp->code_finish; + end_offset = offset + bm_size * + (hbf->b2_size*(long)FirstByte(finish) + + b2_pos(hbf, finish) - cp->code_pos + 1); + bmf = cp->code_bm_file; + if (end_offset <= bmf->bmf_size) + return FALSE; + /* bitmap file is too short: produce a specific error message */ + if (offset > bmf->bmf_size) + eprintf("bitmap file '%s' is shorter than offset 0x%04lx", + bmf->bmf_name, offset); + else if (offset + bm_size > bmf->bmf_size) + eprintf("bitmap file '%s' too short: no room for any bitmaps at offset 0x%04lx", + bmf->bmf_name, offset); + else + eprintf("bitmap file '%s' is too short - code range appears to be 0x%04lx-0x%04lx", + bmf->bmf_name, + start, + code_of(hbf, cp->code_pos + + (bmf->bmf_size - offset)/bm_size) - 1); + return TRUE; +} + +static const char * +skip_word(int n, const char *s) +{ + for ( ; n > 0; n--) { + while (*s != '\0' && ! isspace(*s)) + s++; + while (*s != '\0' && isspace(*s)) + s++; + } + return s; +} + +/* optional keywords at the end of a CODE_RANGE line */ +static void +parse_keywords(CODE_RANGE *cp, const char *s) +{ + for (s = skip_word(4, s) ; *s != '\0'; s = skip_word(1, s)) { + switch (*s) { + case 's': case 'S': case 't': case 'T': + /* keyword "sideways" or "transposed" */ + cp->code_transposed = TRUE; + break; + case 'i': case 'I': + /* keyword "inverted" */ + cp->code_inverted = TRUE; + } + } +} + +static bool +add_code_range(HBF_STRUCT *hbf, const char *line) +{ + CODE_RANGE *cp; + CODE_RANGE **cpp; + long start, finish; + long offset; + char filename[MAXLINE]; + BM_FILE *bmf; + CHAR_INDEX b2pos; + + if (sscanf(line, "HBF_CODE_RANGE %li-%li %s %li", + &start, &finish, filename, &offset) != 4) { + eprintf("syntax error in HBF_CODE_RANGE"); + return FALSE; + } + /* code ranges are checked in real_open() */ + if ((bmf = find_file(hbf, filename)) == NULL) + return FALSE; + if ((cp = NEW(CODE_RANGE)) == NULL) { + eprintf("out of memory"); + return FALSE; + } + + cp->code_start = (CHAR)start; + cp->code_finish = (CHAR)finish; + cp->code_bm_file = bmf; + cp->code_offset = offset; + cp->code_transposed = cp->code_inverted = FALSE; + parse_keywords(cp, line); + /* insert it in order */ + for (cpp = &hbf->code_range; + *cpp != NULL && (*cpp)->code_finish < start; + cpp = &((*cpp)->code_next)) + ; + if (*cpp != NULL && (*cpp)->code_start <= finish) { + eprintf("code ranges overlap"); + return FALSE; + } + cp->code_next = *cpp; + *cpp = cp; + + /* set code_pos, and check range */ + if (start > finish) { + eprintf("illegal code range 0x%04lx-0x%04lx", start, finish); + return FALSE; + } + if ((b2pos = b2_pos(hbf, start)) == BAD_CHAR_INDEX) { + eprintf("illegal start code 0x%04lx", start); + return FALSE; + } + cp->code_pos = hbf->b2_size*(long)FirstByte(start) + b2pos; + if ((b2pos = b2_pos(hbf, finish)) == BAD_CHAR_INDEX) { + eprintf("illegal finish code 0x%04lx", finish); + return FALSE; + } + /* check that the bitmap file has enough bitmaps */ + return ! too_short(hbf, cp); +} + +/* + * Reading and parsing of an HBF file + */ + +/* get line, truncating to len, and trimming trailing spaces */ +static bool +get_line(char *buf, int len, FILE *f) +{ + int c; + char *bp; + + bp = buf; + for (;;) { + if ((c = getc(f)) == EOF) { + eprintf("unexpected end of file"); + return FALSE; + } + if (c == '\n' || c == '\r') { + /* trim trailing space */ + while (bp > buf && isspace(*(bp-1))) + bp--; + *bp = '\0'; + return TRUE; + } + if (len > 0) { + *bp++ = c; + len--; + } + } +} + +/* get next non-COMMENT line */ +static bool +get_text_line(char *buf, int len, FILE *f) +{ + while (get_line(buf, len, f)) + if (*buf != '\0' && ! match(buf, "COMMENT")) + return TRUE; + return FALSE; +} + +static bool +get_property(const char *line, const char *keyword, HBF_STRUCT *hbf) +{ + if (! match(line, keyword)) { + eprintf("%s expected", keyword); + return FALSE; + } + add_property(hbf, line); + return TRUE; +} + +static bool +get_bbox(const char *line, const char *keyword, HBF_BBOX *bbox) +{ + int w, h, xd, yd; + + if (! match(line, keyword) || + sscanf(line + strlen(keyword), "%i %i %i %i", + &w, &h, &xd, &yd) != 4) { + eprintf("%s expected", keyword); + return FALSE; + } + if (w <= 0 || h <= 0) { + eprintf("illegal %s dimensions %dx%d", keyword, w, h); + return FALSE; + } + bbox->hbf_width = w; + bbox->hbf_height = h; + bbox->hbf_xDisplacement = xd; + bbox->hbf_yDisplacement = yd; + return TRUE; +} + +/* + * HBFHeaderFile ::= + * 'HBF_START_FONT' version EOLN + * 'HBF_CODE_SCHEME' word ... EOLN + * 'FONT' fontName EOLN + * 'SIZE' ptsize xres yres EOLN + * 'HBF_BITMAP_BOUNDING_BOX' w h xd yd EOLN + * 'FONTBOUNDINGBOX' w h xd yd EOLN + * X11R5FontPropertySection + * 'CHARS' n EOLN + * HBFByte2RangeSection + * HBFCodeRangeSection + * 'HBF_END_FONT' EOLN . + * + * This implementation allows extra lines before HBF_END_FONT. + * Anything after HBF_END_FONT is ignored. + */ + +static bool +parse_file(FILE *f, reg HBF_STRUCT *hbf) +{ + char line[MAXLINE]; + int start, finish; + + if (! get_text_line(line, MAXLINE, f) || + ! get_property(line, "HBF_START_FONT", hbf)) + return FALSE; + + if (! get_text_line(line, MAXLINE, f) || + ! get_property(line, "HBF_CODE_SCHEME", hbf)) + return FALSE; + + if (! get_text_line(line, MAXLINE, f) || + ! get_property(line, "FONT", hbf)) + return FALSE; + + if (! get_text_line(line, MAXLINE, f) || + ! get_property(line, "SIZE", hbf)) + return FALSE; + + if (! get_text_line(line, MAXLINE, f) || + ! get_bbox(line, "HBF_BITMAP_BOUNDING_BOX", + &(hbf->public.hbf_bitmap_bbox))) + return FALSE; + + if (! get_text_line(line, MAXLINE, f) || + ! get_bbox(line, "FONTBOUNDINGBOX", &(hbf->public.hbf_font_bbox))) + return FALSE; + + if (! get_text_line(line, MAXLINE, f)) + return FALSE; + if (match(line, "STARTPROPERTIES")) { + for (;;) { + if (! get_text_line(line, MAXLINE, f)) + return FALSE; + if (match(line, "ENDPROPERTIES")) + break; + add_property(hbf, line); + } + if (! get_text_line(line, MAXLINE, f)) + return FALSE; + } + + if (match(line, "CHARS")) + if (! get_text_line(line, MAXLINE, f)) + return FALSE; + + if (match(line, "HBF_START_BYTE_2_RANGES")) { + for (;;) { + if (! get_text_line(line, MAXLINE, f)) + return FALSE; + if (match(line, "HBF_END_BYTE_2_RANGES")) + break; + if (sscanf(line, "HBF_BYTE_2_RANGE %i-%i", + &start, &finish) != 2) { + eprintf("HBF_BYTE_2_RANGE expected"); + return FALSE; + } + add_b2r(&(hbf->byte_2_range), start, finish); + } + if (! get_text_line(line, MAXLINE, f)) + return FALSE; + } + else + add_b2r(&(hbf->byte_2_range), 0, 0xff); + hbf->b2_size = b2_size(hbf->byte_2_range); + + if (! match(line, "HBF_START_CODE_RANGES")) { + eprintf("HBF_START_CODE_RANGES expected"); + return FALSE; + } + for (;;) { + if (! get_text_line(line, MAXLINE, f)) + return FALSE; + if (match(line, "HBF_END_CODE_RANGES")) + break; + if (! add_code_range(hbf, line)) + return FALSE; + } + + for (;;) { + if (! get_text_line(line, MAXLINE, f)) + return FALSE; + if (match(line, "HBF_END_FONT")) + break; + /* treat extra lines as properties (for private extensions) */ + add_property(hbf, line); + } + + return TRUE; +} + +static FILE * +path_open(const char *path, const char *filename, char **fullp) +{ + if (LocalFileName(filename) && path != NULL) { +#ifdef PATH_DELIMITER + int len; + char *fullname; + FILE *f; + const char *p_next; + + len = strlen(filename); + for (;;) { + p_next = strchr(path, PATH_DELIMITER); + if (p_next == NULL) + p_next = path + strlen(path); + fullname = concat(path, p_next - path, filename); + if ((f = fopen(fullname, "r")) != NULL) { + *fullp = fullname; + return f; + } + free(fullname); + if (*p_next == '\0') + break; + path = p_next + 1; + } +#endif + return NULL; + } + else { + *fullp = strdup(filename); + return fopen(*fullp, "r"); + } +} + +static bool +real_open(const char *filename, reg HBF_STRUCT *hbf) +{ + FILE *f; + + f = path_open(getenv("HBFPATH"), filename, &(hbf->filename)); + if (f == NULL) { + eprintf("can't read file '%s'", filename); + return FALSE; + } + if (! parse_file(f, hbf)) { + fclose(f); + return FALSE; + } + fclose(f); + return TRUE; +} + +HBF * +hbfOpen(const char *filename) +{ +reg HBF_STRUCT *hbf; + + if ((hbf = NEW(HBF_STRUCT)) == NULL) { + eprintf("can't allocate HBF structure"); + return NULL; + } + clear_record(hbf); + if (real_open(filename, hbf)) + return &(hbf->public); + hbfClose(&(hbf->public)); + return NULL; +} + +int +HBF_OpenFont(const char *filename, HBF **ptrHandleStorage) +{ + return (*ptrHandleStorage = hbfOpen(filename)) == NULL ? -1 : 0; +} + +/* + * Close files, free everything associated with the HBF. + */ + +int +HBF_CloseFont(HBF *hbfFile) +{ +reg HBF_STRUCT *hbf; + PROPERTY *prop_ptr, *prop_next; + B2_RANGE *b2r_ptr, *b2r_next; + CODE_RANGE *code_ptr, *code_next; + BM_FILE *bmf_ptr, *bmf_next; + int status; + + status = 0; + hbf = (HBF_STRUCT *)hbfFile; + + if (hbf->filename != NULL) + free(hbf->filename); + if (hbf->bitmap_buffer != NULL) + free(hbf->bitmap_buffer); + + for (prop_ptr = hbf->property; + prop_ptr != NULL; + prop_ptr = prop_next) { + prop_next = prop_ptr->prop_next; + free(prop_ptr->prop_name); + free(prop_ptr->prop_value); + free((char *)prop_ptr); + } + + for (b2r_ptr = hbf->byte_2_range; + b2r_ptr != NULL; + b2r_ptr = b2r_next) { + b2r_next = b2r_ptr->b2r_next; + free((char *)b2r_ptr); + } + + for (code_ptr = hbf->code_range; + code_ptr != NULL; + code_ptr = code_next) { + code_next = code_ptr->code_next; + free((char *)code_ptr); + } + + for (bmf_ptr = hbf->bm_file; + bmf_ptr != NULL; + bmf_ptr = bmf_next) { + bmf_next = bmf_ptr->bmf_next; +#ifdef IN_MEMORY + free((char *)(bmf_ptr->bmf_contents)); +#else + if (bmf_ptr->bmf_file != NULL && + fclose(bmf_ptr->bmf_file) < 0) + status = -1; +#endif + free(bmf_ptr->bmf_name); + free((char *)bmf_ptr); + } + + free((char *)hbf); + + return status; +} + +void +hbfClose(HBF *hbfFile) +{ + (void)HBF_CloseFont(hbfFile); +} + +/* + * Fetch a bitmap + */ + +const byte * +hbfGetBitmap(HBF *hbf, HBF_CHAR code) +{ + return get_bitmap((HBF_STRUCT *)hbf, code, (byte *)NULL); +} + +int +HBF_GetBitmap(HBF *hbf, HBF_CHAR code, byte *buffer) +{ + return get_bitmap((HBF_STRUCT *)hbf, code, buffer) == NULL ? -1 : 0; +} + +/* + * Internal function to fetch a bitmap. + * If buffer is non-null, it must be used. + */ +static const byte * +get_bitmap(reg HBF_STRUCT *hbf, HBF_CHAR code, byte *buffer) +{ + CHAR_INDEX pos, b2pos; +reg CODE_RANGE *cp; + BM_FILE *bmf; + int bm_size; + long offset; + + if ((b2pos = b2_pos(hbf, code)) == BAD_CHAR_INDEX) + return NULL; + pos = hbf->b2_size*FirstByte(code) + b2pos; + for (cp = hbf->code_range; cp != NULL; cp = cp->code_next) + if (cp->code_start <= code && code <= cp->code_finish) { + bmf = cp->code_bm_file; + bm_size = FileBitmapSize(&(hbf->public), cp); + offset = cp->code_offset + + (long)(pos - cp->code_pos) * bm_size; +#ifdef IN_MEMORY + if (buffer == NULL && + ! cp->code_transposed && ! cp->code_inverted) + return bmf->bmf_contents + offset; +#endif /* IN_MEMORY */ + if (buffer == NULL && + ((buffer = local_buffer(hbf)) == NULL)) + return NULL; +#ifdef IN_MEMORY + if (cp->code_transposed) + copy_transposed(&(hbf->public), + buffer, + bmf->bmf_contents + offset); + else + memcpy((char *)buffer, + (char *)(bmf->bmf_contents + offset), + bm_size); +#else /* ! IN_MEMORY */ + if (fseek(bmf->bmf_file, offset, 0) != 0) { + eprintf("seek error on code 0x%04x", code); + return NULL; + } + if (cp->code_transposed ? + ! get_transposed(&(hbf->public), bmf->bmf_file, + buffer) : + fread((char *)buffer, + bm_size, 1, bmf->bmf_file) != 1) { + eprintf("read error on code 0x%04x", code); + return NULL; + } +#endif /* IN_MEMORY */ + if (cp->code_inverted) + invert(buffer, HBF_BitmapSize(&(hbf->public))); + return buffer; + } + eprintf("code 0x%04x out of range", code); + return NULL; +} + +static byte * +local_buffer(HBF_STRUCT *hbf) +{ + if (hbf->bitmap_buffer == NULL && + (hbf->bitmap_buffer = (byte *)malloc(HBF_BitmapSize(&(hbf->public)))) == NULL) { + eprintf("out of memory"); + return NULL; + } + return hbf->bitmap_buffer; +} + +static void +invert(byte *buffer, unsigned int length) +{ + for ( ; length > 0; length--) + *buffer++ ^= 0xff; +} + +#ifdef IN_MEMORY +static bool +copy_transposed(HBF *hbf, reg byte *bitmap, reg const byte *source) +{ +reg byte *pos; +reg byte *bm_end; + int x; + int width; +reg int row_size; +reg int c; +reg int imask, omask; + + width = hbfBitmapBBox(hbf)->hbf_width; + row_size = HBF_RowSize(hbf); + bm_end = bitmap + HBF_BitmapSize(hbf); + (void)memset((char *)bitmap, '\0', HBF_BitmapSize(hbf)); + for (x = 0; x < width; x++) { + pos = bitmap + x/8; + omask = Bit(x%8); + /* y = 0 */ + for (;;) { + c = *source++; + for (imask = Bit(0); imask != 0; imask >>= 1) { + /* + * At this point, + * + * imask == Bit(y%8) + * pos == bitmap + y*row_size + x/8 + * + * We examine bit y of row x of the input, + * setting bit x of row y of the output if + * required, by applying omask to *pos. + */ + if ((c & imask) != 0) + *pos |= omask; + /* if (++y > height) goto end_column */ + pos += row_size; + if (pos >= bm_end) + goto end_column; + } + } +end_column: + ; + } + return TRUE; +} +#else /* ! IN_MEMORY */ +static bool +get_transposed(HBF *hbf, FILE *f, reg byte *bitmap) +{ +reg byte *pos; +reg byte *bm_end; + int x; + int width; +reg int row_size; +reg int c; +reg int imask, omask; + + width = hbfBitmapBBox(hbf)->hbf_width; + row_size = HBF_RowSize(hbf); + bm_end = bitmap + HBF_BitmapSize(hbf); + (void)memset((char *)bitmap, '\0', HBF_BitmapSize(hbf)); + for (x = 0; x < width; x++) { + pos = bitmap + x/8; + omask = Bit(x%8); + /* y = 0 */ + for (;;) { + if ((c = getc(f)) == EOF) + return FALSE; + for (imask = Bit(0); imask != 0; imask >>= 1) { + /* + * At this point, + * + * imask == Bit(y%8) + * pos == bitmap + y*row_size + x/8 + * + * We examine bit y of row x of the input, + * setting bit x of row y of the output if + * required, by applying omask to *pos. + */ + if ((c & imask) != 0) + *pos |= omask; + /* if (++y > height) goto end_column */ + pos += row_size; + if (pos >= bm_end) + goto end_column; + } + } +end_column: + ; + } + return TRUE; +} +#endif /* ! IN_MEMORY */ + +/* + * Call function on each valid code in ascending order. + */ +void +hbfForEach(reg HBF *hbfFile, void (*func)(HBF *, HBF_CHAR)) +{ + HBF_STRUCT *hbf; + CODE_RANGE *cp; +reg B2_RANGE *b2r; +reg unsigned byte1, byte2; +reg unsigned finish; + + hbf = (HBF_STRUCT *)hbfFile; + for (cp = hbf->code_range; cp != NULL; cp = cp->code_next) { + byte1 = FirstByte(cp->code_start); + byte2 = SecondByte(cp->code_start); + while (MakeCode(byte1, byte2) <= cp->code_finish) { + for (b2r = hbf->byte_2_range; + b2r != NULL; + b2r = b2r->b2r_next) { + if (byte2 < b2r->b2r_start) + byte2 = b2r->b2r_start; + finish = b2r->b2r_finish; + if (byte1 == FirstByte(cp->code_finish) && + finish > SecondByte(cp->code_finish)) + finish = SecondByte(cp->code_finish); + while (byte2 <= finish) { + (*func)(hbfFile, + MakeCode(byte1, byte2)); + byte2++; + } + } + byte1++; + byte2 = 0; + } + } +} + +const char * +hbfFileName(HBF *hbf) +{ + return ((HBF_STRUCT *)hbf)->filename; +} + +long +hbfChars(HBF *hbfFile) +{ + HBF_STRUCT *hbf; + CODE_RANGE *cp; + long num_chars; + + hbf = (HBF_STRUCT *)hbfFile; + num_chars = 0; + for (cp = hbf->code_range; cp != NULL; cp = cp->code_next) + num_chars += + hbf->b2_size*FirstByte(cp->code_finish) + + b2_pos(hbf, cp->code_finish) - + (hbf->b2_size*FirstByte(cp->code_start) + + b2_pos(hbf, cp->code_start)) + 1; + return num_chars; +} + +/* + * Functions also implemented as macros + */ + +#ifdef hbfBitmapBBox +#undef hbfBitmapBBox +#endif + +HBF_BBOX * +hbfBitmapBBox(HBF *hbf) +{ + return &(hbf->hbf_bitmap_bbox); +} + +#ifdef hbfFontBBox +#undef hbfFontBBox +#endif + +HBF_BBOX * +hbfFontBBox(HBF *hbf) +{ + return &(hbf->hbf_font_bbox); +} + +const void * +hbfGetByte2Range(HBF *hbfFile, const void *b2r_pointer, + byte *startp, byte *finishp) +{ + HBF_STRUCT *hbf; + const B2_RANGE *b2r; + + hbf = (HBF_STRUCT *)hbfFile; + if (b2r_pointer == NULL) + b2r = hbf->byte_2_range; + else + b2r = ((const B2_RANGE *)b2r_pointer)->b2r_next; + if(b2r == NULL) + return NULL; + *startp = b2r->b2r_start; + *finishp = b2r->b2r_finish; + return (const void *)b2r; +} + +const void * +hbfGetCodeRange(HBF *hbfFile, const void *code_pointer, + HBF_CHAR *startp, HBF_CHAR *finishp) +{ + HBF_STRUCT *hbf; + const CODE_RANGE *cp; + + hbf = (HBF_STRUCT *)hbfFile; + if (code_pointer == NULL) + cp = hbf->code_range; + else + cp = ((const CODE_RANGE *)code_pointer)->code_next; + if(cp == NULL) + return NULL; + *startp = cp->code_start; + *finishp = cp->code_finish; + return (const void *)cp; +} diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/hbf.h b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/hbf.h new file mode 100644 index 00000000000..34f5940a71b --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/hbf.h @@ -0,0 +1,215 @@ +/* + * Copyright 1993,1994,1995,2005 by Ross Paterson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * + * Two interfaces to HBF files -- take your pick. + * + * Ross Paterson <ross@soi.city.ac.uk> + * + * Ross no longer maintains this code. Please send bug reports to + * Werner Lemberg <wl@gnu.org>. + * + */ +#ifndef _HBF_ +#define _HBF_ + +#ifndef __STDC__ +# ifndef const +# define const +# endif +#endif + +/* + * #1: a lightweight C interface. + */ + +typedef unsigned int HBF_CHAR; + +typedef struct { + unsigned short hbf_width; + unsigned short hbf_height; + short hbf_xDisplacement; + short hbf_yDisplacement; +} HBF_BBOX; + +typedef struct { + /* fields corresponding to the definition */ + HBF_BBOX hbf_bitmap_bbox; /* HBF_BITMAP_BOUNDING_BOX */ + HBF_BBOX hbf_font_bbox; /* FONTBOUNDINGBOX */ +} HBF; + +extern HBF *hbfOpen( +#ifdef __STDC__ + const char *filename +#endif + ); + +extern void hbfClose( +#ifdef __STDC__ + HBF *hbf +#endif + ); + +extern const char *hbfProperty( +#ifdef __STDC__ + HBF *hbf, + const char *propName +#endif + ); + +extern const unsigned char *hbfGetBitmap( +#ifdef __STDC__ + HBF *hbf, + HBF_CHAR code +#endif + ); + +extern void hbfForEach( +#ifdef __STDC__ + HBF *hbf, + void (*func)(HBF *sameHbf, HBF_CHAR code) +#endif + ); + +extern const char *hbfFileName( +#ifdef __STDC__ + HBF *hbf +#endif + ); + +extern long hbfChars( +#ifdef __STDC__ + HBF *hbf +#endif + ); + +extern HBF_BBOX *hbfBitmapBBox( +#ifdef __STDC__ + HBF *hbf +#endif + ); +/* but defined here as a macro */ +#define hbfBitmapBBox(hbf) (&((hbf)->hbf_bitmap_bbox)) + +extern HBF_BBOX *hbfFontBBox( +#ifdef __STDC__ + HBF *hbf +#endif + ); +/* but defined here as a macro */ +#define hbfFontBBox(hbf) (&((hbf)->hbf_font_bbox)) + +#define HBF_RowSize(hbf)\ + ((hbfBitmapBBox(hbf)->hbf_width + 7)/8) + +#define HBF_BitmapSize(hbf)\ + (HBF_RowSize(hbf) * hbfBitmapBBox(hbf)->hbf_height) + +#define HBF_GetBit(hbf,bitmap,x,y)\ + (((bitmap)[(y)*HBF_RowSize(hbf) + (x)/8]>>(7 - (x)%8))&01) + +extern int hbfDebug; /* set non-zero for error reporting */ + +extern const void *hbfGetCodeRange( +#ifdef __STDC__ + HBF *hbfFile, + const void *code_pointer, + HBF_CHAR *startp, + HBF_CHAR *finishp +#endif + ); + +extern const void *hbfGetByte2Range( +#ifdef __STDC__ + HBF *hbfFile, + const void *b2r_pointer, + unsigned char *startp, + unsigned char *finishp +#endif + ); + +/* + * #2: taken from Appendix 2 of the HBF draft. + */ + +typedef unsigned int HBF_HzCode; +typedef unsigned char HBF_Byte ; +typedef HBF_Byte * HBF_BytePtr ; +typedef HBF * HBF_Handle ; +typedef HBF_Handle * HBF_HandlePtr ; +typedef char * String ; + +extern int HBF_OpenFont( +#ifdef __STDC__ + const char * filename, + HBF_HandlePtr ptrHandleStorage +#endif +); + +extern int HBF_CloseFont( +#ifdef __STDC__ + HBF_Handle handle +#endif +); + +extern const char * HBF_GetProperty( +#ifdef __STDC__ + HBF_Handle handle, + const char * propertyName +#endif +); + +extern int HBF_GetFontBoundingBox( +#ifdef __STDC__ + HBF_Handle handle, + unsigned int *width, + unsigned int *height, + int *xDisplacement, + int *yDisplacement +#endif +); + +extern int HBF_GetBitmapBoundingBox( +#ifdef __STDC__ + HBF_Handle handle, + unsigned int *width, + unsigned int *height, + int *xDisplacement, + int *yDisplacement +#endif +); + +extern int HBF_GetBitmap( +#ifdef __STDC__ + HBF_Handle handle, + HBF_HzCode hanziCode, + HBF_BytePtr ptrBitmapBuffer +#endif +); + +#endif /* ! _HBF_ */ diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/hbf2gf.1 b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/hbf2gf.1 new file mode 100644 index 00000000000..0ccb6648f56 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/hbf2gf.1 @@ -0,0 +1,754 @@ +.\" man page for hbf2gf +.\" +.\" Copyright (C) 1994-2008 Werner Lemberg <wl@gnu.org> +.\" +.\" 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 in doc/COPYING; if not, write to the Free +.\" Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +.\" MA 02110-1301 USA +.\" +. +.TH HBF2GF 1 29-Dec-2008 "CJK Version 4.8.2" +.SH NAME +hbf2gf \- convert a CJK bitmap font into subfonts usable by TeX and Omega. +. +. +.SH SYNOPSIS +.na +.nh +.B hbf2gf +.RB [ \-q ] +.IR \%configuration-file [ .cfg ] +.br +.B hbf2gf +'in +\n(.ku +.RB [ \-q ] +.RB [ \-p ] +.RB [ \-g ] +.RB [ \-n ] +.I \%subfont-name \%x-resolution +.RI [ \%y-scale \ | \ \%y-resolution ] +.br +.in +.B hbf2gf +.B \-t +.RB [ \-q ] +.I \%subfont-name +.br +.B "hbf2gf \-\-version" +| +.B \-\-help +.ad +.hy +. +. +. +.\" ==== +.\" ==== macro definitions +.\" ==== +. +.\" here we define \TeX for troff and nroff +.if t .ds TX \fRT\h'-0.1667m'\v'0.20v'E\v'-0.20v'\h'-0.125m'X\fP +.if n .ds TX TeX +. +.\" and here the same for \LaTeX +.if t \{\ +.ie '\*(.T'dvi' \ +.ds LX \fRL\h'-0.36m'\v'-0.15v'\s-3A\s0\h'-0.15m'\v'0.15v'\fP\*(TX +.el .ds LX \fRL\h'-0.36m'\v'-0.22v'\s-2A\s0\h'-0.15m'\v'0.22v'\fP\*(TX +.\} +.if n .ds LX LaTeX +. +.\" \LaTeXe +.\" note that we need \vareps for TeX instead of \eps which can only be +.\" accessed with the \N escape sequence (in the Math Italic font) +.if t \{\ +.ie '\*(.T'dvi' .ds LE \*(LX\h'0.15m'2\v'0.20v'\f(MI\N'34'\fP\v'-0.20v' +.el .ds LE \*(LX\h'0.15m'2\v'0.20v'\(*e\v'-0.20v' +.\} +.if n .ds LE LaTeX\ 2e +. +.\" a definition for \Delta +.if t .ds DE \(*D +.if n .ds DE Delta_ +. +.\" a typewriter font +.if t \{\ +.de C +\fC\\$1\fP\\$2 +.. +.\} +.if n \{\ +.de C +\\$1\\$2 +.. +.\} +. +.\" an addition to .TP to allow two labels for the same item +.de TQ +.br +.ns +.TP +.. +. +.\" ==== +.\" ==== end of macro definitions +.\" ==== +. +. +. +.SH DESCRIPTION +CJK bitmap fonts can't be directly used with \*(TX +because the number of characters in such fonts exceeds\ 256, the limit of a +\*(TX +font. +Thus it is necessary to split these fonts into subfonts, and this is +exactly what +.B hbf2gf +does. +.PP +As the name says, +.B hbf2gf +uses CJK fonts in a certain format which is called +.B Hanzi Bitmap Font +.RB ( HBF ) +format. +It simply consists of the CJK bitmap file(s) and a text file in a format +very similar to the BDF format of the X\ Window System which describes the +bitmap font files: the encoding, the size, etc. +The produced +.C GF +files can then be converted with +.B gftopk +into standard +.C PK +files. +.PP +.B hbf2gf +can be called in three modes: +. +.PP +.in +2m +.B hbf2gf +.RB [ \-q ] +.IR configuration-file [ .cfg ] +.PP +.in +5m +This call normally creates a set of +.C GF +files, one +.C PL +file, and a batch file which must be executed after +.B hbf2gf +has finished. +This script will then call +.B gftopk +to convert all +.C GF +files into +.C PK +files, and it will call +.B pltotf +to convert the +.C PL +file into a +.C TFM +file. +Finally it will copy the +.C TFM +file so that each +.C PK +file has its +.C TFM +file (which are all identical). +.PP +.in +5m +If +.B ofm_file +is set to \(oqyes\(cq in the configuration file, +.C OFM +and +.C OVF +files will be created too. +. +.PP +.in +5m +.B \-q +makes +.B hbf2gf +quiet. +.PP +.in +2m +.na +.nh +.B hbf2gf +'in +\n(.ku +.RB [ \-q ] +.RB [ \-p ] +.RB [ \-g ] +.RB [ \-n ] +.I \%subfont-name \%x-resolution +.RI [ \%y-scale \ | \ \%y-resolution ] +.ad +.hy +.PP +.in +5m +This mode is intended for use with +.B \%mktexpk +and its derivates. +Only one +.C GF +file together with a +.C PL +file for the given subfont will be computed, taking the horizontal +resolution and a vertical scaling factor (if the value is smaller than\ 10) +resp. the vertical resolution (otherwise) from the command line, ignoring +the +.B nmb_fonts +parameter of the configuration file. +The last two characters (which are interpreted as the subfont number) are +stripped to get the name for the configuration file (which must end with +\(oq\c +.C \&.cfg \(cq). +No job file will be created. +If option +.B \-p +is set, no +.C PL +file is created. +If +.B \-g +is set, no +.C GF +file is created. +The extension can be controlled with +.BR \-n ; +if set, the extension is \(oq\c +.C \&.gf \(cq, +otherwise \(oq\c +.C \&. <\c +.IR resolution >\c +.C gf \(cq. +.B \-q +makes +.B hbf2gf +quiet. +. +.PP +.in +2m +.na +.nh +.B hbf2gf +'in +\n(.ku +.B \-t +.RB [ \-q ] +.I \%subfont-name +.ad +.hy +.PP +.in +5m +This mode is intended for use with scripts like +.BR \%mktexpk ; +it tests whether the specified subfont name leads to an +.B hbf2gf +configuration file. +It returns 0 on success and prints out the name of that configuration file +(provided the +.B \-q +switch isn't set). +This test isn't a thorough one; it only removes the last two characters +and checks whether a configuration file with that name exists. +.PP +See the next section for more details about configuration files. +.PP +Specifying the option +.B \-\-version +returns the current version of +.B hbf2gf +and the used file search library (e.g.\ \c +.BR kpathsea ). +Usage information is shown with the +.B \-\-help +parameter. +. +. +.SH "CONFIGURATION FILE" +Here a sample configuration file (\c +.C gsfs14.cfg ) +for a 56\(mu56 Chinese font in GB encoding; note that all information +about the font is in the +.C jfs56.hbf +file. +See the +.B "FILE SEARCHING" +section how HBF fonts and +.B hbf2gf +configuration files are found. +See the +.B AVAILABILITY +section where to get CJK fonts together with its +.C HBF +files: +.PP +.if t \fC +.nf + hbf_header jfs56.hbf + mag_x 1 + threshold 128 + comment jianti fansongti 56x56 pixel font + + design_size 14.4 + + y_offset \-13 + + nmb_files \-1 + + output_name gsfs14 + + checksum 123456789 + + dpi_x 300 + + pk_files no + tfm_files yes + + coding codingscheme GuoBiao encoded TeX text + + pk_directory $HBF_TARGET/pk/modeless/gb2312/gsfs14/ + tfm_directory $HBF_TARGET/tfm/gb2312/gsfs14/ +.fi +.if t \fP +.PP +A configuration file is a plain text file consisting of keywords and its +arguments. +A keyword must start a line, otherwise the whole line will be ignored. +If the word starting a line is not a keyword, the line will be ignored too. +Empty lines will also be skipped. +The search for keywords is case insensitive; in contrast, the arguments will +be taken exactly as given (except \(oqyes\(cq and \(oqno\(cq which can be written with +uppercase or lowercase letters). +Each keyword has one argument which must be separated by whitespace (blanks +or tabs) from the keyword and must be on the same line. +Each line must not be longer than 256 characters. +.PP +You can use environment variables in the configuration file. +The escape character starting an environment variable in the configuration +file is always \(oq\c +.C $ \(cq, +even for operating systems like DOS which has other conventions. +.B hbf2gf +recognizes only environment variable names which start with a letter or an +underscore, followed by alphanumeric characters or underscores. +You can surround the variable with braces to indicate where the variable +name ends, for example +.C ${FOO} . +To get a dollar sign you must write \(oq\c +.C $$ \(cq. +The expansion of environment variables in hbf2gf itself (without the help of +either kpathsea, emtexdir, or MiKTeX searching routines) is very limited; +this feature has been carried over from previous versions. +It can't expand variables set in texmf.cnf; it also can't handle more than +one directory as the variable's value. +.B Don't use it except for the \(oqpk_directory\(cq and \(oqtfm_directory\(cq +.B parameters! +.PP +This is the list of all necessary keywords: +.TP +.B hbf_header +The HBF header file name of the input font(s). +.B hbf2gf +uses the given searching mechanism (kpathsea, emtexdir, or MiKTeX) to locate +this file. +.TP +.B output_name +The name stem of the output files. +A running two digit decimal number starting with \(oq\c +.C 01 \(cq +will be appended. +For Unicode fonts see the keyword +.B unicode +below. +This value is in almost all cases identical to the name of the configuration +file. +.PP +And now all optional keywords: +.TP +.B x_offset +Increases the character width. +Will be applied on both sides; default for non-rotated glyphs is the value +given in the HBF header +.RB ( HBF_BITMAP_BOUNDING_BOX ) +scaled to +.B design_size +(in pixels). +.TP +.B y_offset +Shifts all characters up or down; default for non-rotated glyphs is the value +given in the HBF header +.RB ( HBF_BITMAP_BOUNDING_BOX ) +scaled to +.B design_size +(in pixels). +.TP +.B design_size +The design size (in points) of the font. +.B x_offset +and +.B y_offset +refer to this size. +Default is\ 10.0. +.TP +.B slant +The slant of the font (given as \*(DEx\ /\ \*(DEy). +Only values in the range 0\ \(<=\ \fBslant\fP\ \(<=\ 1 are allowed. +Default is\ 0.0. +.TP +.B rotation +If set to \(oqyes\(cq, all glyphs will be rotated 90\ degrees counter-clockwise. +The default offsets as given in the HBF header will be ignored (and set +to\ 0). +Default is \(oqno\(cq. +.TP +.B mag_x +.TQ +.B mag_y +Scaling values of the characters to reach design size. +If only one magnification is given, x and y values are assumed to be equal. +Default is \fBmag_x\fP\ =\ \fBmag_y\fP\ =\ 1.0. +.PP +.TP +.B threshold +A value between 1 and\ 254 defining a threshold for converting the internal +graymap into the output bitmap; lower values cut more pixels. +Default value is\ 128. +.PP +.TP +.B comment +A comment describing the font; default is none. +.PP +.TP +.B nmb_fonts +The number of subfonts to create. +Default value is \-1 for creating all fonts. +.TP +.B unicode +If \(oqyes\(cq, a two digit hexadecimal number will be used as a running number, +starting with the value of the first byte of the first code range. +Default is \(oqno\(cq. +.TP +.B min_char +The minimum value of the encoding. +You should set this value to get correct subfile offsets if it is not +identical to the lowest character code in the HBF file. +.PP +.TP +.B dpi_x +.TQ +.B dpi_y +The horizontal and vertical resolution (in dpi) of the printer. +If only one resolution is given, x and y values are assumed to be equal. +Default is\ 300. +.TP +.B checksum +A checksum to identify the +.C GF +files with the appropriate +.C TFM +files. +The default value of this unsigned 32bit integer is\ 0. +.TP +.B coding +A comment describing the coding scheme; default is none. +.PP +.TP +.B pk_directory +The destination directory of the +.C PK +files; default: none. +Attention! +The batch file will not check whether this directory exists. +.TP +.B tfm_directory +The destination directory of the +.C TFM +files; default: none. +Attention! +The batch file will not check whether this directory exists. +.TP +.B pk_files +Whether to create +.C PK +files or not; default is \(oqyes\(cq. +.TP +.B tfm_files +Whether to create +.C TFM +files or not; default is \(oqyes\(cq. +.TP +.B ofm_file +Whether to create an +.C OPL +file or not; default is \(oqno\(cq. +The batch file will then use +.B ovp2ovf +of the Omega distribution to convert it into an +.C OFM +and an +.C OVF +file. +The +.C OPL +file simply maps all subfonts back to a single Omega font. +.TP +.B long_extension +If \(oqyes\(cq, +.C PK +files will include the resolution in the extension (e.g. +.C gsso1201.300pk ). +This affects the batch file only (default is \(oqyes\(cq). +.TP +.B rm_command +The shell command to remove files; default: \(oqrm\(cq. +.TP +.B cp_command +The shell command to copy files; default: \(oqcp\(cq. +.TP +.B job_extension +The extension of the batch file which calls +.B gftopk +and +.B pltotf +to convert the +.C GF +and the +.C PL +files into +.C PK +and +.C TFM +files respectively; default is none. +. +. +.SH "FILE SEARCHING" +.B hbf2gf +uses either the +.BR kpathsea , +.BR emtexdir , +or +.B MiKTeX +library for searching files +.RB ( emtexdir +will work only on operating systems which have an MS-DOSish background, +i.e., MS-DOS, OS/2, Windows; +.B MiKTeX +is for Win32 systems). +. +.SS kpathsea +Please note that older versions of +.B kpathsea +(<3.2) have no special means to seach for program related files. +Additionally, versions older than 3.3 have no default path for miscellaneous +fonts, thus we use the paths for PostScript related stuff if necessary for +fonts resp. configuration files. +The actual version of kpathsea is displayed on screen if you call +.B hbf2gf +.BR \-\-version . +.PP +Here is a table of the file type and the corresponding +.B kpathsea +variables. +.PP +Version\ 3.3 and newer (this won't change again in the future!): +.PP +.in +4m +.ta 2i +.br +.C "\&.hbf MISCFONTS" +.br +.C "\&.cfg HBF2GFINPUTS" +.PP +Version\ 3.2: +.PP +.in +4m +.ta 2i +.br +.C "\&.hbf T1FONTS" +.br +.C "\&.cfg HBF2GFINPUTS" +.PP +And here the same for pre-3.2-versions of +.B kpathsea: +.PP +.in +4m +.ta 2i +.br +.C "\&.hbf T1FONTS" +.br +.C "\&.cfg TEXCONFIG" +.PP +Finally, the same for versions\ \(<=2.6: +.PP +.in +4m +.ta 2i +.br +.C "\&.hbf DVIPSHEADERS" +.br +.C "\&.cfg TEXCONFIG" +.PP +Please consult the info files of +.B kpathsea +for details on these variables. +The decision which naming scheme to use for variables will be done during +compilation. +.PP +You should set the +.C TEXMFCNF +variable to the directory where your +.C texmf.cnf +configuration file resides. +.PP +Here is the proper command to find out to which value a +.B kpathsea +variable is set (we use +.C MISCFONTS +as an example). +This is especially useful if a variable isn't set in +.C texmf.cnf +or in the environment, thus pointing to the default value which is +hard-coded into the +.B kpathsea +library. +.PP +.in +2m +.C "kpsewhich \-progname=hbf2gf \-expand\-var='$MISCFONTS'" +.PP +We select the program name also since it is possible to specify +variables which are searched only for a certain program \(en in our +example it would be +.C MISCFONTS.hbf2gf . +.PP +A similar but not identical method is to say +.PP +.in +2m +.C "kpsewhich \-progname=hbf2gf \-show\-path='misc fonts'" +.PP +[A full list of format types can be obtained by saying \(oq\c +.C "kpsewhich \-\-help" \(cq +on the command line prompt.] +This is exactly how +.B hbf2gf +searches for files; the disadvantage is that all variables are expanded +which can cause very long strings. +. +.SS emtexdir +.PP +Here the list of suffixes and its related environment variables to be set in +.C autoexec.bat +(resp. in +.C config.sys +for OS/2): +.PP +.in +4m +.ta 2i +.br +.C "\&.hbf HBFONTS" +.br +.C "\&.cfg HBFCFG" +.PP +If one of the variables isn't set, a warning message is emitted. +The current directory will always be searched. +As usual, one exclamation mark appended to a directory path causes +subdirectories one level deep to be searched, two exclamation marks causes +all subdirectories to be searched. +Example: +.PP +.in +2m +.C HBFONTS=c:\\\\fonts\\\\hbf!!;d:\\\\myfonts\\\\hbf! +.PP +Constructions like \(oq\c +.C c:\\\\fonts!!\\\\hbf \(cq +aren't possible. +. +.SS MikTeX +.PP +Please consult the documentation files of +.B MiKTeX +for more details. +. +. +.SH LIMITATIONS +The x and y output size must not exceed +.BR MAX_CHAR_SIZE , +which is defined at compile time; its default value is 1023\ (pixel). +. +. +.SH "SEE ALSO" +.BR ttf2pk (1) +.PP +.C hbf2gf.w : +'in +\n(.ku +this is the source code written in +.B CWEB +which can be converted into a pretty-printed \*(TX +document using +.BR cweave . +The CJK package also contains a preformatted +.C hbf2gf.pdf +file. +.PP +the +.B CJK +documentation files (\c +.C hbf2gf.txt ). +.PP +the +.B Hanzi Bitmap File +.RB ( HBF ) +standard version\ 1.3; available at +.C \%ftp.ifcss.org . +.PP +the Omega documentation available at +.C ftp.ens.fr +and the CTAN hosts and mirrors. +. +. +.SH FILES +.TP +.C *.cfg +The +.B hbf2gf +configuration scripts. +.TP +.C *.hbf +HBF header files which describe fixed-width bitmap fonts. +Note that the bitmap font name(s) themselves as specified in the header files +are irrelevant for +.BR hbf2gf . +. +. +.SH AVAILABILITY +.B hbf2gf +is part of the CJK macro package for \*(LE +available at the CTAN hosts and its mirrors. +.PP +CJK fonts together with HBF header files can be found at +.C ftp.ifcss.org +and its mirrors. +. +. +.SH AUTHORS +Werner Lemberg +.C <wl@gnu.org> +.br +Ross Paterson (the HBF API) +.C <ross@soi.city.ac.uk> diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/hbf2gf.c b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/hbf2gf.c new file mode 100644 index 00000000000..061e4191221 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/hbf2gf.c @@ -0,0 +1,2302 @@ +#define banner \ +"hbf2gf (CJK ver. 4.8.2)" \ + \ + +#define TRUE 1 +#define FALSE 0 \ + +#define STRING_LENGTH 255 \ + +#define FILE_NAME_LENGTH 1024 \ + \ + +#define VERSION \ +"\n" \ +"Copyright (C) 1996-1999 Werner Lemberg.\n" \ +"There is NO warranty. You may redistribute this software\n" \ +"under the terms of the GNU General Public License\n" \ +"and the HBF library copyright.\n" \ +"\n" \ +"For more information about these matters, see the files\n" \ +"named COPYING and hbf.c.\n" \ +"\n" \ + +#define USAGE \ +"\n" \ +"Usage: hbf2gf [-q] configuration_file[.cfg]\n" \ +" hbf2gf [options] font_name x_resolution [y_scale | y_resolution]\n" \ +" hbf2gf -t [-q] font_name\n" \ +"\n" \ +" Convert a font in HBF format to TeX's GF resp. PK format.\n" \ +"\n" \ +" -q be silent\n" \ +" -p don't produce a PL file\n" \ +" -g don't produce a GF file\n" \ +" -n use no resolution in extension (only `.gf')\n" \ +" -t test for font_name (returns 0 on success)\n" \ +" --help print this message and exit\n" \ +" --version print version number and exit\n" \ +"\n" \ + +#define GF_ID 131 +#define PRE 247 \ + +#define header " hbf2gf output " \ + +#define BOC 67 +#define BOC1 68 +#define EOC 69 \ + +#define _2_16 65536.0 +#define _2_20 1048576.0 \ + +#define XXX1 239 +#define XXX2 240 +#define XXX3 241 +#define XXX4 242 \ + +#define YYY 243 \ + +#define POST 248 \ + +#define CHAR_LOC 245 +#define CHAR_LOC0 246 \ + +#define POSTPOST 249 +#define POSTPOST_ID 223 \ + +#define BLACK 1 +#define WHITE 0 \ + +#define PIXEL_MAXVAL 255 +#define SCALE 4096 +#define HALFSCALE 2048 \ + +#define MAX_CHAR_SIZE 1023 \ + +#define PAINT_(x) (x) +#define PAINT1 64 +#define PAINT2 65 +#define PAINT3 66 \ + +#define SKIP0 70 +#define SKIP1 71 +#define SKIP2 72 +#define SKIP3 73 \ + +#define NEW_ROW_(x) ((x) +74) \ + +#define NOOP 244 \ + +#define EXTENSION_LENGTH 8 \ + +#define GFTOPK_NAME "gftopk" +#define PLTOTF_NAME "pltotf" +#define OVP2OVF_NAME "ovp2ovf" \ + +#define PRINTER_MIN_RES_X 50 +#define PRINTER_MIN_RES_Y 50 \ + +#define VALID_SUBCODE 1 \ + +/*4:*/ +#line 193 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +/*10:*/ +#line 413 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +#include <ctype.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <time.h> +#ifdef TM_IN_SYS_TIME +#include <sys/time.h> +#endif +#include "hbf.h" + + + +/*:10*//*69:*/ +#line 2483 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +#if defined(HAVE_LIBKPATHSEA) +#ifdef VERY_OLD_KPATHSEA +#include "kpathsea/proginit.h" +#include "kpathsea/progname.h" +#include "kpathsea/tex-glyph.h" +#else +#include "kpathsea/kpathsea.h" +#endif + +#elif defined(HAVE_EMTEXDIR) +#include "emtexdir.h" + +#elif defined(HAVE_MIKTEX) +#include "miktex.h" +#endif + +/*:69*/ +#line 194 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +/*11:*/ +#line 431 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +void write_file(void); + + +/*:11*//*13:*/ +#line 493 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +void write_pre(void); + + +/*:13*//*16:*/ +#line 581 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +void write_data(void); + + +/*:16*//*20:*/ +#line 692 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +void write_post(void); + + +/*:20*//*25:*/ +#line 836 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +void fputl(long,FILE*); + + +/*:25*//*29:*/ +#line 999 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +void make_pixel_array(void); + + +/*:29*//*36:*/ +#line 1227 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +#ifdef __GNUC__ +__inline__ +#endif +void read_row(unsigned char*); + + +/*:36*//*39:*/ +#line 1279 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +#ifdef __GNUC__ +__inline__ +#endif +void write_row(unsigned char*); + + +/*:39*//*41:*/ +#line 1334 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +void write_coding(void); + + +/*:41*//*45:*/ +#line 1495 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +void write_pl(void); + + +/*:45*//*47:*/ +#line 1592 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +void write_ovp(void); + + +/*:47*//*50:*/ +#line 1737 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +void write_job(void); + + +/*:50*//*54:*/ +#line 1986 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +void read_config(void); + + +/*:54*//*64:*/ +#line 2317 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +int fsearch(char*); + + +/*:64*//*67:*/ +#line 2457 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +void config_error(char*); + + +/*:67*//*71:*/ +#line 2517 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +char*TeX_search_version(void); + + +/*:71*//*74:*/ +#line 2552 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +#ifdef HAVE_EMTEXDIR +extern int setup_list(struct emtex_dir*,char*,const char*,unsigned); +int dir_setup(struct emtex_dir*,const char*,const char*,unsigned); +char*file_find(char*,struct emtex_dir*); +#endif + + +/*:74*//*79:*/ +#line 2649 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +char*TeX_search_cfg_file(char*); +char*TeX_search_hbf_file(char*); + + +/*:79*/ +#line 195 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +/*2:*/ +#line 129 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +int nmb_files= -1; +int unicode= FALSE; + +int testing= FALSE; + +int mf_like= FALSE; +int file_number= 0; + +double x_resolution= 0.0; +double y_scale= 1.0; + +int pk_files= TRUE; +int tfm_files= TRUE; +int long_extension= TRUE; +int quiet= FALSE; + +char config_file[FILE_NAME_LENGTH+4+1]; + +char output_name[STRING_LENGTH+1]; + +FILE*config,*out; +HBF*hbf; + +#ifdef msdos +#define WRITE_BIN "wb" +#define WRITE_TXT "wt" +#define READ_BIN "rb" +#define READ_TXT "rt" +#else +#define WRITE_BIN "w" +#define WRITE_TXT "w" +#define READ_BIN "r" +#define READ_TXT "r" +#endif + +int end_of_file= FALSE; + + +/*:2*//*15:*/ +#line 540 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +long char_adr[256]; +long*char_adr_p; + +int pk_offset_x; + + +double tfm_offset_x; +int pk_offset_y; + +double tfm_offset_y; + +int input_size_x; +int input_size_y; +const char*font_encoding; +int pk_width; +int pk_output_size_x; + +double tfm_output_size_x; +int pk_output_size_y; +double tfm_output_size_y; + +double design_size= 10.0; +double target_size_x; +double target_size_y; +double magstep_x; +double magstep_y; +double slant; +int rotation; + +double mag_x; +double mag_y; + +int empty_char; +int last_char; + +int dot_count; + + + +/*:15*//*19:*/ +#line 669 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +char coding[STRING_LENGTH+1]; +char comment[STRING_LENGTH+1]; + +unsigned long checksum; + +long pk_total_min_x; +long pk_total_max_x; +long pk_total_min_y; +long pk_total_max_y; + +int dpi_x; +int dpi_y; +double ppp_x; +double ppp_y; + + +/*:19*//*27:*/ +#line 876 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +HBF_CHAR code; +const unsigned char*bitmap; + +unsigned char*bP; + +unsigned char out_char[MAX_CHAR_SIZE*MAX_CHAR_SIZE+1]; + +unsigned char*out_char_p; + +unsigned char pixelrow[MAX_CHAR_SIZE]; +unsigned char temp_pixelrow[MAX_CHAR_SIZE]; +unsigned char new_pixelrow[MAX_CHAR_SIZE+1]; + +int curr_row; + +long grayrow[MAX_CHAR_SIZE]; + +long s_mag_x,s_mag_y,s_slant; + + +/*:27*//*38:*/ +#line 1274 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +int threshold= 128; + + +/*:38*//*49:*/ +#line 1726 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +char job_extension[EXTENSION_LENGTH+1]; +char rm_command[STRING_LENGTH+1]; +char cp_command[STRING_LENGTH+1]; +char pk_directory[STRING_LENGTH+1]; +char tfm_directory[STRING_LENGTH+1]; + +int ofm_file= FALSE; + + +/*:49*//*53:*/ +#line 1981 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +char Buffer[STRING_LENGTH+1]; + + +/*:53*//*58:*/ +#line 2099 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +int offset_x; +int offset_y; + +HBF_CHAR user_min_char; +int have_min_char= FALSE; + +/*:58*//*60:*/ +#line 2256 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +HBF_CHAR min_char,max_char; + + +/*:60*//*62:*/ +#line 2283 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +char b2_codes[256]; +unsigned char min_2_byte,max_2_byte; +int nmb_2_bytes= 0; + + +/*:62*//*70:*/ +#line 2501 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +#if defined(HAVE_LIBKPATHSEA) +#ifdef KPSEDLL + +extern KPSEDLL char*kpathsea_version_string; +#else +extern DllImport char*kpathsea_version_string; +#endif +#elif defined(HAVE_EMTEXDIR) +char emtex_version_string[]= "emTeXdir"; +#elif !defined(HAVE_MIKTEX) +char no_version_string[]= "no search library"; +#endif + + +/*:70*//*73:*/ +#line 2545 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +#ifdef HAVE_EMTEXDIR +struct emtex_dir cfg_path,hbf_path; +#endif + + +/*:73*//*76:*/ +#line 2591 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +char name_buffer[FILE_NAME_LENGTH+1]; + + +/*:76*/ +#line 196 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + + + +int main(argc,argv) +int argc; +char*argv[]; + +{char*p; + +/*78:*/ +#line 2613 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +#if defined(HAVE_LIBKPATHSEA) +#ifdef OLD_KPATHSEA +kpse_set_progname(argv[0]); +#else +kpse_set_program_name(argv[0],"hbf2gf"); +#endif + +#ifdef VERY_OLD_KPATHSEA +kpse_init_prog("HBF2GF",300,"cx",true,"cmr10"); +#else +kpse_init_prog("HBF2GF",300,"cx","cmr10"); +#endif + +#elif defined(HAVE_EMTEXDIR) +if(!dir_setup(&cfg_path,"HBFCFG",NULL,EDS_BANG)) +{fprintf(stderr, +"Couldn't setup search path for configuration files\n"); +exit(1); +} +if(!dir_setup(&hbf_path,"HBFONTS",NULL,EDS_BANG)) +{fprintf(stderr, +"Couldn't setup search path for HBF header files\n"); +exit(1); +} +#endif + + +/*:78*/ +#line 205 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + + +/*7:*/ +#line 312 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +if(argc==2) +{if(strcmp(argv[1],"--help")==0) +/*6:*/ +#line 293 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +{printf(USAGE); +exit(0); +} + + +/*:6*/ +#line 315 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +else if(strcmp(argv[1],"--version")==0) +/*5:*/ +#line 266 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +{printf("\n"); +printf(banner); +printf(" (%s)\n",TeX_search_version()); +printf(VERSION); +exit(0); +} + + +/*:5*/ +#line 317 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +} + +while(argc> 1) +{p= argv[1]; +if(p[0]!='-') +break; +if(p[1]=='p') +tfm_files= FALSE; +else if(p[1]=='g') +pk_files= FALSE; +else if(p[1]=='n') +long_extension= FALSE; +else if(p[1]=='q') +quiet= TRUE; +else if(p[1]=='t') +testing= TRUE; + +argv++; +argc--; +} + +if(testing) +{if(argc!=2) +{fprintf(stderr,"Need exactly one parameter for `-t' option.\n"); +fprintf(stderr,"Try `hbf2gf --help' for more information.\n"); +exit(1); +} +} +else if(argc<2||argc> 4) +{fprintf(stderr,"Invalid number of parameters.\n"); +fprintf(stderr,"Try `hbf2gf --help' for more information.\n"); +exit(1); +} + + +/*:7*/ +#line 207 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + + +if(!quiet) +printf("\n%s\n\n",banner); + +strncpy(config_file,argv[1],FILE_NAME_LENGTH); +config_file[FILE_NAME_LENGTH]= '\0'; + +if(argc> 2||testing) +{int l= strlen(config_file); + +if(l> 2) +config_file[l-2]= '\0'; + +else +{if(!quiet) +printf("`%s' can't be a subfont created by hbf2gf\n", +config_file); +exit(2); +} + +mf_like= TRUE; +} + +read_config(); + +if(mf_like) +/*8:*/ +#line 357 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +{if(unicode) +file_number= (int)strtol(&argv[1][strlen(argv[1])-2], +(char**)NULL,16); +else +file_number= atoi(&argv[1][strlen(argv[1])-2]); + +x_resolution= atof(argv[2]); +if(x_resolution<PRINTER_MIN_RES_X) +{fprintf(stderr,"Invalid horizontal resolution\n"); +exit(1); +} + +if(argc> 3) +{y_scale= atof(argv[3]); +if(y_scale<0.01) +{fprintf(stderr, +"Invalid vertical scaling factor or resolution\n"); +exit(1); +} +if(y_scale> 10.0) +y_scale= (double)x_resolution/y_scale; +} +} + + +/*:8*/ +#line 234 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + + +/*28:*/ +#line 908 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +{int col,offset; + +if(rotation) +{int tmp; + + +tmp= input_size_x; +input_size_x= input_size_y; +input_size_y= tmp; +} + +if(mf_like) +{target_size_x= design_size*(x_resolution/dpi_x); +target_size_y= design_size*(x_resolution*y_scale/dpi_y); +} +else +target_size_x= target_size_y= design_size; +magstep_x= target_size_x/design_size; +magstep_y= target_size_y/design_size; + +pk_offset_x= offset_x*magstep_x+0.5; +pk_offset_y= offset_y*magstep_y+0.5; +tfm_offset_x= offset_x/(dpi_x/72.27)/design_size; +tfm_offset_y= offset_y/(dpi_y/72.27)/design_size; + +pk_width= input_size_x*mag_x*magstep_x+0.5; +pk_output_size_x= input_size_x*mag_x*magstep_x+ +input_size_y*mag_y*magstep_y*slant+0.5; +pk_output_size_y= input_size_y*mag_y*magstep_y+0.5; +tfm_output_size_x= input_size_x*mag_x/ +(dpi_x/72.27)/design_size; +tfm_output_size_y= input_size_y*mag_y/ +(dpi_y/72.27)/design_size; +if(pk_output_size_x> MAX_CHAR_SIZE) +{fprintf(stderr,"Output character box width too big\n"); +exit(1); +} +if(pk_output_size_y> MAX_CHAR_SIZE) +{fprintf(stderr,"Output character box height too big\n"); +exit(1); +} + +for(col= 0;col<input_size_x;++col) +grayrow[col]= HALFSCALE; + +if(!mf_like) +code= (min_char&0xFF00)+min_2_byte; +else +{if((file_number<(unicode?0:1))||(file_number>=0x100)) +{fprintf(stderr,"Invalid subfile number\n"); +exit(1); +} + +if(unicode) +{offset= 0; +code= file_number*0x100; +} +else +{offset= (file_number-1)*256%nmb_2_bytes; +code= (min_char&0xFF00)+min_2_byte+ +(file_number-1)*256/nmb_2_bytes*0x100; +} + +while(offset--) +while(!b2_codes[code++&0xFF]) + +; + +if(code> max_char) +{fprintf(stderr,"Invalid subfile number\n"); +exit(1); +} +} + +s_mag_x= mag_x*magstep_x*SCALE; +s_mag_y= mag_y*magstep_y*SCALE; +s_slant= slant*SCALE; +} + + +/*:28*/ +#line 236 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + + +/*9:*/ +#line 392 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +{int j,max_numb; + +if(!mf_like) +{file_number= (unicode==TRUE?(min_char>>8):1); +if(nmb_files==-1) +max_numb= (unicode==TRUE?0x100:100); +else +max_numb= nmb_files; +} +else +max_numb= 1; + +for(j= 0;(j<max_numb)&&!end_of_file;file_number++,j++) +write_file(); + +nmb_files= j; +} + + +/*:9*/ +#line 238 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + + +if(tfm_files) +write_pl(); +if(ofm_file) +write_ovp(); +if(!mf_like) +write_job(); + +hbfClose(hbf); + +exit(0); +return 0; +} + + +/*:4*//*12:*/ +#line 439 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +void write_file(void) +{char output_file[FILE_NAME_LENGTH+1]; + + +if(pk_files) +{if(mf_like) +{if(unicode) +sprintf(output_file,"%s%02x.%.0igf", +output_name,file_number, +long_extension?(int)(x_resolution+0.5):0); +else +sprintf(output_file,"%s%02i.%.0igf", +output_name,file_number, +long_extension?(int)(x_resolution+0.5):0); +} +else +{if(unicode) +sprintf(output_file,"%s%02x.gf",output_name,file_number); +else +sprintf(output_file,"%s%02i.gf",output_name,file_number); +} +if(!(out= fopen(output_file,WRITE_BIN))) +{fprintf(stderr,"Couldn't open `%s'\n",output_file); +exit(1); +} +if(!quiet) +printf("Writing `%s' ",output_file); + +write_pre(); +write_data(); +write_post(); +fclose(out); + +if(!quiet) +printf("\n"); +} +else +write_data(); +} + + +/*:12*//*14:*/ +#line 500 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +void write_pre(void) +{char out_s[40],s[20]; +time_t secs_now; +struct tm*time_now; + + +strcpy(out_s,header); + +secs_now= time(NULL); +time_now= localtime(&secs_now); +strftime(s,20,"%Y.%m.%d:%H.%M",time_now); +strcat(out_s,s); + +fputc(PRE,out); +fputc(GF_ID,out); +fputc(strlen(out_s),out); +fputs(out_s,out); +} + + +/*:14*//*17:*/ +#line 586 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +void write_data(void) +{dot_count= 0; +char_adr_p= char_adr; + +for(last_char= 0;(last_char<256)&&!end_of_file;last_char++) +/*18:*/ +#line 611 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +{if(dot_count++%10==0) +if(pk_files&&!quiet) +{printf("."); +fflush(stdout); +} + +empty_char= FALSE; +make_pixel_array(); +if(end_of_file) +return; + +if(pk_files) +{*char_adr_p= ftell(out); +char_adr_p++; + +if(empty_char) +{fputc(BOC1,out); +fputc((unsigned char)last_char,out); +fputc(0,out); +fputc(0,out); +fputc(0,out); +fputc(0,out); +fputc(EOC,out); +} +else +{fputc(BOC,out); +fputl(last_char,out); +fputl(-1L,out); +fputl(pk_offset_x,out); +fputl(pk_output_size_x+pk_offset_x,out); +fputl(pk_offset_y,out); +fputl(pk_output_size_y+pk_offset_y,out); + +write_coding(); + +fputc(EOC,out); +} +} +} + + +/*:18*/ +#line 592 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +} + + +/*:17*//*21:*/ +#line 697 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +void write_post(void) +{long special_adr; +long post_adr; + +long designsize= design_size*_2_20; + +int pk_dx; +long tfm_width; + +int i; +long temp; + + +ppp_x= dpi_x/72.27*magstep_x; +ppp_y= dpi_y/72.27*magstep_y; + +pk_total_min_x= pk_offset_x; +pk_total_max_x= pk_output_size_x+2*pk_offset_x; +pk_total_min_y= pk_offset_y; +pk_total_max_y= pk_output_size_y+pk_offset_y; + +pk_dx= pk_width+2*pk_offset_x; +tfm_width= (tfm_output_size_x+2*tfm_offset_x)*_2_20; + + +/*22:*/ +#line 743 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +special_adr= ftell(out); + +if(*coding) +{fputc(XXX1,out); +fputc(strlen(coding),out); +fputs(coding,out); +} + +if(*comment) +{fputc(XXX1,out); +fputc(strlen(comment),out); +fputs(comment,out); +} + + +/*:22*/ +#line 723 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +/*23:*/ +#line 772 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +post_adr= ftell(out); +fputc(POST,out); +fputl(special_adr,out); + +fputl(designsize,out); +fputl(checksum,out); +fputl(ppp_x*_2_16,out); +fputl(ppp_y*_2_16,out); +fputl(pk_total_min_x,out); +fputl(pk_total_max_x,out); +fputl(pk_total_min_y,out); +fputl(pk_total_max_y,out); + +char_adr_p= char_adr; + +if(pk_dx<256) +{for(i= 0;i<last_char;i++) +{fputc(CHAR_LOC0,out); +fputc(i,out); +fputc(pk_dx,out); +fputl(tfm_width,out); +fputl(*char_adr_p++,out); +} +} +else +{for(i= 0;i<last_char;i++) +{fputc(CHAR_LOC,out); +fputc(i,out); +fputl(pk_dx*_2_16,out); +fputl(0,out); +fputl(tfm_width,out); +fputl(*char_adr_p++,out); +} +} + + +/*:23*/ +#line 724 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +/*24:*/ +#line 823 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +fputc(POSTPOST,out); +fputl(post_adr,out); +fputc(GF_ID,out); +temp= ftell(out); +i= (int)(temp%4)+4; +while(i--) +fputc(POSTPOST_ID,out); + + +/*:24*/ +#line 725 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +} + + +/*:21*//*26:*/ +#line 841 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +void fputl(num,f) +long num; +FILE*f; + +{fputc(num>>24,f); +fputc(num>>16,f); +fputc(num>>8,f); +fputc(num,f); +} + + +/*:26*//*30:*/ +#line 1004 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +void make_pixel_array(void) +{unsigned char*prP; +unsigned char*temp_prP; +unsigned char*new_prP; +long*grP; + +register unsigned char*xP; +register unsigned char*nxP; + +register int row,col; +int rows_read= 0; +register int need_to_read_row= 1; + +long frac_row_to_fill= SCALE; +long frac_row_left= s_mag_y; + +int no_code= FALSE; + + +prP= pixelrow; +temp_prP= temp_pixelrow; +new_prP= new_pixelrow; +grP= grayrow; +out_char_p= out_char; + +again: +if(b2_codes[code&0xFF]) +{if(pk_files) +{bitmap= hbfGetBitmap(hbf,code); +bP= (unsigned char*)bitmap; + + +if(!bitmap) +empty_char= TRUE; +else +/*31:*/ +#line 1063 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +{if(pk_output_size_y==input_size_y) +temp_prP= prP; + +curr_row= input_size_y-1; +for(row= 0;row<pk_output_size_y;++row) +{/*32:*/ +#line 1077 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +if(pk_output_size_y==input_size_y) + +read_row(prP); +else +{while(frac_row_left<frac_row_to_fill) +{if(need_to_read_row) +if(rows_read<input_size_y) +{read_row(prP); +++rows_read; +} + +for(col= 0,xP= prP;col<input_size_x;++col,++xP) +grP[col]+= frac_row_left*(*xP); + +frac_row_to_fill-= frac_row_left; +frac_row_left= s_mag_y; +need_to_read_row= 1; +} + +/*33:*/ +#line 1104 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +if(need_to_read_row) +if(rows_read<input_size_y) +{read_row(prP); +++rows_read; +need_to_read_row= 0; +} + +for(col= 0,xP= prP,nxP= temp_prP; +col<input_size_x;++col,++xP,++nxP) +{register long g; + + +g= grP[col]+frac_row_to_fill*(*xP); +g/= SCALE; +if(g> PIXEL_MAXVAL) +g= PIXEL_MAXVAL; + +*nxP= g; +grP[col]= HALFSCALE; +} + +frac_row_left-= frac_row_to_fill; +if(frac_row_left==0) +{frac_row_left= s_mag_y; +need_to_read_row= 1; +} +frac_row_to_fill= SCALE; + + +/*:33*/ +#line 1097 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +} + + +/*:32*/ +#line 1069 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +/*34:*/ +#line 1145 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +if(pk_width==input_size_x&&s_slant==0) + +write_row(temp_prP); +else +{register long g= HALFSCALE; +register long frac_col_to_fill= SCALE; +register long frac_col_left; +register int need_col= 0; + + +nxP= new_prP; + +frac_col_left= (pk_output_size_y-row)*s_slant; +while(frac_col_left>=frac_col_to_fill) +{*(nxP++)= 0; +frac_col_left-= frac_col_to_fill; +} + +if(frac_col_left> 0) +frac_col_to_fill-= frac_col_left; + +for(col= 0,xP= temp_prP;col<input_size_x;++col,++xP) +{frac_col_left= s_mag_x; +while(frac_col_left>=frac_col_to_fill) +{if(need_col) +{++nxP; +g= HALFSCALE; +} + +g+= frac_col_to_fill*(*xP); +g/= SCALE; +if(g> PIXEL_MAXVAL) +g= PIXEL_MAXVAL; + +*nxP= g; +frac_col_left-= frac_col_to_fill; +frac_col_to_fill= SCALE; +need_col= 1; +} + +if(frac_col_left> 0) +{if(need_col) +{++nxP; +g= HALFSCALE; +need_col= 0; +} + +g+= frac_col_left*(*xP); +frac_col_to_fill-= frac_col_left; +} +} + +/*35:*/ +#line 1203 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +if(frac_col_to_fill> 0) +{--xP; +g+= frac_col_to_fill*(*xP); +} + +if(!need_col) +{g/= SCALE; +if(g> PIXEL_MAXVAL) +g= PIXEL_MAXVAL; +*nxP= g; +} + +*(++nxP)= 0; + +write_row(new_prP); + + +/*:35*/ +#line 1198 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +} + + +/*:34*/ +#line 1071 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +} +} + + +/*:31*/ +#line 1040 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +} +} +else +no_code= TRUE; + +if((code&0xFF)==max_2_byte) +code+= 0xFF-(max_2_byte-min_2_byte); +if(code>=max_char) +{end_of_file= TRUE; +return; +} + +code++; + +if(no_code) +{no_code= FALSE; +goto again; +} +} + + +/*:30*//*37:*/ +#line 1235 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +#ifdef __GNUC__ +__inline__ +#endif +void read_row(pixelrow) +unsigned char*pixelrow; + +{register int col,bitshift,offset; +register unsigned char*xP; +register unsigned char item= 0; + +if(rotation) +{bitshift= 7-(curr_row%8); +offset= (input_size_y+7)/8; +bP= (unsigned char*)bitmap+curr_row/8; +for(col= 0,xP= pixelrow;col<input_size_x;++col,++xP) +{*xP= ((*bP>>bitshift)&1)==1?PIXEL_MAXVAL:0; +bP+= offset; +} +curr_row--; +} +else +{bitshift= -1; +for(col= 0,xP= pixelrow;col<input_size_x;++col,++xP) +{if(bitshift==-1) +{item= *(bP++); +bitshift= 7; +} +*xP= ((item>>bitshift)&1)==1?PIXEL_MAXVAL:0; +--bitshift; +} +} +} + + +/*:37*//*40:*/ +#line 1287 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +#ifdef __GNUC__ +__inline__ +#endif +void write_row(pixelrow) +unsigned char*pixelrow; + +{register int col; +register unsigned char*xP; + +for(col= 0,xP= pixelrow;col<pk_output_size_x;++col,++xP) +*(out_char_p++)= (*xP>=threshold)?1:0; + +} + + +/*:40*//*42:*/ +#line 1342 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +void write_coding(void) +{register int count,skip; +register unsigned char paint; +register int x,y; +register unsigned char*cp; + +x= 0; +y= 0; +cp= out_char+y*pk_output_size_x+x; +count= skip= 0; +paint= WHITE; +goto start; + +while(y<pk_output_size_y) +{/*43:*/ +#line 1366 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +count= 0; +x= 0; +cp= out_char+y*pk_output_size_x+x; + +while(x<pk_output_size_x) +{if(*cp==paint) +count++; +else +{if(skip==0) +{if(count<=164) +fputc(NEW_ROW_(count),out); +else +{fputc(SKIP0,out); + +if(count<256) +{fputc(PAINT1,out); +fputc(count,out); +} +else +{fputc(PAINT2,out); +fputc(count>>8,out); +fputc(count&0xFF,out); +} +} +} +else +{if(skip==1) +fputc(SKIP0,out); +else +{if(skip<256) +{fputc(SKIP1,out); +fputc(skip,out); +} +else +{fputc(SKIP2,out); +fputc(skip>>8,out); +fputc(skip&0xFF,out); +} +} +skip= 0; +if(count<64) +fputc(PAINT_(count),out); +else if(count<256) +{fputc(PAINT1,out); +fputc(count,out); +} +else +{fputc(PAINT2,out); +fputc(count>>8,out); +fputc(count&0xFF,out); +} +} +count= 0; +paint= BLACK; +break; +} +x++; +cp++; +} +if(x>=pk_output_size_x) +{skip++; +y++; +continue; +} + + +/*:43*/ +#line 1357 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +start: +/*44:*/ +#line 1434 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +while(x<pk_output_size_x) +{if(*cp==paint) +count++; +else +{if(count<64) +fputc(PAINT_(count),out); +else if(count<256) +{fputc(PAINT1,out); +fputc(count,out); +} +else +{fputc(PAINT2,out); +fputc(count>>8,out); +fputc(count&0xFF,out); +} +count= 1; +paint= BLACK-paint; +} +x++; +cp++; +} +if(paint==BLACK) +{if(count<64) +fputc(PAINT_(count),out); +else if(count<256) +{fputc(PAINT1,out); +fputc(count,out); +} +else +{fputc(PAINT2,out); +fputc(count>>8,out); +fputc(count&0xFF,out); +} +paint= WHITE; +} + + + +/*:44*/ +#line 1359 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +y++; +} +} + + +/*:42*//*46:*/ +#line 1500 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +void write_pl(void) +{int i,pos; +char output_file[FILE_NAME_LENGTH+1]; +long t,sc; +char*s; +char tfm_header[]= "Created by hbf2gf"; + +file_number--; + +if(mf_like) +{if(unicode) +sprintf(output_file,"%s%02x.pl",output_name,file_number); +else +sprintf(output_file,"%s%02i.pl",output_name,file_number); +} +else +sprintf(output_file,"%s.pl",output_name); + +if(!(out= fopen(output_file,WRITE_TXT))) +{fprintf(stderr,"Couldn't open `%s'\n",output_file); +exit(1); +} +if(!quiet) +printf("\nWriting `%s'\n",output_file); + +fprintf(out, +"\n(FAMILY %s%d)" +"\n(CODINGSCHEME CJK-%s)", +output_name,file_number,font_encoding); + +fprintf(out, +"\n(DESIGNSIZE R %.6f)" +"\n(COMMENT DESIGNSIZE IS IN POINTS)" +"\n(COMMENT OTHER SIZES ARE MULTIPLES OF DESIGNSIZE)" +"\n(CHECKSUM O %lo)" +"\n(FONTDIMEN" +"\n (SLANT R %.6f)" +"\n (SPACE R 0.0)" +"\n (STRETCH R 0.0)" +"\n (SHRINK R 0.0)" +"\n (XHEIGHT R 1.0)" +"\n (QUAD R 1.0)" +"\n (EXTRASPACE R 0.0)" +"\n )",design_size,checksum,slant); + +s= tfm_header; +i= strlen(s); +t= ((long)i)<<24; +sc= 16; +pos= 18; + +fprintf(out,"\n"); +while(i> 0) +{t|= ((long)(*(unsigned char*)s++))<<sc; +sc-= 8; +if(sc<0) +{fprintf(out,"\n(HEADER D %d O %lo)",pos,t); +t= 0; +sc= 24; +pos++; +} +i--; +} +if(t) +fprintf(out,"\n(HEADER D %d O %lo)",pos,t); +fprintf(out,"\n"); + +for(i= 0;i<256;i++) +{fprintf(out, +"\n(CHARACTER O %o" +"\n (CHARWD R %.6f)" +"\n (CHARHT R %.6f)" +"\n (CHARDP R %.6f)" +"\n (CHARIC R %.6f)" +"\n )", +i, +tfm_output_size_x+2*tfm_offset_x, +tfm_output_size_y+tfm_offset_y, +-tfm_offset_y, +slant*(tfm_output_size_y+tfm_offset_y)); +} + +fclose(out); +} + + + +/*:46*//*48:*/ +#line 1597 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +void write_ovp(void) +{int c,i,nmb_subfonts,remainder,count,pos; +char output_file[FILE_NAME_LENGTH+1]; +long t,sc; +char*s; +char ofm_header[]= "Created by hbf2gf"; + +nmb_subfonts= ((max_char-(min_char&0xFF00))/256*nmb_2_bytes) +/256+1; +remainder= ((max_char-(min_char&0xFF00))/256*nmb_2_bytes) +%256; + + +for(count= 0;count<(max_char&0xFF);count++) +if(b2_codes[count]) +remainder++; +if(remainder>=256) +nmb_subfonts++; + +sprintf(output_file,"%s.ovp",output_name); + +if(!(out= fopen(output_file,WRITE_TXT))) +{fprintf(stderr,"Couldn't open `%s'\n",output_file); +exit(1); +} +if(!quiet) +printf("\nWriting `%s'\n",output_file); + +fprintf(out, +"\n(VTITLE Omega virtual font created by hbf2gf)" +"\n(DESIGNSIZE R %.6f)" +"\n(COMMENT DESIGNSIZE IS IN POINTS)" +"\n(COMMENT OTHER SIZES ARE MULTIPLES OF DESIGNSIZE)" +"\n(CHECKSUM O %lo)" +"\n(FONTDIMEN" +"\n (SLANT R %.6f)" +"\n (SPACE R 0.0)" +"\n (STRETCH R 0.0)" +"\n (SHRINK R 0.0)" +"\n (XHEIGHT R 1.0)" +"\n (QUAD R 1.0)" +"\n (EXTRASPACE R 0.0)" +"\n )",design_size,checksum,slant); + +s= ofm_header; +i= strlen(s); +t= ((long)i)<<24; +sc= 16; +pos= 18; + +fprintf(out,"\n"); +while(i> 0) +{t|= ((long)(*(unsigned char*)s++))<<sc; +sc-= 8; +if(sc<0) +{fprintf(out,"\n(HEADER D %d O %lo)",pos,t); +t= 0; +sc= 24; +pos++; +} +i--; +} +if(t) +fprintf(out,"\n(HEADER D %d O %lo)",pos,t); +fprintf(out,"\n"); + +for(i= 0;i<nmb_subfonts;i++) +{fprintf(out, +"\n(MAPFONT D %i" +"\n (FONTNAME %s%02i)" +"\n (FONTCHECKSUM O %lo)" +"\n (FONTAT R 1.0)" +"\n (FONTDSIZE R %.6f)" +"\n )",i,output_name,i+1,checksum,design_size); +} + +for(c= min_char,i= 0,count= 0;c<=max_char;c++) +{if(b2_codes[c&0xFF]==VALID_SUBCODE) +{fprintf(out, +"\n(CHARACTER O %o" +"\n (CHARWD R %.6f)" +"\n (CHARHT R %.6f)" +"\n (CHARDP R %.6f)" +"\n (CHARIC R %.6f)" +"\n (MAP" +"\n (SELECTFONT D %i)" +"\n (SETCHAR O %o)" +"\n )" +"\n )", +c, +tfm_output_size_x+2*tfm_offset_x, +tfm_output_size_y+tfm_offset_y, +-tfm_offset_y, +slant*(tfm_output_size_y+tfm_offset_y), +i, +count); + +count++; +if(count==256) +{count= 0; +i++; +} +} +else +continue; +} + +fclose(out); +} + + + +/*:48*//*51:*/ +#line 1742 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +void write_job(void) +{FILE*out; +int i,j; +char buffer[FILE_NAME_LENGTH+1]; + + +strcpy(buffer,output_name); +strcat(buffer,job_extension); +if(!(out= fopen(buffer,WRITE_TXT))) +{fprintf(stderr,"Couldn't open `%s'\n",buffer); +exit(1); +} +if(!quiet) +printf("\nWriting `%s'\n",buffer); + +if(pk_files) +{if(unicode) +{for(i= (min_char>>8),j= 0;j<nmb_files;i++,j++) +fprintf(out, +"%s %s%02x.gf %s%s%02x.%.0ipk\n" +"%s %s%02x.gf\n", +GFTOPK_NAME,output_name,i, +pk_directory,output_name,i, +long_extension?(int)(dpi_x*magstep_x+0.5):0, +rm_command,output_name,i); +} +else +{for(i= 1;i<=nmb_files;i++) +fprintf(out, +"%s %s%02i.gf %s%s%02i.%.0ipk\n" +"%s %s%02i.gf\n", +GFTOPK_NAME,output_name,i, +pk_directory,output_name,i, +long_extension?(int)(dpi_x*magstep_x+0.5):0, +rm_command,output_name,i); +} +} + +if(tfm_files) +{fprintf(out, +"\n" +"%s %s.pl %s.tfm\n" +"%s %s.pl\n" +"\n", +PLTOTF_NAME,output_name,output_name, +rm_command,output_name); + +if(unicode) +{for(i= (min_char>>8),j= 0;j<nmb_files;i++,j++) +fprintf(out, +"%s %s.tfm %s%s%02x.tfm\n", +cp_command,output_name, +tfm_directory,output_name,i); +} +else +{for(i= 1;i<=nmb_files;i++) +fprintf(out, +"%s %s.tfm %s%s%02i.tfm\n", +cp_command,output_name, +tfm_directory,output_name,i); +} + +fprintf(out, +"\n" +"%s %s.tfm", +rm_command,output_name); +} + +if(ofm_file) +{fprintf(out, +"\n" +"%s %s.ovp %s.ovf %s.ofm\n" +"%s %s.ovp\n" +"\n", +OVP2OVF_NAME,output_name,output_name,output_name, +rm_command,output_name); +} + +fclose(out); +} + + + +/*:51*//*55:*/ +#line 1994 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +void read_config(void) +{HBF_BBOX*boxp; +char*real_config_file; + + +/*56:*/ +#line 2046 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +{int i,lastext= -1; + +for(i= 0;config_file[i];i++) +if(config_file[i]=='.') +lastext= i; +else if(config_file[i]=='/'|| +config_file[i]==':'|| +config_file[i]=='\\') +lastext= -1; + +if(lastext==-1) +strcat(config_file,".cfg"); +} + + +/*:56*/ +#line 2000 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + + +real_config_file= TeX_search_cfg_file(config_file); +if(!real_config_file) +{if(mf_like) +{if(!quiet) +printf("Couldn't find `%s'\n",config_file); +exit(2); +} +else +{fprintf(stderr,"Couldn't find `%s'\n",config_file); +exit(1); +} +} + +if(!(config= fopen(real_config_file,READ_TXT))) +{if(!testing) +{fprintf(stderr,"Couldn't open `%s'\n",config_file); +exit(1); +} +else +{if(!quiet) +fprintf(stderr,"Couldn't find or open `%s'\n",config_file); +exit(2); +} +} + +if(testing) +{if(!quiet) +printf("%s\n",real_config_file); +exit(0); +} + +/*57:*/ +#line 2063 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +{char hbf_header[STRING_LENGTH+1]; +char*real_hbf_header; + +if(!fsearch("hbf_header")) +config_error("hbf_header"); +else +strcpy(hbf_header,Buffer); + +real_hbf_header= TeX_search_hbf_file(hbf_header); +if(!real_hbf_header) +{fprintf(stderr,"Couldn't find `%s'\n",hbf_header); +exit(1); +} + +hbfDebug= 1; + + +if(!(hbf= hbfOpen(real_hbf_header))) +exit(1); + +hbfDebug= 0; + +boxp= hbfBitmapBBox(hbf); +input_size_x= boxp->hbf_height; +input_size_y= boxp->hbf_width; +font_encoding= hbfProperty(hbf,"HBF_CODE_SCHEME"); + +if(!fsearch("output_name")) +config_error("output_name"); +else +strcpy(output_name,Buffer); +} + + +/*:57*/ +#line 2033 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +/*59:*/ +#line 2107 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +{if(fsearch("nmb_files")) +nmb_files= atoi(Buffer); +if(fsearch("unicode")) +if(Buffer[0]=='y'||Buffer[0]=='Y') +unicode= TRUE; +if(fsearch("min_char")) +{user_min_char= strtoul(Buffer,(char**)NULL,0); +have_min_char= TRUE; +} + +if(!mf_like) +{if(fsearch("pk_files")) +if(Buffer[0]=='n'||Buffer[0]=='N') +pk_files= FALSE; +if(fsearch("tfm_files")) +if(Buffer[0]=='n'||Buffer[0]=='N') +tfm_files= FALSE; +if(fsearch("ofm_file")) +if(Buffer[0]=='y'||Buffer[0]=='Y') +ofm_file= TRUE; +if(fsearch("long_extension")) +if(Buffer[0]=='n'||Buffer[0]=='N') +long_extension= FALSE; +} + +if(fsearch("slant")) +slant= atof(Buffer); +if(slant<0.0||slant> 1.0) +{fprintf(stderr,"Invalid slant\n"); +exit(1); +} +if(fsearch("rotation")) +if(Buffer[0]=='y'||Buffer[0]=='Y') +rotation= TRUE; + +if(fsearch("mag_x")) +mag_x= atof(Buffer); +if(fsearch("mag_y")) +mag_y= atof(Buffer); +if(!mag_x&&!mag_y) +{mag_x= 1.0; +mag_y= 1.0; +} +if(mag_x&&!mag_y) +mag_y= mag_x; +if(mag_y&&!mag_x) +mag_x= mag_y; +if(mag_x<=0.0) +{fprintf(stderr,"Invalid horizontal magnification\n"); +exit(1); +} +if(mag_y<=0.0) +{fprintf(stderr,"Invalid vertical magnification\n"); +exit(1); +} + +if(fsearch("dpi_x")) +dpi_x= atoi(Buffer); +if(fsearch("dpi_y")) +dpi_y= atoi(Buffer); +if(!dpi_x&&!dpi_y) +{dpi_x= 300; +dpi_y= 300; +} +if(dpi_x&&!dpi_y) +dpi_y= dpi_x; +if(dpi_y&&!dpi_x) +dpi_x= dpi_y; +if(dpi_x<=PRINTER_MIN_RES_X) +{fprintf(stderr,"Invalid horizontal printer resolution\n"); +exit(1); +} +if(dpi_y<=PRINTER_MIN_RES_Y) +{fprintf(stderr,"Invalid vertical printer resolution\n"); +exit(1); +} + +if(fsearch("design_size")) +design_size= atof(Buffer); + +if(fsearch("x_offset")) +offset_x= atoi(Buffer); +else +offset_x= rotation?0:(boxp->hbf_xDisplacement*mag_x+0.5); +if(fsearch("y_offset")) +offset_y= atoi(Buffer); +else +offset_y= rotation?0:(boxp->hbf_yDisplacement*mag_y+0.5); +if(!fsearch("comment")) +comment[0]= '\0'; +else +strcpy(comment,Buffer); + +if(fsearch("threshold")) +threshold= atoi(Buffer); +if(threshold<=0||threshold>=255) +{fprintf(stderr,"Invalid threshold\n"); +exit(1); +} + +if(!fsearch("checksum")) +checksum= 0; +else +checksum= strtoul(Buffer,(char**)NULL,0); + +if(!fsearch("coding")) +coding[0]= '\0'; +else +strcpy(coding,Buffer); + +if(!fsearch("pk_directory")) +pk_directory[0]= '\0'; +else +strcpy(pk_directory,Buffer); + +if(!fsearch("tfm_directory")) +tfm_directory[0]= '\0'; +else +strcpy(tfm_directory,Buffer); + +if(fsearch("rm_command")) +strcpy(rm_command,Buffer); +else +strcpy(rm_command,"rm"); + +if(fsearch("cp_command")) +strcpy(cp_command,Buffer); +else +strcpy(cp_command,"cp"); + +if(!fsearch("job_extension")) +job_extension[0]= '\0'; +else +{strncpy(job_extension,Buffer,EXTENSION_LENGTH); +job_extension[EXTENSION_LENGTH]= '\0'; +} +} + + +/*:59*/ +#line 2034 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + + +/*61:*/ +#line 2261 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +{const void*cp; +HBF_CHAR dummy; + +cp= hbfGetCodeRange(hbf,NULL,&min_char,&max_char); +for(;cp!=NULL;cp= hbfGetCodeRange(hbf,cp,&dummy,&max_char)) +; + +if(have_min_char) +min_char= user_min_char; +} + + +/*:61*/ +#line 2036 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +/*63:*/ +#line 2290 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +{const void*b2r; +unsigned char dummy; +int i; + +for(i= 0;i<256;i++) +b2_codes[i]= 0; + +b2r= hbfGetByte2Range(hbf,NULL,&min_2_byte,&max_2_byte); +dummy= min_2_byte; +for(;b2r!=NULL;b2r= hbfGetByte2Range(hbf,b2r,&dummy,&max_2_byte)) +{for(i= dummy;i<=max_2_byte;i++) +b2_codes[i]= VALID_SUBCODE; +} + +for(i= 0;i<256;i++) +if(b2_codes[i]==VALID_SUBCODE) +nmb_2_bytes++; +} + + +/*:63*/ +#line 2037 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + + +fclose(config); +} + + +/*:55*//*65:*/ +#line 2322 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +int fsearch(search_string) +char*search_string; + +{char*P,p; +char temp_buffer[STRING_LENGTH+1]; +char env_name[STRING_LENGTH+1]; +char*env_p; +char*env_value; +char*Buf_p; +int Ch,ch,old_ch= '\n'; +int count= STRING_LENGTH; + +rewind(config); + +do +{P= search_string; +p= tolower(*P); +Ch= fgetc(config); +ch= tolower(Ch); +while(!(ch==p&&old_ch=='\n')&&Ch!=EOF) + + +{old_ch= ch; +Ch= fgetc(config); +ch= tolower(Ch); +} + +for(;;) +{if(*(++P)=='\0') +if((Ch= fgetc(config))==' '||Ch=='\t') + +goto success; +Ch= fgetc(config); +if(tolower(Ch)!=tolower(*P)) +break; +} +} +while(Ch!=EOF); + +return 0; + +success: +P= temp_buffer; + +while((Ch= fgetc(config))==' '||Ch=='\t') + +; +while(Ch!='\n'&&--count> 0&&Ch!=EOF) +{*P++= Ch; +Ch= fgetc(config); +} +*P= '\0'; + +if(*temp_buffer) +/*66:*/ +#line 2402 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +{P= temp_buffer; +Buf_p= Buffer; +count= STRING_LENGTH-1; + +while(*P&&count> 0) +{env_p= env_name; + +if(*P=='$') +{P++; +if(*P=='$') +{*(Buf_p++)= *(P++); +count--; +continue; +} +while(*P=='{') +P++; +if(!(isalpha(*P)||*P=='_')) +{fprintf(stderr, +"Invalid environment variable name in configuration file\n"); +exit(1); +} +*(env_p++)= *(P++); +while(*P) +{if(isalnum(*P)||*P=='_') +*(env_p++)= *(P++); +else +{while(*P=='}') +P++; +*env_p= '\0'; +break; +} +} + +env_value= getenv(env_name); +if(env_value) +{while(*env_value&&count> 0) +{*(Buf_p++)= *(env_value++); +count--; +} +} +} +else +{*(Buf_p++)= *(P++); +count--; +} +} +*Buf_p= '\0'; +} + + +/*:66*/ +#line 2377 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +else +*Buffer= '\0'; + +return(*Buffer)?1:0; +} + + +/*:65*//*68:*/ +#line 2462 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +void config_error(message) +char*message; + +{fprintf(stderr,"Couldn't find `%s' entry in configuration file\n", +message); +exit(1); +} + + + +/*:68*//*72:*/ +#line 2522 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +char*TeX_search_version(void) +{ +#if defined(HAVE_LIBKPATHSEA) +return kpathsea_version_string; +#elif defined(HAVE_EMTEXDIR) +return emtex_version_string; +#elif defined(HAVE_MIKTEX) +char buf[200]; + +strcpy(buf,"MiKTeX "); +miktex_get_miktex_version_string_ex(buf+7,sizeof(buf)-7); + +return buf; +#else +return no_version_string; +#endif +} + + +/*:72*//*75:*/ +#line 2564 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +#ifdef HAVE_EMTEXDIR +int dir_setup(ed,env,dir,flags) +struct emtex_dir*ed; +const char*env; +const char*dir; +unsigned flags; + +{const char*val; +char path[260]; + +ed->alloc= 0; +ed->used= 0; +ed->list= NULL; + +if(env!=NULL&&(val= getenv(env))!=NULL) +return setup_list(ed,path,val,flags); +else +fprintf(stderr, +"Environment variable `%s' not set; use current directory\n", +env); + +return TRUE; +} + + +/*:75*//*77:*/ +#line 2596 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +char*file_find(name,list) +char*name; +struct emtex_dir*list; + +{if(emtex_dir_find(name_buffer,sizeof(name_buffer),list,name,EDF_CWD)) +return name_buffer; + +return NULL; +} +#endif + + +/*:77*//*80:*/ +#line 2655 "/home/wl/git/cjk/cjk-4.8.2/utils/hbf2gf/hbf2gf.w" + +#if defined(HAVE_LIBKPATHSEA) +char*TeX_search_cfg_file(name) +char*name; + +{ +#ifdef OLD_KPATHSEA +return kpse_find_file(name,kpse_dvips_config_format,TRUE); +#else +return kpse_find_file(name,kpse_program_text_format,TRUE); +#endif +} + + +char*TeX_search_hbf_file(name) +char*name; + +{ +#ifdef VERY_OLD_KPATHSEA +return kpse_find_file(name,kpse_dvips_header_format,TRUE); +#else +#ifndef KPSEDLL +return kpse_find_file(name,kpse_type1_format,TRUE); +#else +return kpse_find_file(name,kpse_miscfonts_format,TRUE); +#endif +#endif +} + + +#elif defined(HAVE_EMTEXDIR) +char*TeX_search_cfg_file(name) +char*name; + +{return file_find(name,&cfg_path); +} + + +char*TeX_search_hbf_file(name) +char*name; + +{return file_find(name,&hbf_path); +} + + +#elif defined(HAVE_MIKTEX) +char*TeX_search_cfg_file(name) +char*name; + +{char result[_MAX_PATH]; + +if(!miktex_find_input_file("hbf2gf",*name,result)) +return 0; +return strdup(result); +} + + +char*TeX_search_hbf_file(name) +char*name; + +{char result[_MAX_PATH]; + + +if(!miktex_find_miscfont_file(*name,result)) +return 0; +return strdup(result); +} + + +#else +char*TeX_search_cfg_file(name) +char*name; + +{return name; +} + + +char*TeX_search_hbf_file(name) +char*name; + +{return name; +} +#endif + + + +/*:80*/ diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/hbf2gf.def b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/hbf2gf.def new file mode 100644 index 00000000000..0137e4ac9e3 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/hbf2gf.def @@ -0,0 +1,3 @@ +NAME HBF2GF WINDOWCOMPAT +DESCRIPTION 'hbf2gf (CJK Ver. 4.8.2)' +STACKSIZE 0x80000 diff --git a/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/hbf2gf.w b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/hbf2gf.w new file mode 100644 index 00000000000..f96282776f1 --- /dev/null +++ b/Build/source/texk/cjkutils/cjkutils-4.8.2/hbf2gf/hbf2gf.w @@ -0,0 +1,2808 @@ +% This is the cweb file hbf2gf.w of the CJK package ver. 4.8.2 29-Dec-2008 + +% Copyright (C) 1994-2008 Werner Lemberg <wl@@gnu.org> +% +% 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 in doc/COPYING; if not, write to the Free +% Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +% MA 02110-1301 USA + +% To print this CWEB file you should (but not must) use the CWEAVE of the +% c2cweb-package (found at the CTAN archives, e.g. ftp.dante.de) and then say +% +% cweave +ai hbf2gf.w +% +% This (fully compatible) CWEAVE can transform CWEB-files with alternative +% output rules (look at the position of braces below!) the author (it's me +% too :-) prefer. Otherwise this file will be formatted traditionally. + +\font\meta=logo10 +\def\mf{{\meta META}\-{\meta FONT}} +\def\Om{\char "0A} % Omega symbol + +\def\title{hbf2gf (CJK Version 4.8.2)} + +\def\topofcontents{ + \null\vfill + \centerline{\titlefont The {\ttitlefont hbf2gf} program} + \vskip 20pt + \centerline{(CJK Version 4.8.2)} + \vfill} + +\def\botofcontents{ + \vfill + \noindent + Copyright \copyright~1996-1999 by Werner Lemberg + \bigskip\noindent + Permission is granted to make and distribute verbatim copies of this + document provided that the copyright notice and this permission notice are + preserved on all copies. + + \smallskip\noindent + Permission is granted to copy and distribute modified versions of this + document under the conditions for verbatim copying, provided that the + entire resulting derived work is distributed under the terms of a + permission notice identical to this one.} + +\pageno=\contentspagenumber \advance\pageno by 1 +\let\maybe=\iftrue +\fullpageheight=240mm +\pageheight=223mm +\pagewidth=158mm +\setpage +\frenchspacing + + +\def\msdos{\.{msdos}} +@s msdos TeX + +@s HBF int +@s HBF_CHAR int +@s HBF_BBOX int + +@s __inline__ int + + +@* Introduction. +This is the \.{hbf2gf} program by Werner Lemberg +(\.{wl@@gnu.org}). + +The ``banner line'' defined here should be changed whenever \.{hbf2gf} is +modified. + +@d banner +"hbf2gf (CJK ver. 4.8.2)" + + +@ +\.{hbf2gf} is intended to convert Hanzi Bitmap Fonts (HBF) into \TeX\ +generic font files (\.{GF} files) according to the \\{CJK} package, which +\.{hbf2gf} is part of. + +The outline of \.{hbf2gf} is simple: a CJK (Chinese/Japanese/Korean) bitmap +file will be scaled and written in at most |nmb_files| \.{GF} files, each +file containing |256|~characters (except the last and possibly the first +one). In the normal case it's not necessary to compute the right value of +|nmb_files| because \.{hbf2gf} will do this; you should use |-1| instead to +indicate this. See the last section for an example. + +Alternatively you can call \.{hbf2gf} similar to \mf, i.e., the program will +compute one font on demand. This mode will be used if two or three input +parameters instead of one are given: the font name, the horizontal +resolution, and optionally a vertical scaling factor or resolution to allow +modes for e.g.\ $300\times600\,\hbox{dpi}$ printers. \.{hbf2gf} will extract +the configuration file name from the font name; if this file isn't found, +the program exits with error code~|2| (this is useful for scripts like +\.{mktexpk}). If the configuration file is found but an error occurs while +computing the font, error code~|1| is returned. In case of success, the exit +code is zero. + +The characters in the input font files are completely described by the HBF +header file. This program uses the HBF API implementation of Ross Paterson +(\.{ross@@soi.city.ac.uk}; with small extensions). You will find a +description of the HBF standard at \.{ftp.ifcss.org}. + +A batch file created by \.{hbf2gf} too (if the program computes a whole set +of subfonts) will convert the \.{GF} files to \.{PK} files using +\.{GFtoPK}, a part of every \TeX\ package. + +@d TRUE 1 +@d FALSE 0@# + +@d STRING_LENGTH 255 + /* the maximal length of an input string in the configuration file */ +@d FILE_NAME_LENGTH 1024 + /* the maximal length (including the path) of a filename */@# + +@<Global variables@>= +int nmb_files = -1; /* create all files by default */ +int unicode = FALSE; /* whether a Unicode font should be processed */@# + +int testing = FALSE; /* whether we test only the font name */@# + +int mf_like = FALSE; /* whether we are in the \mf-like mode */ +int file_number = 0; /* the subfont number */@# + +double x_resolution = 0.0; /* the second and third input parameter */ +double y_scale = 1.0;@# + +int pk_files = TRUE; /* command line options */ +int tfm_files = TRUE; +int long_extension = TRUE; +int quiet = FALSE;@# + +char config_file[FILE_NAME_LENGTH + 4 + 1]; + /* we probably must add `\.{.cfg}' */ +char output_name[STRING_LENGTH + 1];@# + +FILE *config, *out; +HBF *hbf;@# + +#ifdef msdos /* if we compile under DOS or OS/2 */ +#define WRITE_BIN "wb" +#define WRITE_TXT "wt" +#define READ_BIN "rb" +#define READ_TXT "rt" +#else +#define WRITE_BIN "w" +#define WRITE_TXT "w" +#define READ_BIN "r" +#define READ_TXT "r" +#endif@# + +int end_of_file = FALSE; + + +@ +One \.{PL} file will be created additionally, which describes the font +metrics in a readable way. Because all CJK characters have identical +bounding boxes, one metrics file is enough---the batch job created by +\.{hbf2gf} calls \.{PLtoTF} to produce this \.{TFM} file and then copies +it into |nmb_files| metrics files. There usually will be a discrepancy +between the number of characters in the last \.{GF} file and the +\.{TFM} file, but this does not harm. + +If you specify the \.{ofm\_file} option in the configuration file, an +extended virtual property file (such files have the extension \.{.ovp}) for +the \Om\ system is written; this will be then converted with +\.{ovp2ovf} into an \.{OFM} and an \.{OVF} file to map all the subfonts +into one large virtual font. + + + +@* The main routine. +The main routine takes |file_name|, |x_resolution|, and |y_scale| as command +line parameters if in \mf-like mode, otherwise |config_file| as the only +argument. |read_config()| scans the configuration file and fills the global +variables, |write_file()| writes the \.{GF} files, |write_pl()| and +|write_ovp()| write the \.{PL} and \.{OVP} files respectively, and +|write_job()| the batch file. + +@c +@<Include files@>@; +@<Prototypes@>@; +@<Global variables@>@;@# + + +int main(int argc, char *argv[]) + {char *p; + + @<Initialize \TeX\ file searching@>@;@# + + @<Scan options@>@;@# + + if(!quiet) + printf("\n%s\n\n", banner);@# + + strncpy(config_file, argv[1], FILE_NAME_LENGTH); + config_file[FILE_NAME_LENGTH] = '\0';@# + + if(argc > 2 || testing) + {int l = strlen(config_file); + + if(l > 2) + config_file[l - 2] = '\0'; + /* strip subfont number from file name */ + else + {if(!quiet) + printf("`%s' can't be a subfont created by hbf2gf\n", + config_file); + exit(2); + }@# + + mf_like = TRUE; + }@# + + read_config(); /* will call |exit(1)| on errors */@# + + if(mf_like) + @<Check other arguments@>@;@# + + @<Initialize variables@>@;@# + + @<Write files@>@;@# + + if(tfm_files) + write_pl(); + if(ofm_file) + write_ovp(); + if(!mf_like) + write_job();@# + + hbfClose(hbf);@# + + exit(0); + return 0; /* never reached */ + } + + +@ +@d VERSION @/ +"\n"@/ +"Copyright (C) 1996-1999 Werner Lemberg.\n"@/ +"There is NO warranty. You may redistribute this software\n"@/ +"under the terms of the GNU General Public License\n"@/ +"and the HBF library copyright.\n"@/ +"\n"@/ +"For more information about these matters, see the files\n"@/ +"named COPYING and hbf.c.\n"@/ +"\n" + +@<Print version@>= + {printf("\n"); + printf(banner); + printf(" (%s)\n", TeX_search_version()); + printf(VERSION); + exit(0); + } + + +@ +@d USAGE @/ +"\n"@/ +"Usage: hbf2gf [-q] configuration_file[.cfg]\n"@/ +" hbf2gf [options] font_name x_resolution [y_scale | y_resolution]\n"@/ +" hbf2gf -t [-q] font_name\n"@/ +"\n"@/ +" Convert a font in HBF format to TeX's GF resp. PK format.\n"@/ +"\n"@/ +" -q be silent\n"@/ +" -p don't produce a PL file\n"@/ +" -g don't produce a GF file\n"@/ +" -n use no resolution in extension (only `.gf')\n"@/ +" -t test for font_name (returns 0 on success)\n"@/ +" --help print this message and exit\n"@/ +" --version print version number and exit\n"@/ +"\n" + +@<Print help information@>= + {printf(USAGE); + exit(0); + } + + +@ +Three options can be specified to the program (\.{-p}, \.{-g}, and \.{-n}) +if in \mf-like mode to suppress creation of a \.{PL} resp.\ a +\.{GF} file, and to force a `\.{.gf}' extension (instead of +e.g.\ `\.{.300gf}'). The corresponding setting of a particular switch in the +configuration file is ignored then. + +Additionally, the option \.{-t} tests whether the specified subfont name +leads to an \.{hbf2gf} configuration file. It returns 0 on success and prints +out the name of that configuration file (provided the \.{-q} switch isn't +set). This test isn't a thorough one; it only removes the last two characters +and checks whether a configuration file with that name exists. + +@<Scan options@>= + if(argc == 2) + {if(strcmp(argv[1], "--help") == 0) + @<Print help information@>@; + else if(strcmp(argv[1], "--version") == 0) + @<Print version@>@; + }@# + + while(argc > 1) + {p = argv[1]; + if(p[0] != '-') + break; + if(p[1] == 'p') + tfm_files = FALSE; + else if(p[1] == 'g') + pk_files = FALSE; + else if(p[1] == 'n') + long_extension = FALSE; + else if(p[1] == 'q') + quiet = TRUE; + else if(p[1] == 't') + testing = TRUE;@# + + argv++; + argc--; + }@# + + if(testing) + {if(argc != 2) + {fprintf(stderr, "Need exactly one parameter for `-t' option.\n"); + fprintf(stderr, "Try `hbf2gf --help' for more information.\n"); + exit(1); + } + } + else if(argc < 2 || argc > 4) + {fprintf(stderr, "Invalid number of parameters.\n"); + fprintf(stderr, "Try `hbf2gf --help' for more information.\n"); + exit(1); + }@# + + +@ +If the (optional) argument is larger than~|10|, we treat it as a value for +the vertical resolution (in dpi), otherwise as a vertical scaling factor. + +@<Check other arguments@>= + {if(unicode) + file_number = (int)strtol(&argv[1][strlen(argv[1]) - 2], + (char **)NULL, 16); + else + file_number = atoi(&argv[1][strlen(argv[1]) - 2]);@# + + x_resolution = atof(argv[2]); + if(x_resolution < PRINTER_MIN_RES_X) + {fprintf(stderr, "Invalid horizontal resolution\n"); + exit(1); + }@# + + if(argc > 3) + {y_scale = atof(argv[3]); + if(y_scale < 0.01) + {fprintf(stderr, + "Invalid vertical scaling factor or resolution\n"); + exit(1); + } + if(y_scale > 10.0) + y_scale = (double)x_resolution / y_scale; + } + } + + +@ +If |unicode| is |TRUE|, the start value of the running number appended to +the base name of the output font files is taken from the HBF header file, +otherwise it starts with~`\.{01}'. |min_char| represents the lower bound of +the code range. + +If we are in \mf-like mode, |file_number| is taken from the command line, +and |max_numb| will be set to~|1|. + +@<Write files@>= + {int j, max_numb; + + if(!mf_like) + {file_number = (unicode == TRUE ? (min_char >> 8) : 1); + if(nmb_files == -1) + max_numb = (unicode == TRUE ? 0x100 : 100); + else + max_numb = nmb_files; + } + else + max_numb = 1;@# + + for(j = 0; (j < max_numb) && !end_of_file; file_number++, j++) + write_file();@# + + nmb_files = j; /* the real number of output font files */ + } + + +@ +@<Include files@>= +#ifdef HAVE_CONFIG_H +#include <c-auto.h> +#endif +#include <ctype.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <time.h> +#ifdef TM_IN_SYS_TIME +#include <sys/time.h> +#endif +#include "hbf.h" + + + +@* The functions. +The first function to be described is |write_file()|. Each \.{GF} file +consists of three sections: a preamble, a data section, and a postamble. The +functions |write_pre()|, |write_data()|, and |write_post()| handle this. + +@<Prototypes@>= +void write_file(void); + + +@ +In \mf-like mode we create font file name extensions similar to \mf\ if +the \.{-n} option isn't specified; otherwise only `\.{.gf}' will be appended. + +@c +void write_file(void) + {char output_file[FILE_NAME_LENGTH + 1]; + + + if(pk_files) + {if(mf_like) + {if(unicode) + sprintf(output_file, "%s%02x.%.0igf",@/ + output_name, file_number, + long_extension ? (int)(x_resolution + 0.5) : 0); + else + sprintf(output_file, "%s%02i.%.0igf",@/ + output_name, file_number, + long_extension ? (int)(x_resolution + 0.5) : 0); + } + else + {if(unicode) + sprintf(output_file, "%s%02x.gf", output_name, file_number); + else + sprintf(output_file, "%s%02i.gf", output_name, file_number); + } + if(!(out = fopen(output_file, WRITE_BIN))) + {fprintf(stderr, "Couldn't open `%s'\n", output_file); + exit(1); + } + if(!quiet) + printf("Writing `%s' ", output_file);@# + + write_pre(); + write_data(); + write_post(); + fclose(out);@# + + if(!quiet) + printf("\n"); + } + else + write_data(); + } + + +@ +The preamble has two bytes at the very beginning, |PRE| and |GF_ID|. |PRE| +starts the preamble, and |GF_ID| is the Generic Font Identity Byte. The next +bytes are a string in Pascal format containing a header, the date, and the +time. Strings in Pascal format start with the length of the string and have +no terminating NULL byte. + +@d GF_ID 131 +@d PRE 247@# + +@d header " hbf2gf output " + +@<Prototypes@>= +void write_pre(void); + + +@ +@s tm int + +@c +void write_pre(void) + {char out_s[40], s[20]; + time_t secs_now; + struct tm *time_now; + + + strcpy(out_s, header);@# + + secs_now = time(NULL); /* system date and time */ + time_now = localtime(&secs_now); + strftime(s, 20, "%Y.%m.%d:%H.%M", time_now); + strcat(out_s, s);@# + + fputc(PRE, out); + fputc(GF_ID, out); + fputc(strlen(out_s), out); + fputs(out_s, out); + } + + +@ +|write_data()| produces the middle part of the \.{GF} file. It first sets +|char_adr_p| equal to the address of |char_adr[]| which will contain file +offsets of the compressed characters. + +|input_size_x| and |input_size_y| reflect the original dimensions of the +bitmap font, |pk_output_size_x| and |pk_output_size_y| contain the width and +height of the output character box (in pixels), |pk_offset_x| and +|pk_offset_y| define the baseline of the font. The same names starting with +`\\{tfm\_}' instead of `\\{pk\_}' are used for \.{TFM} files (values are +multiples of design size). |mag_x| and |mag_y| hold the scaling factors +which are needed to reach |design_size|. |slant| defines the slant ($\Delta +x / \Delta y$), |target_size_x| and |target_size_y| will be the final +dimensions; |magstep_x = target_size_x / design_size| is \TeX's +\.{\\magstep}. + +The \CEE/ standard specifies that all global values will be automatically +set to~|0| if no initialization value is given. + +@<Global...@>= +long char_adr[256]; +long *char_adr_p;@# + +int pk_offset_x; + /* horizontal offset (increase character width a bit; will be applied on + both the left and the right side) */ +double tfm_offset_x; +int pk_offset_y; + /* vertical offset (must be configured to desired font size) */ +double tfm_offset_y;@# + +int input_size_x; +int input_size_y; +const char *font_encoding; /* taken from the HBF file */ +int pk_width; /* without slant */ +int pk_output_size_x; + /* the output character box dimensions without offsets */ +double tfm_output_size_x; +int pk_output_size_y; +double tfm_output_size_y;@# + +double design_size = 10.0; /* in points */ +double target_size_x; /* in points */ +double target_size_y; +double magstep_x; +double magstep_y; +double slant; +int rotation;@# + +double mag_x; /* horizontal and vertical magnification values */ +double mag_y;@# + +int empty_char; /* a flag whether the character does not exist or is empty */ +int last_char; /* the last valid character in a \.{GF} file */@# + +int dot_count; /* this counts the processed characters; + every ten characters a dot is output to the screen */ + + +@ +@<Prototypes@>= +void write_data(void); + + +@ +@c +void write_data(void) + {dot_count = 0; + char_adr_p = char_adr;@# + + for(last_char = 0; (last_char < 256) && !end_of_file; last_char++) + @<Write character@>@; + } + + +@ +The code in this section saves the current file position first and calls +|make_pixel_array()|, which expands and scales the character bitmap. + +|BOC| (and |BOC1|), the Begin Of Character command byte, must be followed by +the character code and the dimensions of the character as explained in +``\mf---the program'' (corrected by vertical and horizontal offsets). + +|write_coding()| compresses and outputs the bitmap; |EOC| (End Of Character) +finishes the current character. + +@d BOC 67 +@d BOC1 68 /* simplified version of |BOC| */ +@d EOC 69 + +@<Write character@>= + {if(dot_count++ % 10 == 0) /* a progress report for impatient users */ + if(pk_files && !quiet) + {printf("."); + fflush(stdout); + }@# + + empty_char = FALSE; + make_pixel_array(); + if(end_of_file) + return;@# + + if(pk_files) + {*char_adr_p = ftell(out); + char_adr_p++;@# + + if(empty_char) + {fputc(BOC1, out); + fputc((unsigned char)last_char, out); + fputc(0, out); + fputc(0, out); + fputc(0, out); + fputc(0, out); + fputc(EOC, out); + } + else + {fputc(BOC, out); + fputl(last_char, out); + fputl(-1L, out); + fputl(pk_offset_x, out); + fputl(pk_output_size_x + pk_offset_x, out); + fputl(pk_offset_y, out); + fputl(pk_output_size_y + pk_offset_y, out);@# + + write_coding();@# + + fputc(EOC, out); + } + } + } + + +@ +The current \.{GF} file will be completed with data written by +|write_post()|. The end consists of three sections: ``special'', ``post'', +and ``postpost''. The first contains material not used by \TeX\ itself but +which can be used by other programs like \.{GFtoDVI} or for documentary +purposes (|coding[]| and |comment[]|). The second describes the font as a +whole, and the last marks the end of the file. + +|pk_total_min_x| up to |pk_total_max_y| define the greatest bounding box of +this file (including offsets); the horizontal character escapement after +drawing the character is |pk_dx|. |tfm_width| is the width in multiples of +the design size ignoring the target size. + +@d _2_16 65536.0 /* $2^{16}$ */ +@d _2_20 1048576.0 /* $2^{20}$ */ + +@<Global...@>= +char coding[STRING_LENGTH + 1]; /* a comment describing the font encoding */ +char comment[STRING_LENGTH + 1]; /* a comment describing the font */@# + +unsigned long checksum;@# + +long pk_total_min_x; +long pk_total_max_x; +long pk_total_min_y; +long pk_total_max_y;@# + +int dpi_x; /* printer resolution */ +int dpi_y; +double ppp_x; /* pixels per point */ +double ppp_y; + + +@ +To clarify the meaning of these values see the sections about the metrics +and configuration file also. + +\TeX\ defines that 72.27~points are exactly 1~inch. + +@<Prototypes@>= +void write_post(void); + + +@ +@c +void write_post(void) + {long special_adr; + long post_adr;@# + + long designsize = design_size * _2_20; /* design size $* 2^{20}$ */@# + + int pk_dx; + long tfm_width;@# + + int i; + long temp; + + + ppp_x = dpi_x / 72.27 * magstep_x; + ppp_y = dpi_y / 72.27 * magstep_y;@# + + pk_total_min_x = pk_offset_x; + pk_total_max_x = pk_output_size_x + 2 * pk_offset_x; + pk_total_min_y = pk_offset_y; + pk_total_max_y = pk_output_size_y + pk_offset_y;@# + + pk_dx = pk_width + 2 * pk_offset_x; /* no slant */ + tfm_width = (tfm_output_size_x + 2 * tfm_offset_x) * _2_20; + /* width in multiples of design size $* 2^{20}$ */@# + + @<Special section@>@; + @<Post section@>@; + @<Postpost section@>@; + } + + +@ +\.{XXXn} will be followed by n~bytes representing the length of a string +which follows immediately. |YYY| is a 32~bit integer which is normally +connected with the preceding string (but not used here). |special_adr| +contains the address of the ``special section''. All items here are +optional. + +@d XXX1 239 /* these are all special command bytes */ +@d XXX2 240 /* not used */ +@d XXX3 241 /* not used */ +@d XXX4 242 /* not used */@# + +@d YYY 243 /* not used */ + +@<Special section@>= + special_adr = ftell(out);@# + + if(*coding) + {fputc(XXX1, out); /* |XXX1| implies a string length |< 256| */ + fputc(strlen(coding), out); + fputs(coding, out); + }@# + + if(*comment) + {fputc(XXX1, out); + fputc(strlen(comment), out); + fputs(comment, out); + } + + +@ +All character offsets collected in |char_adr| will be written to the output +file. |fputl()| writes a 32~bit integer into a file. + +|CHAR_LOC0| (and |CHAR_LOC|) is the first byte of a character locator +(i.e., offset, character code, and width information). |POST| starts the +postamble, and |post_adr| points to the beginning byte of the postamble. + +@d POST 248@# + +@d CHAR_LOC 245 +@d CHAR_LOC0 246 /* simplified version of |CHAR_LOC| */ + +@<Post section@>= + post_adr = ftell(out); + fputc(POST, out); + fputl(special_adr, out);@# + + fputl(designsize, out); + fputl(checksum, out); + fputl(ppp_x * _2_16, out); + fputl(ppp_y * _2_16, out); + fputl(pk_total_min_x, out); + fputl(pk_total_max_x, out); + fputl(pk_total_min_y, out); + fputl(pk_total_max_y, out);@# + + char_adr_p = char_adr;@# + + if(pk_dx < 256) + {for(i = 0; i < last_char; i++) /* the character locators */ + {fputc(CHAR_LOC0, out); + fputc(i, out); + fputc(pk_dx, out); + fputl(tfm_width, out); + fputl(*char_adr_p++, out); + } + } + else /* will only happen if |MAX_CHAR_SIZE >= 256| */ + {for(i = 0; i < last_char; i++) + {fputc(CHAR_LOC, out); + fputc(i, out); + fputl(pk_dx * _2_16, out); + fputl(0, out); + fputl(tfm_width, out); + fputl(*char_adr_p++, out); + } + } + + +@ +|POSTPOST| starts the section after the postamble. To get all information in +a \.{GF} file, you must start here. The very last bytes of the file have +the value |POSTPOST_ID| (the file is filled with at least 4 of these bytes +until a file length of a multiple of~4 is reached). Going backwards a +|GF_ID| will be next, then comes the address of the postamble section. + +Jumping to the postamble, a |POST| byte comes first, then the address of +the special section, and afterwards all character offsets. These offsets and +addresses describe the whole file. + +@d POSTPOST 249 +@d POSTPOST_ID 223 + +@<Postpost section@>= + fputc(POSTPOST, out); + fputl(post_adr, out); + fputc(GF_ID, out); + temp = ftell(out); + i = (int)(temp % 4) + 4; + while(i--) + fputc(POSTPOST_ID, out); + + +@ +\TeX\ wants the most significant byte first. + +@<Prototypes@>= +void fputl(long, FILE *); + + +@ +@c +void fputl(long num, FILE *f) + {fputc(num >> 24, f); + fputc(num >> 16, f); + fputc(num >> 8, f); + fputc(num, f); + } + + +@ +|make_pixel_array()| scales a character into the array |out_char[]| where +each \\{byte} represents one pixel, contrary to the input file where each +\\{bit} is used to store the character bitmap. |BLACK| indicates a black +pixel. + +The scaling routine was modeled after the program \.{pnmscale} of the +\.{pbmplus} package. \.{pbmplus} was designed to handle arbitrary pictures, +and bitmaps are only a special case of a graymap with values from~0 for +white up to |PIXEL_MAXVAL = 255| for black. + +If |EOF| is encountered, |end_of_file| is set and the function returns +immediately. + +@d BLACK 1 +@d WHITE 0@# + +@d PIXEL_MAXVAL 255 +@d SCALE 4096 +@d HALFSCALE 2048@# + +@d MAX_CHAR_SIZE 1023 + +@<Global...@>= +HBF_CHAR code; +const unsigned char *bitmap; + /* a proper input bitmap array will be allocated by the HBF API */ +const unsigned char *bP;@# + +unsigned char out_char[MAX_CHAR_SIZE * MAX_CHAR_SIZE + 1]; + /* the output bitmap array */ +unsigned char *out_char_p;@# + +unsigned char pixelrow[MAX_CHAR_SIZE]; +unsigned char temp_pixelrow[MAX_CHAR_SIZE]; +unsigned char new_pixelrow[MAX_CHAR_SIZE + 1]; + /* we need space to append a white pixel */@# +int curr_row; /* for |read_row()| if we access the glyph rotated */ + +long grayrow[MAX_CHAR_SIZE];@# + +long s_mag_x, s_mag_y, s_slant; + + +@ +We need to initialize the |grayrow[]| array together with some other +variables. + +Two steps are necessary to compute the |code| if we are in the \mf-like +mode. Assuming that we search the code \.{0xXXYY}, we first set |code| to +the value \.{0xXXAA}, where \.{0xAA} is equal to |min_2_byte| (getting +|offset| as the number of remaining characters to reach the first character +in our given subfont), then we increment |code| (and decrement |offset|) +until |offset| equals~0. + +@<Initialize variables@>= + {int col, offset; + + if(rotation) + {int tmp; + + + tmp = input_size_x; + input_size_x = input_size_y; + input_size_y = tmp; + }@# + + if(mf_like) + {target_size_x = design_size * (x_resolution / dpi_x); + target_size_y = design_size * (x_resolution * y_scale / dpi_y); + } + else + target_size_x = target_size_y = design_size; + magstep_x = target_size_x / design_size; + magstep_y = target_size_y / design_size;@# + + pk_offset_x = offset_x * magstep_x + 0.5; + pk_offset_y = offset_y * magstep_y + 0.5; + tfm_offset_x = offset_x / (dpi_x / 72.27) / design_size; + tfm_offset_y = offset_y / (dpi_y / 72.27) / design_size;@# + + pk_width = input_size_x * mag_x * magstep_x + 0.5; /* without slant */ + pk_output_size_x = input_size_x * mag_x * magstep_x + + input_size_y * mag_y * magstep_y * slant + 0.5; + pk_output_size_y = input_size_y * mag_y * magstep_y + 0.5; + tfm_output_size_x = input_size_x * mag_x / + (dpi_x / 72.27) / design_size; + tfm_output_size_y = input_size_y * mag_y / + (dpi_y / 72.27) / design_size; + if(pk_output_size_x > MAX_CHAR_SIZE) + {fprintf(stderr, "Output character box width too big\n"); + exit(1); + } + if(pk_output_size_y > MAX_CHAR_SIZE) + {fprintf(stderr, "Output character box height too big\n"); + exit(1); + }@# + + for(col = 0; col < input_size_x; ++col) + grayrow[col] = HALFSCALE;@# + + if(!mf_like) + code = (min_char & 0xFF00) + min_2_byte; + else + {if((file_number < (unicode ? 0 : 1)) || (file_number >= 0x100)) + {fprintf(stderr, "Invalid subfile number\n"); + exit(1); + }@# + + if(unicode) + {offset = 0; + code = file_number * 0x100; + } + else + {offset = (file_number - 1) * 256 % nmb_2_bytes; + code = (min_char & 0xFF00) + min_2_byte + + (file_number - 1) * 256 / nmb_2_bytes * 0x100; + }@# + + while(offset--) + while(!b2_codes[code++ & 0xFF]) + /* eliminate invalid |b2_codes| */ + ;@# + + if(code > max_char) + {fprintf(stderr, "Invalid subfile number\n"); + exit(1); + } + } + + s_mag_x = mag_x * magstep_x * SCALE; + s_mag_y = mag_y * magstep_y * SCALE; + s_slant = slant * SCALE; + } + + +@ +All arrays of the \\{pixelrow} family contain gray values. While scaling +with non-integer values a pixel of the input bitmap will normally not align +with the pixel grid of the output bitmap (geometrically spoken). In this +case we first compute the fractions of input pixel rows scaled vertically +and add the corresponding gray values until a temporary row is produced. +Then we repeat this procedure horizontally pixel by pixel and write the +result into an output array. + + +@<Prototypes@>= +void make_pixel_array(void); + + +@ +@c +void make_pixel_array(void) + {unsigned char *prP; + unsigned char *temp_prP; + unsigned char *new_prP; + long *grP;@# + + register unsigned char *xP; + register unsigned char *nxP;@# + + register int row, col; + int rows_read = 0; + register int need_to_read_row = 1;@# + + long frac_row_to_fill = SCALE; + long frac_row_left = s_mag_y;@# + + int no_code = FALSE; + + + prP = pixelrow; + temp_prP = temp_pixelrow; + new_prP = new_pixelrow; + grP = grayrow; + out_char_p = out_char; /* will be increased by |write_row()| */@# + +again: + if(b2_codes[code & 0xFF]) /* a valid second byte? */ + {if(pk_files) + {bitmap = hbfGetBitmap(hbf, code); + bP = bitmap; + /* will be increased by |read_row()| */@# + + if(!bitmap) + empty_char = TRUE; + else + @<Scale row by row@>@; + } + } + else + no_code = TRUE;@# + + if((code & 0xFF) == max_2_byte) + code += 0xFF - (max_2_byte - min_2_byte); /* go to next plane */ + if(code >= max_char) + {end_of_file = TRUE; + return; + }@# + + code++;@# + + if(no_code) + {no_code = FALSE; + goto again; + } + } + + +@ +@<Scale row by row@>= + {if(pk_output_size_y == input_size_y) /* shortcut Y~scaling if possible */ + temp_prP = prP;@# + + curr_row = input_size_y - 1; /* only needed for rotated glyphs */ + for(row = 0; row < pk_output_size_y; ++row) + {@<Scale Y from |pixelrow[]| into |temp_pixelrow[]|@>@; + @<Scale X from |temp_pixelrow[]| into |new_pixelrow[]| + and write it into |out_char[]|@>@; + } + } + + +@ +@<Scale Y from |pixelrow[]| into |temp_pixelrow[]|@>= + if(pk_output_size_y == input_size_y) + /* shortcut Y~scaling if possible */ + read_row(prP); + else + {while(frac_row_left < frac_row_to_fill) + {if(need_to_read_row) + if(rows_read < input_size_y) + {read_row(prP); + ++rows_read; + }@# + + for(col = 0, xP = prP; col < input_size_x; ++col, ++xP) + grP[col] += frac_row_left * (*xP);@# + + frac_row_to_fill -= frac_row_left; + frac_row_left = s_mag_y; + need_to_read_row = 1; + }@# + + @<Produce a temporary row@>@; + } + + +@ +Now |frac_row_left >= frac_row_to_fill|, so we can produce a row. + +@<Produce a temporary row@>= + if(need_to_read_row) + if(rows_read < input_size_y) + {read_row(prP); + ++rows_read; + need_to_read_row = 0; + }@# + + for(col = 0, xP = prP, nxP = temp_prP; + col < input_size_x; ++col, ++xP, ++nxP) + {register long g; + + + g = grP[col] + frac_row_to_fill * (*xP); + g /= SCALE; + if(g > PIXEL_MAXVAL) + g = PIXEL_MAXVAL;@# + + *nxP = g; + grP[col] = HALFSCALE; + }@# + + frac_row_left -= frac_row_to_fill; + if(frac_row_left == 0) + {frac_row_left = s_mag_y; + need_to_read_row = 1; + } + frac_row_to_fill = SCALE; + + +@ +To implement the slant we move the starting point |nxP| to the right +according to the corresponding |y|~value. To simplify life only positive +shift values are allowed. + +We always append a white pixel to avoid artefacts at the end of the line +produced by the last line. This rule sets the second condition that the +slant must not be greater than~|1|---such a large slant would be unusable +anyway for typesetting purposes. + +@<Scale X from |temp_pixelrow[]| into |new_pixelrow[]| + and write it into |out_char[]|@>= + if(pk_width == input_size_x && s_slant == 0) + /* shortcut X~scaling if possible */ + write_row(temp_prP); + else + {register long g = HALFSCALE; + register long frac_col_to_fill = SCALE; + register long frac_col_left; + register int need_col = 0; + + + nxP = new_prP;@# + + frac_col_left = (pk_output_size_y - row) * s_slant; + while(frac_col_left >= frac_col_to_fill) + {*(nxP++) = 0; + frac_col_left -= frac_col_to_fill; + }@# + + if(frac_col_left > 0) + frac_col_to_fill -= frac_col_left;@# + + for(col = 0, xP = temp_prP; col < input_size_x; ++col, ++xP) + {frac_col_left = s_mag_x; + while(frac_col_left >= frac_col_to_fill) + {if(need_col) + {++nxP; + g = HALFSCALE; + }@# + + g += frac_col_to_fill * (*xP); + g /= SCALE; + if(g > PIXEL_MAXVAL) + g = PIXEL_MAXVAL;@# + + *nxP = g; + frac_col_left -= frac_col_to_fill; + frac_col_to_fill = SCALE; + need_col = 1; + }@# + + if(frac_col_left > 0) + {if(need_col) + {++nxP; + g = HALFSCALE; + need_col = 0; + }@# + + g += frac_col_left * (*xP); + frac_col_to_fill -= frac_col_left; + } + }@# + + @<Write out a row@>@; + } + + +@ +@<Write out a row@>= + if(frac_col_to_fill > 0) + {--xP; + g += frac_col_to_fill * (*xP); + }@# + + if(!need_col) + {g /= SCALE; + if(g > PIXEL_MAXVAL) + g = PIXEL_MAXVAL; + *nxP = g; + }@# + + *(++nxP) = 0; /* append a blank pixel */@# + + write_row(new_prP); + + +@ +|read_row()| reads a row from |bitmap[]| and converts it into a graymap row. +If the |rotation| flag has been set, we get the proper column instead (note +that in this case |input_size_x| already reflects the width of the rotated +glyph). + +@<Prototypes@>= +#ifdef __GNUC__ +__inline__ +#endif +void read_row(unsigned char *); + + +@ +@c +#ifdef __GNUC__ +__inline__ +#endif +void read_row(unsigned char *pixelrow) + {register int col, bitshift, offset; + register unsigned char *xP; + register unsigned char item = 0; + + if(rotation) + {bitshift = 7 - (curr_row % 8); + offset = (input_size_y + 7) / 8; + bP = bitmap + curr_row / 8; + for(col = 0, xP = pixelrow; col < input_size_x; ++col, ++xP) + {*xP = ((*bP >> bitshift) & 1) == 1 ? PIXEL_MAXVAL : 0; + bP += offset; + } + curr_row--; + } + else + {bitshift = -1; + for(col = 0, xP = pixelrow; col < input_size_x; ++col, ++xP) + {if(bitshift == -1) + {item = *(bP++); /* increase input bitmap pointer */ + bitshift = 7; + } + *xP = ((item >> bitshift) & 1) == 1 ? PIXEL_MAXVAL : 0; + --bitshift; + } + } + } + + +@ +|write_row()| converts the graymap back into a bitmap using a simple +threshold. + +@<Global...@>= +int threshold = 128; + + +@ +@<Prototypes@>= +#ifdef __GNUC__ +__inline__ +#endif +void write_row(unsigned char *); + + +@ +@c +#ifdef __GNUC__ +__inline__ +#endif +void write_row(unsigned char *pixelrow) + {register int col; + register unsigned char *xP; + + for(col = 0, xP = pixelrow; col < pk_output_size_x; ++col, ++xP) + *(out_char_p++) = (*xP >= threshold) ? 1 : 0; + /* increase output bitmap pointer */ + } + + +@ +Now comes the most interesting routine. The pixel array will be compressed +in sequences of black and white pixels. + +|SKIP0|, |SKIP1|, and |SKIP2| indicate how many blank lines will be skipped. +|PAINT_(x)| means that the next x~pixels will have the same color, then the +color changes. |NEW_ROW_(x)| is the first black pixel in the next row. + +An example: the pixel sequence 111100011001 [new row] 000111011110 will be +output as 4 3 2 2 1 77 3 1 4 1. + +Commands with an ending~`n' in its name indicate that the next n~bytes +should be read as the counter. Example: |SKIP1|~26 means `skip the next +26~rows'. + +For further details please refer to ``\mf---the program''. + +@d PAINT_(x) (x) /* $0 \le x \le 63$ */ +@d PAINT1 64 +@d PAINT2 65 +@d PAINT3 66 /* not used */@# + +@d SKIP0 70 +@d SKIP1 71 +@d SKIP2 72 +@d SKIP3 73 /* not used */@# + +@d NEW_ROW_(x) ((x) + 74) /* $0 \le x \le 164$ */@# + +@d NOOP 244 /* not used */ + +@<Prototypes@>= +void write_coding(void); + + +@ +The |goto start| instruction causes some compilers to complain about +``Unreachable code $\ldots$'' or something similar. + +@c +void write_coding(void) + {register int count, skip; + register unsigned char paint; + register int x, y; + register unsigned char *cp; + + x = 0; + y = 0; + cp = out_char + y * pk_output_size_x + x; + count = skip = 0; + paint = WHITE; + goto start;@# + + while (y < pk_output_size_y) + {@<Search blank lines@>@; +start: + @<Process rest of line@>@; + y++; + } + }@# + + +@ +@<Search blank lines@>= + count = 0; + x = 0; + cp = out_char + y * pk_output_size_x + x;@# + + while(x < pk_output_size_x) + {if(*cp == paint) + count++; + else + {if(skip == 0) + {if(count <= 164) + fputc(NEW_ROW_(count), out); + else + {fputc(SKIP0, out);@# + + if(count < 256) + {fputc(PAINT1, out); + fputc(count, out); + } + else + {fputc(PAINT2, out); + fputc(count >> 8, out); + fputc(count & 0xFF, out); + } + } + } + else + {if(skip == 1) + fputc(SKIP0, out); + else + {if(skip < 256) + {fputc(SKIP1, out); + fputc(skip, out); + } + else + {fputc(SKIP2, out); + fputc(skip >> 8, out); + fputc(skip & 0xFF, out); + } + } + skip = 0; + if(count < 64) + fputc(PAINT_(count), out); + else if(count < 256) + {fputc(PAINT1, out); + fputc(count, out); + } + else + {fputc(PAINT2, out); + fputc(count >> 8, out); + fputc(count & 0xFF, out); + } + } + count = 0; + paint = BLACK; + break; + } + x++; + cp++; + } + if(x >= pk_output_size_x) + {skip++; + y++; + continue; + } + + +@ +@<Process rest of line@>= + while(x < pk_output_size_x) + {if(*cp == paint) + count++; + else + {if(count < 64) + fputc(PAINT_(count), out); + else if(count < 256) + {fputc(PAINT1, out); + fputc(count, out); + } + else + {fputc(PAINT2, out); + fputc(count >> 8, out); + fputc(count & 0xFF, out); + } + count = 1; + paint = BLACK - paint; + } + x++; + cp++; + } + if(paint == BLACK) + {if(count < 64) + fputc(PAINT_(count), out); + else if(count < 256) + {fputc(PAINT1, out); + fputc(count, out); + } + else + {fputc(PAINT2, out); + fputc(count >> 8, out); + fputc(count & 0xFF, out); + } + paint = WHITE; + } + + + +@* The font metrics file. +This routine creates one \.{PL} file with the font properties. None of the +\TeX\ font dimensions are needed because you never will use CJK fonts +directly, and intercharacter stretching is handled by the \\{CJK} macro +\.{\\CJKglue}. (Other packages may define similar commands.) + +The name of the \.{PL} file will contain the running two digits in +\mf-like mode only. + +It makes sense \\{not} to compute the check sum automatically for two +reasons. Firstly, since \TeX's checksum algorithm is based on the character +width, the number of valid characters, and the designsize, there is a much +higher chance that two subfonts from different HBF fonts have the same check +sum than it is for ordinary fonts, because all characters have the same +width, usually 256~characters in a subfont, and very often the same design +size. Secondly, and this is more important, we create just one +\.{TFM} file for all subfonts regardless of the real number of characters +in a particular subfont. + +To have an identification string in the \.{TFM} file, we split it into +single bytes and use the \.{HEADER} command repeatedly. + +@<Prototypes@>= +void write_pl(void); + + +@ +@c +void write_pl(void) + {int i, pos; + char output_file[FILE_NAME_LENGTH + 1]; + long t, sc; + char *s; + char tfm_header[] = "Created by hbf2gf"; + + file_number--; /* for \mf-like mode */@# + + if(mf_like) + {if(unicode) + sprintf(output_file, "%s%02x.pl", output_name, file_number); + else + sprintf(output_file, "%s%02i.pl", output_name, file_number); + } + else + sprintf(output_file, "%s.pl", output_name);@# + + if(!(out = fopen(output_file, WRITE_TXT))) + {fprintf(stderr, "Couldn't open `%s'\n", output_file); + exit(1); + } + if(!quiet) + printf("\nWriting `%s'\n", output_file);@# + + fprintf(out,@/ + "\n(FAMILY %s%d)"@/ + "\n(CODINGSCHEME CJK-%s)", + output_name, file_number, font_encoding);@# + + fprintf(out,@/ + "\n(DESIGNSIZE R %.6f)"@/ + "\n(COMMENT DESIGNSIZE IS IN POINTS)"@/ + "\n(COMMENT OTHER SIZES ARE MULTIPLES OF DESIGNSIZE)"@/ + "\n(CHECKSUM O %lo)"@/ + "\n(FONTDIMEN"@/ + "\n (SLANT R %.6f)"@/ + "\n (SPACE R 0.0)"@/ + "\n (STRETCH R 0.0)"@/ + "\n (SHRINK R 0.0)"@/ + "\n (XHEIGHT R 1.0)"@/ + "\n (QUAD R 1.0)"@/ + "\n (EXTRASPACE R 0.0)"@/ + "\n )", design_size, checksum, slant);@# + + s = tfm_header; + i = strlen(s); + t = ((long)i) << 24; + sc = 16; + pos = 18;@# + + fprintf(out, "\n"); + while(i > 0) + {t |= ((long)(*(unsigned char *)s++)) << sc; + sc -= 8; + if(sc < 0) + {fprintf(out, "\n(HEADER D %d O %lo)", pos, t); + t = 0; + sc = 24; + pos++; + } + i--; + } + if(t) + fprintf(out, "\n(HEADER D %d O %lo)", pos, t); + fprintf(out, "\n");@# + + for(i = 0; i < 256; i++) + {fprintf(out,@/ + "\n(CHARACTER O %o"@/ + "\n (CHARWD R %.6f)"@/ + "\n (CHARHT R %.6f)"@/ + "\n (CHARDP R %.6f)"@/ + "\n (CHARIC R %.6f)"@/ + "\n )",@/ + i, + tfm_output_size_x + 2 * tfm_offset_x, + tfm_output_size_y + tfm_offset_y, + -tfm_offset_y, + slant * (tfm_output_size_y + tfm_offset_y)); + }@# + + fclose(out); + } + + + +@* The extended virtual font file for \Om. +The following is very similar to |write_pl()|; we simply map the glyphs +of the subfonts back to the original encoding positions. + +@<Prototypes@>= +void write_ovp(void); + + +@ +@c +void write_ovp(void) + {int c, i, nmb_subfonts, remainder, count, pos; + char output_file[FILE_NAME_LENGTH + 1]; + long t, sc; + char *s; + char ofm_header[] = "Created by hbf2gf"; + + nmb_subfonts = ((max_char - (min_char & 0xFF00)) / 256 * nmb_2_bytes) + / 256 + 1; + remainder = ((max_char - (min_char & 0xFF00)) / 256 * nmb_2_bytes) + % 256;@# + + /* correction for the last incomplete second byte range */ + for(count = 0; count < (max_char & 0xFF); count++) + if(b2_codes[count]) + remainder++; + if(remainder >= 256) + nmb_subfonts++;@# + + sprintf(output_file, "%s.ovp", output_name);@# + + if(!(out = fopen(output_file, WRITE_TXT))) + {fprintf(stderr, "Couldn't open `%s'\n", output_file); + exit(1); + } + if(!quiet) + printf("\nWriting `%s'\n", output_file);@# + + fprintf(out,@/ + "\n(VTITLE Omega virtual font created by hbf2gf)"@/ + "\n(DESIGNSIZE R %.6f)"@/ + "\n(COMMENT DESIGNSIZE IS IN POINTS)"@/ + "\n(COMMENT OTHER SIZES ARE MULTIPLES OF DESIGNSIZE)"@/ + "\n(CHECKSUM O %lo)"@/ + "\n(FONTDIMEN"@/ + "\n (SLANT R %.6f)"@/ + "\n (SPACE R 0.0)"@/ + "\n (STRETCH R 0.0)"@/ + "\n (SHRINK R 0.0)"@/ + "\n (XHEIGHT R 1.0)"@/ + "\n (QUAD R 1.0)"@/ + "\n (EXTRASPACE R 0.0)"@/ + "\n )", design_size, checksum, slant);@# + + s = ofm_header; + i = strlen(s); + t = ((long)i) << 24; + sc = 16; + pos = 18;@# + + fprintf(out, "\n"); + while(i > 0) + {t |= ((long)(*(unsigned char *)s++)) << sc; + sc -= 8; + if(sc < 0) + {fprintf(out, "\n(HEADER D %d O %lo)", pos, t); + t = 0; + sc = 24; + pos++; + } + i--; + } + if(t) + fprintf(out, "\n(HEADER D %d O %lo)", pos, t); + fprintf(out, "\n");@# + + for(i = 0; i < nmb_subfonts; i++) + {fprintf(out,@/ + "\n(MAPFONT D %i"@/ + "\n (FONTNAME %s%02i)"@/ + "\n (FONTCHECKSUM O %lo)"@/ + "\n (FONTAT R 1.0)"@/ + "\n (FONTDSIZE R %.6f)"@/ + "\n )", i, output_name, i + 1, checksum, design_size); + }@# + + for(c = min_char, i = 0, count = 0; c <= max_char; c++) + {if(b2_codes[c & 0xFF] == VALID_SUBCODE) + {fprintf(out,@/ + "\n(CHARACTER O %o"@/ + "\n (CHARWD R %.6f)"@/ + "\n (CHARHT R %.6f)"@/ + "\n (CHARDP R %.6f)"@/ + "\n (CHARIC R %.6f)"@/ + "\n (MAP"@/ + "\n (SELECTFONT D %i)"@/ + "\n (SETCHAR O %o)"@/ + "\n )"@/ + "\n )",@/ + c, + tfm_output_size_x + 2 * tfm_offset_x, + tfm_output_size_y + tfm_offset_y, + -tfm_offset_y, + slant * (tfm_output_size_y + tfm_offset_y), + i, + count);@# + + count++; + if(count == 256) + {count = 0; + i++; + } + } + else + continue; + }@# + + fclose(out); + } + + + +@* The job file. +This routine is the most system specific one. If your operating system needs +a different outline, make appropriate changes here. + +You have to call this batch file after \.{hbf2gf} has finished (if not in +\mf-like mode). It will transform the \.{GF} files into \.{PK} files and +delete the now unnecessary \.{GF} files, then transform the \.{PL} file into +a \.{TFM} file and copy it |nmb_files| times. The name of the job file is +|output_name|. + +@d EXTENSION_LENGTH 8 /* the maximal length of a file extension */@# + +@d GFTOPK_NAME "gftopk" +@d PLTOTF_NAME "pltotf" +@d OVP2OVF_NAME "ovp2ovf" + +@<Global...@>= +char job_extension[EXTENSION_LENGTH + 1]; +char rm_command[STRING_LENGTH + 1]; +char cp_command[STRING_LENGTH + 1]; +char pk_directory[STRING_LENGTH + 1]; +char tfm_directory[STRING_LENGTH + 1];@# + +int ofm_file = FALSE; + + +@ +@<Prototypes@>= +void write_job(void); + + +@ +@c +void write_job(void) + {FILE *out; + int i, j; + char buffer[FILE_NAME_LENGTH + 1]; + + + strcpy(buffer, output_name); + strcat(buffer, job_extension); + if(!(out = fopen(buffer, WRITE_TXT))) + {fprintf(stderr, "Couldn't open `%s'\n", buffer); + exit(1); + } + if(!quiet) + printf("\nWriting `%s'\n", buffer);@# + + if(pk_files) + {if(unicode) + {for(i = (min_char >> 8), j = 0; j < nmb_files; i++, j++) + fprintf(out,@/ + "%s %s%02x.gf %s%s%02x.%.0ipk\n"@/ + "%s %s%02x.gf\n",@/ + GFTOPK_NAME, output_name, i,@/ + pk_directory, output_name, i, + long_extension ? (int)(dpi_x * magstep_x + 0.5) : 0,@/ + rm_command, output_name, i); + } + else + {for(i = 1; i <= nmb_files; i++) + fprintf(out,@/ + "%s %s%02i.gf %s%s%02i.%.0ipk\n"@/ + "%s %s%02i.gf\n",@/ + GFTOPK_NAME, output_name, i,@/ + pk_directory, output_name, i, + long_extension ? (int)(dpi_x * magstep_x + 0.5) : 0,@/ + rm_command, output_name, i); + } + }@# + + if(tfm_files) + {fprintf(out,@/ + "\n"@/ + "%s %s.pl %s.tfm\n"@/ + "%s %s.pl\n"@/ + "\n",@/ + PLTOTF_NAME, output_name, output_name,@/ + rm_command, output_name);@# + + if(unicode) + {for(i = (min_char >> 8), j = 0; j < nmb_files; i++, j++) + fprintf(out,@/ + "%s %s.tfm %s%s%02x.tfm\n",@/ + cp_command, output_name, + tfm_directory, output_name, i); + } + else + {for(i = 1; i <= nmb_files; i++) + fprintf(out,@/ + "%s %s.tfm %s%s%02i.tfm\n",@/ + cp_command, output_name, + tfm_directory, output_name, i); + }@# + + fprintf(out,@/ + "\n"@/ + "%s %s.tfm",@/ + rm_command, output_name); + }@# + + if(ofm_file) + {fprintf(out,@/ + "\n"@/ + "%s %s.ovp %s.ovf %s.ofm\n"@/ + "%s %s.ovp\n"@/ + "\n",@/ + OVP2OVF_NAME, output_name, output_name, output_name,@/ + rm_command, output_name); + }@# + + fclose(out); + } + + + +@* The configuration file. +Here is a list with all necessary keywords (and parameters): +\medskip +\halign{\quad\.{#}\hfil&\quad#\hfil\cr + hbf\_header & the HBF header file name of the input font(s). \cr + output\_name & the name stem of the output files. \cr + & Should be equal to the name of the configuration file + in most cases.\cr + & A running two digit decimal number starting with + \.{01} will be appended. \cr + & (For Unicode fonts see the keyword \.{unicode} + below.) \cr + } +\bigskip +And now all optional keywords: +\medskip +\halign{\quad\.{#}\hfil&\quad#\hfil\cr + x\_offset & increases the character width. \cr + & Will be applied on both sides; \cr + & default is the value given in the HBF header + (\.{HBF\_BITMAP\_BOUNDING\_BOX}) \cr + & scaled to \\{design\/}size (in pixels). \cr + y\_offset & shifts all characters up or down; \cr + & default is the value given in the HBF header + (\.{HBF\_BITMAP\_BOUNDING\_BOX}) \cr + & scaled to \\{design\/}size (in pixels). \cr + design\_size & the design size (in points) of the font. \cr + & \.{x\_offset} and \.{y\_offset} refer to this + size. \cr + & Default is |10.0| \cr + target\_size & This command is obsolete now and will be + ignored.\cr + & \cr + slant & the slant of the font (given as $\Delta x / + \Delta y$). \cr + & Only values in the range |0 <= slant <= 1| + are allowed. \cr + & Default is |0.0| \cr + rotation & if set to `yes'. the glyphs are rotated + 90~degrees counter-clockwise. \cr + & The default offsets as given in the HBF header + will be ignored (and set to~|0|). \cr + & Default is `no'. \cr + & \cr + mag\_x & \cr + mag\_y & scaling values of the characters to reach + design size. \cr + & If only one magnification is given, x and y + values are assumed to be equal. \cr + & Default is \.{mag\_x} $=$ \.{mag\_y} $=$ |1.0| + \cr + threshold & A value between |1| and |254| defining a + threshold for converting the internal \cr + & graymap into the output bitmap; lower values + cut more pixels. \cr + & Default value is |128|. \cr + & \cr + comment & a comment describing the font; \cr + & default is none. \cr + & \cr + nmb\_fonts & the number of the fonts. \cr + & Default value is~|-1| for creating all + fonts. \cr + unicode & if `yes', a two digit hexadecimal number will + be used as a running number, \cr + & starting with the value of the first byte of + the first code range. \cr + & Default is `no'. \cr + min\_char & the minimum of the encoding range. \cr + & Specify this value if it is not identical to + the lowest code value \cr + & in the HBF file (to which it defaults). \cr + & \cr + dpi\_x & \cr + dpi\_y & the horizontal and vertical resolution (in + dpi) of the printer. \cr + & If only one resolution is given, x and y + values are assumed to be equal. \cr + & Default is |300|. \cr + checksum & a checksum to identify the \.{GF} files + with the appropriate \.{TFM} files. \cr + & The default of this 32~bit unsigned integer + is |0|. \cr + coding & a comment describing the coding scheme; \cr + & default is none. \cr + & \cr + pk\_directory & the destination directory of the + \.{PK} files; \cr + & default: none. \cr + & Attention! The batch file will not check + whether this directory exists. \cr + tfm\_directory & the destination directory of the + \.{TFM} files; \cr + & default: none. \cr + & Attention! The batch file will not check + whether this directory exists. \cr + pk\_files & whether to create \.{PK} files or not; \cr + & default is `yes'. \cr + tfm\_files & whether to create \.{TFM} files or not; \cr + & default is `yes'. \cr + ofm\_file & whether to create an \.{OFM} and an + \.{OVF} file or not; \cr + & default is `no'. \cr + long\_extension & if `yes', \.{PK} files will include the + resolution in the extension \cr + & (e.g. \.{gsso1201.300pk}). \cr + & This affects the batch file only (default is + `yes'). \cr + rm\_command & this shell command removes files; \cr + & default: `rm'. \cr + cp\_command & this shell command copies files; \cr + & default: `cp'. \cr + job\_extension & the extension of the batch file which calls + \.{GFtoPK} and \.{PLtoTF} \cr + & to convert the \.{GF} and the + \.{PL} files into \.{PK} and + \.{TFM} files; \cr + & default is none. \cr + } +\bigskip + +The searching algorithm (for the keywords) of \.{hbf2gf} is case +insensitive; it makes no difference whether you write for example \.{comment} +or \.{CommenT}. The keywords must start a line (be in the first column), and +the corresponding parameters must be on the same line with the keyword and +separated by at least one space or tabulator stop. Lines starting not with a +keyword are ignored. + +Key values \\{are} case sensitive (except \.{yes} and \.{no}). + +The default system dependent values are for \UNIX/-like operating systems; +if you use for example DOS, you must write +\medskip +\halign{\quad\.{#}\hfil&\quad\.{#}\hfil\cr + long\_extension & no \cr + rm\_command & del \cr + cp\_command & copy \cr + job\_extension & .bat \cr + } +\medskip + +Both the values |pk_output_size_x| and |pk_output_size_y| must not exceed +|MAX_CHAR_SIZE|; \.{x\_offset} and \.{y\_offset} are related to the +design size (and not to the input size). + +In \mf-like mode, one \.{GF} file and one \.{PL} file will be computed +(depending on the command line options \.{-g} and \.{-p}), taking +|x_resolution| and |y_scale| from the command line. \.{nmb\_fonts} will +always be set to~|1|; no job file will be created. + + +@ +@d PRINTER_MIN_RES_X 50 +@d PRINTER_MIN_RES_Y 50 + +@<Global...@>= +char Buffer[STRING_LENGTH + 1]; + + +@ +@<Prototypes@>= +void read_config(void); + + +@ +If |config_file| isn't found in \mf-like mode we assume that the font +isn't a HBF font at all. + +@c +void read_config(void) + {HBF_BBOX *boxp; + char *real_config_file; + + + @<Handle extension@>@;@# + + real_config_file = TeX_search_cfg_file(config_file); + if(!real_config_file) + {if(mf_like) + {if(!quiet) + printf("Couldn't find `%s'\n", config_file); + exit(2); + } + else + {fprintf(stderr, "Couldn't find `%s'\n", config_file); + exit(1); + } + }@# + + if(!(config = fopen(real_config_file, READ_TXT))) + {if(!testing) + {fprintf(stderr, "Couldn't open `%s'\n", config_file); + exit(1); + } + else /* We reach this point only if no searching library is used */ + {if(!quiet) + fprintf(stderr, "Couldn't find or open `%s'\n", config_file); + exit(2); + } + }@# + + if(testing) + {if(!quiet) + printf("%s\n", real_config_file); + exit(0); + } + + @<Necessary parameters@>@; + @<Optional parameters@>@;@# + + @<Get code range@>@; + @<Get sub code range@>@;@# + + fclose(config); + } + + +@ +Here we check whether we have to add an extension. + +@<Handle extension@>= + {int i, lastext = -1; + + for(i = 0; config_file[i]; i++) + if(config_file[i] == '.') + lastext = i; + else if (config_file[i] == '/' || + config_file[i] == ':' || + config_file[i] == '\\') + lastext = -1;@# + + if(lastext == -1) + strcat(config_file, ".cfg"); + } + + +@ +@<Necess...@>= + {char hbf_header[STRING_LENGTH + 1]; + char *real_hbf_header; + + if(!fsearch("hbf_header")) + config_error("hbf_header"); + else + strcpy(hbf_header, Buffer);@# + + real_hbf_header = TeX_search_hbf_file(hbf_header); + if(!real_hbf_header) + {fprintf(stderr, "Couldn't find `%s'\n", hbf_header); + exit(1); + }@# + + hbfDebug = 1; /* we activate error messages of the HBF API + while scanning the HBF header file */@# + + if(!(hbf = hbfOpen(real_hbf_header))) + exit(1);@# + + hbfDebug = 0;@# + + boxp = hbfBitmapBBox(hbf); + input_size_x = boxp->hbf_height; /* will be checked later for rotation */ + input_size_y = boxp->hbf_width; + font_encoding = hbfProperty(hbf, "HBF_CODE_SCHEME");@# + + if(!fsearch("output_name")) + config_error("output_name"); + else + strcpy(output_name, Buffer); + } + + +@ +@<Global...@>= +int offset_x; +int offset_y;@# + +HBF_CHAR user_min_char; +int have_min_char = FALSE; + +@ +@<Opt...@>= + {if(fsearch("nmb_files")) + nmb_files = atoi(Buffer); + if(fsearch("unicode")) + if(Buffer[0] == 'y' || Buffer[0] == 'Y') + unicode = TRUE; + if(fsearch("min_char")) + {user_min_char = strtoul(Buffer, (char **)NULL, 0); + have_min_char = TRUE; + }@# + + if(!mf_like) + {if(fsearch("pk_files")) + if(Buffer[0] == 'n' || Buffer[0] == 'N') + pk_files = FALSE; + if(fsearch("tfm_files")) + if(Buffer[0] == 'n' || Buffer[0] == 'N') + tfm_files = FALSE; + if(fsearch("ofm_file")) + if(Buffer[0] == 'y' || Buffer[0] == 'Y') + ofm_file = TRUE; + if(fsearch("long_extension")) + if(Buffer[0] == 'n' || Buffer[0] == 'N') + long_extension = FALSE; + }@# + + if(fsearch("slant")) + slant = atof(Buffer); + if(slant < 0.0 || slant > 1.0) + {fprintf(stderr, "Invalid slant\n"); + exit(1); + } + if(fsearch("rotation")) + if(Buffer[0] == 'y' || Buffer[0] == 'Y') + rotation = TRUE;@# + + if(fsearch("mag_x")) + mag_x = atof(Buffer); + if(fsearch("mag_y")) + mag_y = atof(Buffer); + if(!mag_x && !mag_y) + {mag_x = 1.0; + mag_y = 1.0; + } + if(mag_x && !mag_y) + mag_y = mag_x; + if(mag_y && !mag_x) + mag_x = mag_y; + if(mag_x <= 0.0) + {fprintf(stderr, "Invalid horizontal magnification\n"); + exit(1); + } + if(mag_y <= 0.0) + {fprintf(stderr, "Invalid vertical magnification\n"); + exit(1); + }@# + + if(fsearch("dpi_x")) + dpi_x = atoi(Buffer); + if(fsearch("dpi_y")) + dpi_y = atoi(Buffer); + if(!dpi_x && !dpi_y) + {dpi_x = 300; + dpi_y = 300; + } + if(dpi_x && !dpi_y) + dpi_y = dpi_x; + if(dpi_y && !dpi_x) + dpi_x = dpi_y; + if(dpi_x <= PRINTER_MIN_RES_X) + {fprintf(stderr, "Invalid horizontal printer resolution\n"); + exit(1); + } + if(dpi_y <= PRINTER_MIN_RES_Y) + {fprintf(stderr, "Invalid vertical printer resolution\n"); + exit(1); + }@# + + if(fsearch("design_size")) + design_size = atof(Buffer);@# + + if(fsearch("x_offset")) + offset_x = atoi(Buffer); + else + offset_x = rotation ? 0 : (boxp->hbf_xDisplacement * mag_x + 0.5); + if(fsearch("y_offset")) + offset_y = atoi(Buffer); + else + offset_y = rotation ? 0 : (boxp->hbf_yDisplacement * mag_y + 0.5); + if(!fsearch("comment")) + comment[0] = '\0'; + else + strcpy(comment, Buffer);@# + + if(fsearch("threshold")) + threshold = atoi(Buffer); + if(threshold <= 0 || threshold >= 255) + {fprintf(stderr, "Invalid threshold\n"); + exit(1); + }@# + + if(!fsearch("checksum")) + checksum = 0; + else + checksum = strtoul(Buffer, (char **)NULL, 0);@# + + if(!fsearch("coding")) + coding[0] = '\0'; + else + strcpy(coding, Buffer);@# + + if(!fsearch("pk_directory")) + pk_directory[0] = '\0'; + else + strcpy(pk_directory, Buffer);@# + + if(!fsearch("tfm_directory")) + tfm_directory[0] = '\0'; + else + strcpy(tfm_directory, Buffer);@# + + if(fsearch("rm_command")) + strcpy(rm_command, Buffer); + else + strcpy(rm_command, "rm");@# + + if(fsearch("cp_command")) + strcpy(cp_command, Buffer); + else + strcpy(cp_command, "cp");@# + + if(!fsearch("job_extension")) + job_extension[0] = '\0'; + else + {strncpy(job_extension, Buffer, EXTENSION_LENGTH); + job_extension[EXTENSION_LENGTH] = '\0'; + } + } + + +@ +The function |hbfGetCodeRange()| is an extension to the HBF API. + +Successive calls return the code ranges in ascending order; we only need the +extrema of the whole code range. + +In case |min_char| has been supplied in the configuration file, we use that +value instead. + +@<Global...@>= +HBF_CHAR min_char, max_char; + + +@ +@<Get code range@>= + {const void *cp; + HBF_CHAR dummy; + + cp = hbfGetCodeRange(hbf, NULL, &min_char, &max_char); + for(; cp != NULL; cp = hbfGetCodeRange(hbf, cp, &dummy, &max_char)) + ;@# + + if(have_min_char) + min_char = user_min_char; + } + + +@ +The function |hbfGetByte2Range()| is an extension to the HBF API. + +Successive calls return the byte~2 ranges in ascending order. We raise +|VALID_SUBCODE| in the array |b2_codes[]| for all characters in subcode +ranges. + +@d VALID_SUBCODE 1 + +@<Global...@>= +char b2_codes[256]; +unsigned char min_2_byte, max_2_byte; +int nmb_2_bytes = 0; + + +@ +@<Get sub code range@>= + {const void *b2r; + unsigned char dummy; + int i; + + for(i = 0; i < 256; i++) + b2_codes[i] = 0;@# + + b2r = hbfGetByte2Range(hbf, NULL, &min_2_byte, &max_2_byte); + dummy = min_2_byte; + for(; b2r != NULL; b2r = hbfGetByte2Range(hbf, b2r, &dummy, &max_2_byte)) + {for(i = dummy; i <= max_2_byte; i++) + b2_codes[i] = VALID_SUBCODE; + }@# + + for(i = 0; i < 256; i++) /* compute the number of valid |b2_codes| */ + if(b2_codes[i] == VALID_SUBCODE) + nmb_2_bytes++; + } + + +@ +This search routine is case insignificant. Each keyword must start a line; +the function checks whether the character before the keyword is a newline +character (|'\n'|). It also checks the presence of a parameter and fills +|Buffer| if existent. |fsearch()| returns~1 on success. + +@<Prototypes@>= +int fsearch(const char *); + + +@ +@c +int fsearch(const char *search_string) + {char *P, p; + const char *Q; + char temp_buffer[STRING_LENGTH + 1]; + char env_name[STRING_LENGTH + 1]; + char *env_p; + char *env_value; + char *Buf_p; + int Ch, ch, old_ch = '\n'; + int count = STRING_LENGTH; + + rewind(config); /* we start at offset~0 */@# + + do + {Q = search_string; + p = tolower(*Q); + Ch = fgetc(config); + ch = tolower(Ch); + while(!(ch == p && old_ch == '\n') && Ch != EOF) + /* search first character of |search_string|; + |'\n'| must be the character before */ + {old_ch = ch; + Ch = fgetc(config); + ch = tolower(Ch); + }@# + + for(;;) + {if(*(++Q) == '\0') + if((Ch = fgetc(config)) == ' ' || Ch == '\t') + /* there must be a space or a tab stop after the keyword */ + goto success; + Ch = fgetc(config); + if(tolower(Ch) != tolower(*Q)) + break; + } + } + while(Ch != EOF);@# + + return 0;@# + +success: + P = temp_buffer;@# + + while((Ch = fgetc(config)) == ' ' || Ch == '\t') + /* remove leading blanks and tabs */ + ; + while(Ch != '\n' && --count > 0 && Ch != EOF) /* fill |Buffer| */ + {*P++ = Ch; + Ch = fgetc(config); + } + *P = '\0';@# + + if (*temp_buffer) + @<Check for environment variables@>@; + else + *Buffer = '\0';@# + + return (*Buffer) ? 1 : 0; /* is there something in the buffer? */ + } + + +@ +To make the configuration file more flexible we allow environment variables +in the arguments. We scan the parameter stored in |temp_buffer| whether it +contains a `\.{\$}' character. If yes, the following code fragment tries to +get an environment variable name whose value will be then fetched with +|getenv()|. An environment variable name recognized by \.{hbf2gf} must start +with a letter or underscore; the other characters may be alphanumeric or an +underscore. You can surround the environment variable name with braces to +indicate where the name ends, e.g. \.{\$\{FOO\}}. The interpolated +configuration parameter will be truncated to |STRING_LENGTH| characters. If +you want to have `\.{\$}' you must write `\.{\$\$}'. + +Note that you should avoid to use such environment variables for specifying +the location of the configuration file in case you have support for a file +searching library like kpathsea. Its primary aim is to specify the target +directories for the \.{pk\_directory} and the \.{tfm\_directory} keywords. + +@<Check for environment variables@>= + {P = temp_buffer; + Buf_p = Buffer; + count = STRING_LENGTH - 1;@# + + while(*P && count > 0) + {env_p = env_name;@# + + if(*P == '$') + {P++; + if(*P == '$') + {*(Buf_p++) = *(P++); + count--; + continue; + } + while(*P == '{') @q } @> + P++; + if(!(isalpha(*P) || *P == '_')) + {fprintf(stderr,@/ + "Invalid environment variable name in configuration file\n"); + exit(1); + } + *(env_p++) = *(P++); + while(*P) + {if(isalnum(*P) || *P == '_') + *(env_p++) = *(P++); + else + {@q { @> while(*P == '}') + P++; + *env_p = '\0'; + break; + } + }@# + + env_value = getenv(env_name); + if(env_value) /* append the environment value to |Buffer| */ + {while(*env_value && count > 0) + {*(Buf_p++) = *(env_value++); + count--; + } + } + } + else + {*(Buf_p++) = *(P++); + count--; + } + } + *Buf_p = '\0'; + } + + +@ +If an error occurs, |config_error()| will leave the program with an error +message. + +@<Prototypes@>= +void config_error(const char *); + + +@ +@c +void config_error(const char *message) + {fprintf(stderr, "Couldn't find `%s' entry in configuration file\n", + message); + exit(1); + } + + + +@* File searching. + +We support three searching engines: emtexdir, kpathsea, and MiKTeX (which is +a Win32 port of kpathsea). For emtexdir, define |HAVE_EMTEXDIR| while +compiling. For kpathsea, define |HAVE_LIBKPATHSEA|. For MikTeX, define +|HAVE_MIKTEX|. If none of these macros is defined, a simple |fopen()| will +be used instead. + +@<Include files@>= +#if defined(HAVE_LIBKPATHSEA) +#include "kpathsea/kpathsea.h" + +#elif defined(HAVE_EMTEXDIR) +#include "emtexdir.h" + +#elif defined(HAVE_MIKTEX) +#include "miktex.h" +#endif + +@ +@<Global variables@>= +#if defined(HAVE_EMTEXDIR) +char emtex_version_string[] = "emTeXdir"; +#elif !defined(HAVE_MIKTEX) +char no_version_string[] = "no search library"; +#endif + + +@ +@<Prototypes@>= +const char *TeX_search_version(void); + + +@ +@c +const char *TeX_search_version(void) + { +#if defined(HAVE_LIBKPATHSEA) + return kpathsea_version_string; +#elif defined(HAVE_EMTEXDIR) + return emtex_version_string; +#elif defined(HAVE_MIKTEX) + char buf[200]; + + strcpy(buf, "MiKTeX "); + miktex_get_miktex_version_string_ex(buf + 7, sizeof (buf) - 7); + + return buf; +#else + return no_version_string; +#endif + } + + +@ +@s emtex_dir int + +@<Global variables@>= +#ifdef HAVE_EMTEXDIR +struct emtex_dir cfg_path, hbf_path; +#endif + + +@ +@<Prototypes@>= +#ifdef HAVE_EMTEXDIR +extern int setup_list(struct emtex_dir *, char *, const char *, unsigned); +int dir_setup(struct emtex_dir *, const char *, const char *, unsigned); +char *file_find(char *, struct emtex_dir *); +#endif + + +@ +We slightly modify |emtex_dir_setup()| (from the file \.{emtexdir.c}) to +output a warning in case the environment variable |env| isn't set properly. + +@c +#ifdef HAVE_EMTEXDIR +int dir_setup(ed, env, dir, flags) + struct emtex_dir *ed; + const char *env; + const char *dir; + unsigned flags; + + {const char *val; + char path[260]; + + ed->alloc = 0; + ed->used = 0; + ed->list = NULL;@# + + if(env != NULL && (val = getenv(env)) != NULL) + return setup_list(ed, path, val, flags); + else + fprintf(stderr, + "Environment variable `%s' not set; use current directory\n", + env);@# + + return TRUE; + } + + +@ +@<Global variables@>= +char name_buffer[FILE_NAME_LENGTH + 1]; + + +@ +@c +char *file_find(name, list) + char *name; + struct emtex_dir *list; + + {if(emtex_dir_find(name_buffer, sizeof(name_buffer), list, name, EDF_CWD)) + return name_buffer;@# + + return NULL; + } +#endif + + +@ +For emtexdir we use the environment variables \.{HBFCFG} and \.{HBFONTS} for +configuration resp.\ HBF header files. + +@<Initialize \TeX\ file searching@>= +#if defined(HAVE_LIBKPATHSEA) + kpse_set_program_name(argv[0], "hbf2gf"); + kpse_init_prog("HBF2GF", 300, "cx", "cmr10");@# + +#elif defined(HAVE_EMTEXDIR) + if(!dir_setup(&cfg_path, "HBFCFG", NULL, EDS_BANG)) + {fprintf(stderr, + "Couldn't setup search path for configuration files\n"); + exit(1); + } + if(!dir_setup(&hbf_path, "HBFONTS", NULL, EDS_BANG)) + {fprintf(stderr, + "Couldn't setup search path for HBF header files\n"); + exit(1); + } +#endif + + +@ +Finally, here are the searching routines. A special format in the kpathsea +library for fonts which are neither PostScript nor TrueType (\.{MISCFONTS}) +is available with version~3.3 and newer. For older versions we use the path +for PostScript fonts (\.{T1FONTS}) to find HBF files. Configuration files +are searched in the path specified within \.{TEXCONFIG} for old kpathsea +versions, and within \.{HBF2GFINPUTS} for new versions. + +@<Prototypes@>= +char *TeX_search_cfg_file(char *); +char *TeX_search_hbf_file(char *); + + +@ +@c +#if defined(HAVE_LIBKPATHSEA) +char *TeX_search_cfg_file(char *name) + { + return kpse_find_file(name, kpse_program_text_format, TRUE); + }@# + + +char *TeX_search_hbf_file(char *name) + { + return kpse_find_file(name, kpse_miscfonts_format, TRUE); + }@# + + +#elif defined(HAVE_EMTEXDIR) +char *TeX_search_cfg_file(char *name) + {return file_find(name, &cfg_path); + }@# + + +char *TeX_search_hbf_file(char *name) + {return file_find(name, &hbf_path); + }@# + + +#elif defined(HAVE_MIKTEX) +char *TeX_search_cfg_file(char *name) + {char result[_MAX_PATH]; + + if (!miktex_find_input_file("hbf2gf", *name, result)) + return 0; + return strdup(result); + }@# + + +char *TeX_search_hbf_file(char *name) + {char result[_MAX_PATH]; + + + if (!miktex_find_miscfont_file(*name, result)) + return 0; + return strdup(result); + }@# + + +#else +char *TeX_search_cfg_file(char *name) + {return name; + }@# + + +char *TeX_search_hbf_file(char *name) + {return name; + } +#endif + + + +@* An example. +This is the example configuration file \.{b5so12.cfg} (for use with DOS or +OS/2 and the emtexdir searching engine): +\bigskip +\halign{\quad\.{#}\hfil&\quad\.{#}\hfil\cr + hbf\_header & et24.hbf \cr + mag\_x & 2.076 \cr + x\_offset & 3 \cr + y\_offset & -8 \cr + comment & fanti songti 24x24 pixel font scaled and + adapted to 12 pt \cr + & \cr + design\_size & 12.0 \cr + & \cr + nmb\_fonts & -1 \cr + & \cr + output\_name & b5so12 \cr + & \cr + dpi\_x & 300 \cr + checksum & 123456789 \cr + coding & codingscheme Big 5 encoded TeX text \cr + & \cr + long\_extension & no \cr + job\_extension & .cmd \cr + rm\_command & del \cr + cp\_command & copy \cr + pk\_directory & \$HBF\_TARGET\\pk\\360dpi\\ \cr + tfm\_directory & \$HBF\_TARGET\\tfm\\ \cr + } +\bigskip +If you say e.g. +\medskip +\quad \.{set HBF\_TARGET=c:\\emtex\\texfonts} +\medskip +on your DOS prompt (or in your \.{autoexec.bat} file), then the interpolated +value of the \.{tfm\_directory} keyword is \.{c:\\emtex\\texfonts\\tfm\\}. +The HBF header file \.{et24.hbf} will be searched in the path specified by +the \.{HBFCFG} environment variable. +\bigskip +The call +\medskip +\quad \.{hbf2gf b5so12.cfg} +\medskip +creates the files +\medskip +\quad \.{b5so1201.gf}, \.{b5so1202.gf}, $\ldots$ , \.{b5so1255.gf}, +\.{b5so12.pl}, and \.{b5so12.cmd} +\bigskip +After calling +\medskip +\quad \.{b5so12.cmd} +\medskip +you will find the \.{PK} files in the +\.{c:\\emtex\\texfonts\\pk\\360dpi} directory and the \.{TFM} files in +the \.{c:\\emtex\\texfonts\\tfm} directory; all \.{GF} files and +\.{b5so12.pl} will be deleted. +\bigskip +The call +\medskip +\quad \.{hbf2gf -n b5so1220 417} +\medskip +creates two files: +\medskip +\quad \.{b5so1220.gf} and \.{b5so1220.pl} +\medskip +using the configuration file \.{b5so12.cfg}. The \.{GF} file would be +named \.{b5so1220.417gf} if the flag \.{-n} had not been used. + +\medskip + +It is possible to convert bitmap fonts to \.{PK} files almost +automatically. The HBF header file already has the entry +\.{HBF\_BITMAP\_BOUNDING\_BOX} which defines vertical and horizontal offsets +(in pixels), but these values are not in all cases optimal. If you omit +\.{x\_offset} and \.{y\_offset} in the configuration file, the third and +fourth parameter of \.{HBF\_BITMAP\_BOUNDING\_BOX} is used, scaled to design +size (to say it in other words: \.{x\_offset} and \.{y\_offset} will always +apply to the design size to be synchronous with the \.{TFM} files). + +Don't confuse scaling and magnification: Scaling here means that you choose +a (arbitrary) design size and compute scaling values (\.{mag\_x} and +\.{mag\_y}) which scales the bitmap to this particular design size at a +certain (arbitrarily chosen) resolution (\.{dpi\_x} and \.{dpi\_y}). +Magnification means that the scaled bitmap will be then magnified to a +certain target size while still using the font parameters (i.e., the +\.{TFM} file) of the design size. + +In the sample, you have a $24 \times 24$ bitmap font which will be scaled to +$12\,\hbox{pt}$ having a resolution of $300\,\hbox{dpi}$: +\medskip +\quad $1\,\hbox{pt}$ are $300 / 72.27 = 4.1511$ pixel; + +\quad $12\,\hbox{pt}$ are $4.1511 * 12 = 49.813$ pixel; + +\quad thus the theoretical scaling value is $49.813 / 24 = 2.076$. + +\medskip + +But especially for small sizes, this may not be the best value if the font +should harmonize with, say, Knuth's Computer Modern fonts. I recommend to +compute, say, 5~\.{PK} fonts, then check the CJK font with different \TeX\ +fonts to see whether the offsets and/or the scaling value is good. The +greater the design size the finer you can control the offsets---as an +example you could use a design size of $30\,\hbox{pt}$ (nevertheless there +is a compile-time constant |MAX_CHAR_SIZE| which limits the maximal +character size; default is 255~pixels). + +If you have found optimal offsets, you can produce many different +magnifications of the CJK font using the same set of \.{TFM} files +analogous to ordinary \TeX\ fonts; as a simplification, we assume that +\.{PK} files with a resolution of $300\,\hbox{dpi}$ and a design size of +$10\,\hbox{pt}$ have the extension `\.{.300pk}' (respectively come into a +`\.{300dpi}' subdirectory)---this is the reason why in the above example for +the $12\,\hbox{pt}$ design size a `\.{360dpi}' target directory has been +used. Now we can use the following formula: + + $$ \\{needed\_dpi} = \\{your\_horizontal\_resolution} * + {\\{your\_target\_size} \over 10.0} $$ + +Example: assuming that your printer has a resolution of +$300\times400\,\hbox{dpi}$, and you want $14.4\,\hbox{pt}$: + + $$ 300 * {14.4 \over 10.0} = 432 $$ + +The vertical scaling value is $400 / 300 = 1.3333$. Use these values now to +call \.{hbf2gf} in \mf-like mode: + +\quad \.{hbf2gf b5so1220 432 1.3333} + + + +@* Index. |