343 lines
4.4 KiB
Text
343 lines
4.4 KiB
Text
%
|
|
% Encoding vector, operator and procedure redefinitions for Plan 9 UTF
|
|
% encoding. Prologues are expected to take steps to ensure operator
|
|
% redefinitions given here are actually used. Current implementation
|
|
% assumes UTF byte streams that represent ASCII or Latin1 text.
|
|
%
|
|
|
|
/UTFLatin1Encoding [
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/space
|
|
/exclam
|
|
/quotedbl
|
|
/numbersign
|
|
/dollar
|
|
/percent
|
|
/ampersand
|
|
/quoteright
|
|
/parenleft
|
|
/parenright
|
|
/asterisk
|
|
/plus
|
|
/comma
|
|
/minus
|
|
/period
|
|
/slash
|
|
/zero
|
|
/one
|
|
/two
|
|
/three
|
|
/four
|
|
/five
|
|
/six
|
|
/seven
|
|
/eight
|
|
/nine
|
|
/colon
|
|
/semicolon
|
|
/less
|
|
/equal
|
|
/greater
|
|
/question
|
|
/at
|
|
/A
|
|
/B
|
|
/C
|
|
/D
|
|
/E
|
|
/F
|
|
/G
|
|
/H
|
|
/I
|
|
/J
|
|
/K
|
|
/L
|
|
/M
|
|
/N
|
|
/O
|
|
/P
|
|
/Q
|
|
/R
|
|
/S
|
|
/T
|
|
/U
|
|
/V
|
|
/W
|
|
/X
|
|
/Y
|
|
/Z
|
|
/bracketleft
|
|
/backslash
|
|
/bracketright
|
|
/asciicircum
|
|
/underscore
|
|
/quoteleft
|
|
/a
|
|
/b
|
|
/c
|
|
/d
|
|
/e
|
|
/f
|
|
/g
|
|
/h
|
|
/i
|
|
/j
|
|
/k
|
|
/l
|
|
/m
|
|
/n
|
|
/o
|
|
/p
|
|
/q
|
|
/r
|
|
/s
|
|
/t
|
|
/u
|
|
/v
|
|
/w
|
|
/x
|
|
/y
|
|
/z
|
|
/braceleft
|
|
/bar
|
|
/braceright
|
|
/asciitilde
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/.notdef
|
|
/dotlessi
|
|
/grave
|
|
/acute
|
|
/circumflex
|
|
/tilde
|
|
/macron
|
|
/breve
|
|
/dotaccent
|
|
/dieresis
|
|
/.notdef
|
|
/ring
|
|
/cedilla
|
|
/.notdef
|
|
/hungarumlaut
|
|
/ogonek
|
|
/caron
|
|
/space
|
|
/exclamdown
|
|
/cent
|
|
/sterling
|
|
/currency
|
|
/yen
|
|
/brokenbar
|
|
/section
|
|
/dieresis
|
|
/copyright
|
|
/ordfeminine
|
|
/guillemotleft
|
|
/logicalnot
|
|
/hyphen
|
|
/registered
|
|
/macron
|
|
/degree
|
|
/plusminus
|
|
/twosuperior
|
|
/threesuperior
|
|
/acute
|
|
/mu
|
|
/paragraph
|
|
/periodcentered
|
|
/cedilla
|
|
/onesuperior
|
|
/ordmasculine
|
|
/guillemotright
|
|
/onequarter
|
|
/onehalf
|
|
/threequarters
|
|
/questiondown
|
|
/Agrave
|
|
/Aacute
|
|
/Acircumflex
|
|
/Atilde
|
|
/Adieresis
|
|
/Aring
|
|
/AE
|
|
/Ccedilla
|
|
/Egrave
|
|
/Eacute
|
|
/Ecircumflex
|
|
/Edieresis
|
|
/Igrave
|
|
/Iacute
|
|
/Icircumflex
|
|
/Idieresis
|
|
/Eth
|
|
/Ntilde
|
|
/Ograve
|
|
/Oacute
|
|
/Ocircumflex
|
|
/Otilde
|
|
/Odieresis
|
|
/multiply
|
|
/Oslash
|
|
/Ugrave
|
|
/Uacute
|
|
/Ucircumflex
|
|
/Udieresis
|
|
/Yacute
|
|
/Thorn
|
|
/germandbls
|
|
/agrave
|
|
/aacute
|
|
/acircumflex
|
|
/atilde
|
|
/adieresis
|
|
/aring
|
|
/ae
|
|
/ccedilla
|
|
/egrave
|
|
/eacute
|
|
/ecircumflex
|
|
/edieresis
|
|
/igrave
|
|
/iacute
|
|
/icircumflex
|
|
/idieresis
|
|
/eth
|
|
/ntilde
|
|
/ograve
|
|
/oacute
|
|
/ocircumflex
|
|
/otilde
|
|
/odieresis
|
|
/divide
|
|
/oslash
|
|
/ugrave
|
|
/uacute
|
|
/ucircumflex
|
|
/udieresis
|
|
/yacute
|
|
/thorn
|
|
/ydieresis
|
|
] def
|
|
|
|
/NewFontDirectory FontDirectory maxlength dict def
|
|
|
|
%
|
|
% Apparently no guarantee findfont is defined in systemdict so the obvious
|
|
%
|
|
% systemdict /findfont get exec
|
|
%
|
|
% can generate an error. So far the only exception is a VT600 (version 48.0).
|
|
%
|
|
|
|
userdict /@RealFindfont known not {
|
|
userdict begin
|
|
/@RealFindfont systemdict begin /findfont load end def
|
|
end
|
|
} if
|
|
|
|
/findfont {
|
|
dup NewFontDirectory exch known not {
|
|
dup
|
|
%dup systemdict /findfont get exec % not always in systemdict
|
|
dup userdict /@RealFindfont get exec
|
|
dup /Encoding get StandardEncoding eq {
|
|
dup length 1 add dict begin
|
|
{1 index /FID ne {def}{pop pop} ifelse} forall
|
|
/Encoding UTFLatin1Encoding def
|
|
/Metrics 1 dict def
|
|
Metrics /.notdef 0 put
|
|
currentdict
|
|
end
|
|
/DummyFontName exch definefont
|
|
} if
|
|
NewFontDirectory 3 1 roll put
|
|
} if
|
|
NewFontDirectory exch get
|
|
} bind def
|
|
|
|
%
|
|
% UTF string decoding for ASCII and Latin1 only:
|
|
%
|
|
% C2 XX => 00 XX
|
|
% C3 XX => XX+40 00
|
|
%
|
|
% Two passes through each string with search is undoubtedly faster than
|
|
% PostScript that examines each byte.
|
|
%
|
|
|
|
/UTFstring {
|
|
dup {
|
|
(\302) search {
|
|
pop
|
|
0 0 put
|
|
}{pop exit} ifelse
|
|
} loop
|
|
dup {
|
|
(\303) search {
|
|
pop
|
|
1 index 0 get 16#40 add 0 exch put
|
|
dup length 0 gt {dup 0 0 put} if
|
|
}{pop exit} ifelse
|
|
} loop
|
|
} bind def
|
|
|
|
/ashow {mark 4 1 roll UTFstring //ashow cvx exec cleartomark} bind def
|
|
/awidthshow {mark 7 1 roll UTFstring //awidthshow cvx exec cleartomark} bind def
|
|
/show {mark exch UTFstring //show cvx exec cleartomark} bind def
|
|
/stringwidth {UTFstring //stringwidth cvx exec} bind def
|
|
/widthshow {mark 5 1 roll UTFstring //widthshow cvx exec cleartomark} bind def
|
|
|
|
%
|
|
% kshow is harder - stack can't change because of the procedure.
|
|
%
|
|
|
|
/kshow dup load type /operatortype eq
|
|
{{UTFstring kshow} bind}
|
|
{{UTFstring //kshow cvx exec} bind}
|
|
ifelse def
|
|
|