バイナリートークンエンコード用 PostScript script
ZAKKI / ySas express - PSバイナリ化と id:yshl:20070329:1175170084 の続き。
餅は餅屋理論によると、PostScript の解釈は PostScript インタープリタに任せる方がいいと思われるので、PostScript で書いてみた。
浮動小数点数と名前の即時評価が不完全。
以下ソース
#!/bin/sh exec gs -q -dNODISPLAY -dBATCH -d#!='{2{currentfile 256 string readline{pop}if}repeat}' -- $0 "$@" ARGUMENTS length 0 eq{ (%stdin) }{ ARGUMENTS 0 get }ifelse (r)file/infile exch def /SystemNames where{pop}{ /SystemNames[ 0 1 225{ ( )dup 0 146 put dup 1 4 3 roll put token{exch pop}if }for ]def }ifelse /list SystemNames 0 226 getinterval def /bindict list length 6 add dict def /alnum? false def 0 1 list length 1 sub{ /i exch def bindict list i get 2 string dup 0 146 put dup 1 i put put }for bindict /true 2 string dup 0 141 put dup 1 1 put put bindict /false 2 string dup 0 141 put dup 1 0 put put [([)(])(<<)(>>)]{ bindict exch dup cvn exch put }forall /inttobin{ 1 dict begin /n exch def n -128 ge n 128 lt and{ 2 string dup 0 136 put dup 1 n 255 and put }{ n -32768 ge n 32768 lt and{ 3 string dup 0 135 put dup 1 n 255 and put dup 2 n -8 bitshift 255 and put }{ 5 string dup 0 133 put dup 1 n 255 and put dup 2 n -8 bitshift 255 and put dup 3 n -16 bitshift 255 and put dup 4 n -24 bitshift 255 and put }ifelse }ifelse end }def /tokentobin{ /tok exch def /tok load type dup /stringtype eq{ (\216 )dup 1 tok length put print tok print /alnum? false def }if dup /integertype eq{ tok 10 lt tok 0 ge and alnum? not and{ tok =only /alnum? true def }{ tok inttobin print /alnum? false def }ifelse }if dup /realtype eq{ alnum?{( )print}if tok ==only /alnum? true def }if dup /nametype eq{ /tok load xcheck{ bindict /tok load known{ bindict /tok load get print /alnum? false def }{ alnum?{( )print}if /tok load ==only /alnum? true def }ifelse }{ /tok load ==only /alnum? true def }ifelse }if /arraytype eq{ ({)print /alnum? false def /tok load{tokentobin}forall (})print /alnum? false def }if }def { infile token not{exit}if tokentobin }loop