summaryrefslogtreecommitdiff
path: root/Build/source/texk/makejvf/main.c
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2021-02-25 19:22:25 +0000
committerKarl Berry <karl@freefriends.org>2021-02-25 19:22:25 +0000
commitad547a6b5986815fda458221149728d9d9ab1d87 (patch)
tree16296910eb3eca724371474ea9aea3994dc69614 /Build/source/texk/makejvf/main.c
parent947b43de3dd21d58ccc2ffadefc4441ea1c2a813 (diff)
restore Build,TODO from r57911
git-svn-id: svn://tug.org/texlive/trunk@57915 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/makejvf/main.c')
-rw-r--r--Build/source/texk/makejvf/main.c276
1 files changed, 276 insertions, 0 deletions
diff --git a/Build/source/texk/makejvf/main.c b/Build/source/texk/makejvf/main.c
new file mode 100644
index 00000000000..e417e2a9090
--- /dev/null
+++ b/Build/source/texk/makejvf/main.c
@@ -0,0 +1,276 @@
+#include <kpathsea/kpathsea.h>
+#include <ptexenc/ptexenc.h>
+#include "version.h"
+#include "makejvf.h"
+#include "uniblock.h"
+#include "usrtable.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+FILE *vfp,*afp=NULL;
+char *atfmname,*vtfmname,*afmname,*vfname,*kanatfm,*jistfm,*ucsqtfm,*usertable;
+int kanatume=-1,chotai=0,baseshift=0,minute=0,useset3=0,hankana=0,fidzero=0,enhanced=0,omitzw=0;
+int pstfm_nt;
+long ucs=0;
+
+int main(int argc, char ** argv)
+{
+ int i,j;
+ int c;
+ long ch,ch_max;
+ const char *atfmname_base;
+
+ kpse_set_program_name(argv[0], "makejvf");
+ set_enc_string("sjis", "euc");
+
+ while ((c = getopt (argc, argv, "k:K:Ca:b:mu:3J:U:Hiet:O")) != -1)
+ switch (c) {
+
+ case 'k':
+ kanatume = atoi(optarg);
+ break;
+ case 'K':
+ kanatfm = xstrdup(optarg);
+ break;
+ case 'C':
+ chotai=1;
+ break;
+ case 'a':
+ afmname = xstrdup(optarg);
+ {
+ char *fpath = kpse_find_file(afmname, kpse_afm_format, 0);
+ if (fpath) {
+ afp = fopen(fpath, "r");
+ free(fpath);
+ }
+ }
+ if (!afp) {
+ fprintf(stderr,"no AFM file, %s.\n",afmname);
+ exit(100);
+ }
+ break;
+ case 'b':
+ baseshift = atoi(optarg);
+ break;
+ case 'm':
+ minute=1;
+ break;
+ case 'u':
+ if (!strcmp(optarg, "gb"))
+ ucs = ENTRY_G;
+ else if (!strcmp(optarg, "cns"))
+ ucs = ENTRY_C;
+ else if (!strcmp(optarg, "jisq"))
+ ucs = ENTRY_JQ;
+ else if (!strcmp(optarg, "jis"))
+ ucs = ENTRY_J;
+ else if (!strcmp(optarg, "ks"))
+ ucs = ENTRY_K;
+ else if (!strcmp(optarg, "custom"))
+ ucs = ENTRY_CUSTOM;
+ else {
+ fprintf(stderr,"[Warning] Charset is not set.\n");
+ ucs = ENTRY_NO;
+ }
+ break;
+ case '3':
+ useset3=1;
+ break;
+ case 'J':
+ jistfm = xstrdup(optarg);
+ break;
+ case 'U':
+ ucsqtfm = xstrdup(optarg);
+ break;
+ case 'H':
+ hankana=1;
+ break;
+ case 'i':
+ fidzero=1;
+ break;
+ case 'e':
+ enhanced=1;
+ break;
+ case 'O':
+ omitzw=1;
+ break;
+ case 't':
+ usertable = xstrdup(optarg);
+ break;
+ default:
+ usage();
+ exit(0);
+ }
+
+ if (kanatume>=0 && !afp) {
+ fprintf(stderr,"No AFM file for kanatume.\n");
+ exit(101);
+ }
+
+ if (argc - optind != 2) {
+ usage();
+ exit(0);
+ }
+
+ atfmname = xstrdup(argv[optind]);
+ if (strlen(atfmname)>=4 && FILESTRCASEEQ(&atfmname[strlen(atfmname)-4], ".tfm")) {
+ atfmname[strlen(atfmname)-4] = '\0';
+ }
+
+ atfmname_base = xbasename(atfmname);
+ vfname = xmalloc(strlen(atfmname_base)+4);
+ strcpy(vfname, atfmname_base);
+ strcat(vfname,".vf");
+
+ vtfmname = xstrdup(argv[optind+1]);
+ if (strlen(vtfmname)>=4 && FILESTRCASEEQ(&vtfmname[strlen(vtfmname)-4], ".tfm")) {
+ vtfmname[strlen(vtfmname)-4] = '\0';
+ }
+ if (FILESTRCASEEQ(&vtfmname[0], &atfmname_base[0])) {
+ fprintf(stderr,"Invalid usage: input TFM and output TFM must be different.\n");
+ exit(102);
+ }
+
+ if (kanatfm) {
+ if (strlen(kanatfm)>=4 && FILESTRCASEEQ(&kanatfm[strlen(kanatfm)-4], ".tfm")) {
+ kanatfm[strlen(kanatfm)-4] = '\0';
+ }
+ if (FILESTRCASEEQ(&kanatfm[0], &atfmname_base[0])) {
+ fprintf(stderr,"Invalid usage: input TFM and output TFM must be different.\n");
+ exit(102);
+ }
+ }
+
+ if (!ucs) {
+ if (jistfm) {
+ fprintf(stderr,"[Warning] Option -J invalid in non-UCS mode, ignored.\n");
+ jistfm = NULL;
+ }
+ if (ucsqtfm) {
+ fprintf(stderr,"[Warning] Option -U invalid in non-UCS mode, ignored.\n");
+ ucsqtfm = NULL;
+ }
+ if (useset3) {
+ fprintf(stderr,"[Warning] Option -3 invalid in non-UCS mode, ignored.\n");
+ useset3 = 0;
+ }
+ if (hankana) {
+ fprintf(stderr,"[Warning] Option -H invalid in non-UCS mode, ignored.\n");
+ hankana = 0;
+ }
+ }
+
+ if (jistfm && ucsqtfm) {
+ fprintf(stderr,"Options -J and -U at the same time? I'm confused.\n");
+ exit(110);
+ }
+
+ if (jistfm) {
+ if (strlen(jistfm)>=4 && FILESTRCASEEQ(&jistfm[strlen(jistfm)-4], ".tfm")) {
+ jistfm[strlen(jistfm)-4] = '\0';
+ }
+ if (FILESTRCASEEQ(&jistfm[0], &atfmname_base[0])) {
+ fprintf(stderr,"Invalid usage: input TFM and output TFM must be different.\n");
+ exit(102);
+ }
+ }
+
+ if (ucsqtfm) {
+ if (strlen(ucsqtfm)>=4 && FILESTRCASEEQ(&ucsqtfm[strlen(ucsqtfm)-4], ".tfm")) {
+ ucsqtfm[strlen(ucsqtfm)-4] = '\0';
+ }
+ if (FILESTRCASEEQ(&ucsqtfm[0], &atfmname_base[0])) {
+ fprintf(stderr,"Invalid usage: input TFM and output TFM must be different.\n");
+ exit(102);
+ }
+ }
+
+ if (omitzw && usertable) {
+ fprintf(stderr,"Invalid usage: conflict options -O and -t.\n");
+ exit(120);
+ }
+ if (usertable) {
+ get_usertable(usertable);
+ }
+ if (ucs!=ENTRY_CUSTOM && usertable_charset_max>0) {
+ fprintf(stderr,
+ "[Warning] Custom charset is defined in usertable\n"
+ "[Warning] but it will be ignored.\n");
+ }
+ if (ucs==ENTRY_CUSTOM && usertable_charset_max<1) {
+ fprintf(stderr,"No custom charset definition in usertable.\n");
+ exit(130);
+ }
+
+ tfmget(atfmname);
+
+ vfp = vfopen(vfname);
+
+ pstfm_nt=1; /* initialize */
+ if (ucs) {
+ if (ucs==ENTRY_CUSTOM) ch_max=usertable_charset[usertable_charset_max-1].max;
+ else if (useset3) ch_max=0x3FFFF;
+ else ch_max=0xFFFF;
+ for (ch=0;ch<=ch_max;ch++) {
+ if (search_cjk_entry(ch,ucs))
+ writevfu(ch,vfp);
+ }
+ } else {
+ for (i=0;i<94;i++)
+ for (j=0;j<94;j++)
+ writevf((0x21+i)*256+(0x21+j),vfp);
+ }
+
+ vfclose(vfp);
+
+ if (kanatfm) {
+ maketfm(kanatfm);
+ pstfm_nt=1; /* already done*/
+ }
+
+ maketfm(vtfmname);
+ pstfm_nt=1; /* already done*/
+
+ if (jistfm) maketfm(jistfm);
+
+ if (ucsqtfm) maketfm(ucsqtfm);
+
+ exit(0);
+}
+
+void usage(void)
+{
+ fprintf(stderr, "MAKEJVF version %s -- make Japanese VF from a JFM file.\n", VERSION);
+ fputs2("Usage:\n", stderr);
+ fputs2("%% makejvf [<options>] <TFMfile> <PSfontTFM>\n", stderr);
+ fputs2(" <TFMfile>: Name of input pTeX/upTeX JFM file.\n", stderr);
+ fputs2(" The basename is inherited by the name of output VF file.\n", stderr);
+ fputs2(" <PSfontTFM>: Name of output PSfont JFM file.\n", stderr);
+ fputs2("Options:\n", stderr);
+ fputs2("-C 長体モード\n", stderr);
+ fputs2("-K <PS-TFM> 非漢字部用に作成するPSフォントTFM名\n", stderr);
+ fputs2("-b <数値> ベースライン補正\n", stderr);
+ fputs2(" 文字の高さを1000として整数で指定\n", stderr);
+ fputs2(" プラスで文字が下がり、マイナスで文字が上がる\n", stderr);
+ fputs2("-m 縦書き時にクオート(’”)の代わりにミニュート(′″)を使用\n", stderr);
+ fputs2("-a <AFMfile> AFMファイル名(かな詰め時に使用)\n", stderr);
+ fputs2("-k <数値> かな詰めマージン指定\n", stderr);
+ fputs2(" 文字幅を1000として整数で指定。-aオプションと共に使用\n", stderr);
+ fputs2("-i Start mapped font ID from No. 0\n", stderr);
+ fputs2("-e Enhanced mode; the horizontal shift amount is determined\n", stderr);
+ fputs2(" from the glue/kern table of <TFMfile> input\n", stderr);
+ fputs2("-t <CNFfile> Use <CNFfile> as a configuration file\n", stderr);
+ fputs2("-O Omit entries in VF for characters with default metric\n", stderr);
+ fputs2("-u <Charset> UCS mode\n", stderr);
+ fputs2(" <Charset> gb : GB, cns : CNS, ks : KS\n", stderr);
+ fputs2(" jis : JIS, jisq : JIS quote only\n", stderr);
+ fputs2(" custom : Use user-defined CHARSET from <CNFfile>\n", stderr);
+ fputs2("Options below are effective only in UCS mode:\n", stderr);
+ fputs2("-J <PS-TFM> Map single/double quote to another JIS-encoded PSfont TFM\n", stderr);
+ fputs2("-U <PS-TFM> Map single/double quote to another UCS-encoded PSfont TFM\n", stderr);
+ fputs2("-3 Use set3, that is, enable non-BMP characters support\n", stderr);
+ fputs2("-H Use half-width katakana\n", stderr);
+ fprintf(stderr, "Email bug reports to %s.\n", BUG_ADDRESS);
+}