Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

%
% 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