Skip to content

Instantly share code, notes, and snippets.

@h-kitagawa
Created June 21, 2021 10:07
Show Gist options
  • Save h-kitagawa/e38ca5adebbde6951a1491c7497c9e26 to your computer and use it in GitHub Desktop.
Save h-kitagawa/e38ca5adebbde6951a1491c7497c9e26 to your computer and use it in GitHub Desktop.
pTeX の \euc, \kuten 等のプリミティブに変な値を与えてみる
#!/bin/sh
#pushd /tmp/tlwork/texk/web2c/
#make -j4 eptex && sudo cp eptex /opt/texlive/2021/bin/x86_64-linux/
#popd
eptex -ini -etex -kanji-internal=euc -jobname=eptex-euc eptex.ini
eptex -ini -etex -kanji-internal=sjis -jobname=eptex-sjis eptex.ini
cat > test.tex << "EOF"
\ifnum`あ="A4A2 \def\XC{EUC:: }\else\def\XC{SJIS:: }\fi %"
\def\typeout#1{\immediate\write17{\XC \detokenize{#1}--> #1}}
\typeout{\kuten-1}
\typeout{\kuten0}
\typeout{\kuten"015F} %" 本来は不正のはずだが,
\typeout{\kuten"0160} %"
\ifnum`あ="A4A2 %"
\typeout{\sjis-1} % 本来は不正のはずだが.
\typeout{\sjis"FF} %" 本来は不正のはずだが.
\typeout{\sjis"8040}%" 本来は不正のはずだが.
\typeout{\sjis"817F}%" 本来は不正のはずだが.
\typeout{\sjis"81FF}%" 本来は不正のはずだが.
\typeout{\sjis"813F}%" 本来は不正のはずだが.
\typeout{\sjis"EFFC}%" 1-94-94
\typeout{\sjis"EFFD}%" 本来は不正のはずだが.
\typeout{\sjis"F040}%" 「第2面」領域
\typeout{\sjis"FFFD}%" 本来は不正のはずだが.
\else
\typeout{\euc-1} % 本来は不正のはずだが,
\typeout{\euc"FF} %"
\typeout{\euc"2422}%" 本来は不正のはずだが,
\typeout{\euc"A0A2}%" JIStoSJIS() で弾かれる
\typeout{\euc"A2A0}%" 本来は不正のはずだが,
\typeout{\euc"A29F}%" 本来は不正のはずだが,
\typeout{\euc"A2FF}%"
\fi
\bye
EOF
eptex -fmt=eptex-euc test.tex 2>/dev/null | grep '::'
eptex -fmt=eptex-sjis test.tex 2>/dev/null | grep "::"
@h20y6m
Copy link

h20y6m commented Jun 25, 2021

 int JIStoEUC(int kcode)
 {
+    if (!isEUCkanji1(HI(kcode) | 0x80)) return -1;
+    if (!isEUCkanji2(LO(kcode) | 0x80)) return -1;
     return (kcode | 0x8080);
 }

これだと JIS 0xA1A1 (不正) --> EUC 0xA1A1 ( : 正当) 等が通ってしまいますね…

isJISkanji1, isJISkanji2 のような物を作って、

boolean isJISkanji1(int c)
{
    c &= 0xff;
    return (0x21 <= c && c <= 0x7e);
}

boolean isJISkanji2(int c)
{
    c &= 0xff;
    return (0x21 <= c && c <= 0x7e);
}

int JIStoEUC(int kcode)
{
    if (!isJISkanji1(HI(kcode)) return -1;
    if (!isJISkanji2(LO(kcode)) return -1;
    return (kcode | 0x8080);
}

とするのはどうでしょうか?

JIStoSJIS も計算前に同様のチェックを入れておきたい気がします。

@aminophen
Copy link

JIStoEUC, JIStoSJIS

確かにそうですね。ありがとうございます。

  • あちらのコメントにも書きましたが,不正なコードの時は -1 に統一したいという気持ちなので,UCS2toJISnative の返り値が 0(→ UCS2toJIS = 0)の時は fromUCS() で -1 を返すようにしてみました。
  • 余談ですが,ptexenc/jisx0208.h の UnicodeTbl の category 85 以降は全くアクセスされない(unicode-jp.c が利用するのは MAXJIS すなわち category 84 まで)ため,削除していいように思います(古い VFlib2 由来のコードらしいですが,私用領域?なのか category 89 -- 92 に謎のエントリがあるのが気持ち悪いので)。

https://github.com/texjporg/tex-jp-build/tree/kitagawa_toucs-1 で試しています。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment