1*219b2ee8SDavid du Colombier% 2*219b2ee8SDavid du Colombier% Encoding vector, operator and procedure redefinitions for Plan 9 UTF 3*219b2ee8SDavid du Colombier% encoding. Prologues are expected to take steps to ensure operator 4*219b2ee8SDavid du Colombier% redefinitions given here are actually used. Current implementation 5*219b2ee8SDavid du Colombier% assumes UTF byte streams that represent ASCII or Latin1 text. 6*219b2ee8SDavid du Colombier% 7*219b2ee8SDavid du Colombier 8*219b2ee8SDavid du Colombier/UTFLatin1Encoding [ 9*219b2ee8SDavid du Colombier /.notdef 10*219b2ee8SDavid du Colombier /.notdef 11*219b2ee8SDavid du Colombier /.notdef 12*219b2ee8SDavid du Colombier /.notdef 13*219b2ee8SDavid du Colombier /.notdef 14*219b2ee8SDavid du Colombier /.notdef 15*219b2ee8SDavid du Colombier /.notdef 16*219b2ee8SDavid du Colombier /.notdef 17*219b2ee8SDavid du Colombier /.notdef 18*219b2ee8SDavid du Colombier /.notdef 19*219b2ee8SDavid du Colombier /.notdef 20*219b2ee8SDavid du Colombier /.notdef 21*219b2ee8SDavid du Colombier /.notdef 22*219b2ee8SDavid du Colombier /.notdef 23*219b2ee8SDavid du Colombier /.notdef 24*219b2ee8SDavid du Colombier /.notdef 25*219b2ee8SDavid du Colombier /.notdef 26*219b2ee8SDavid du Colombier /.notdef 27*219b2ee8SDavid du Colombier /.notdef 28*219b2ee8SDavid du Colombier /.notdef 29*219b2ee8SDavid du Colombier /.notdef 30*219b2ee8SDavid du Colombier /.notdef 31*219b2ee8SDavid du Colombier /.notdef 32*219b2ee8SDavid du Colombier /.notdef 33*219b2ee8SDavid du Colombier /.notdef 34*219b2ee8SDavid du Colombier /.notdef 35*219b2ee8SDavid du Colombier /.notdef 36*219b2ee8SDavid du Colombier /.notdef 37*219b2ee8SDavid du Colombier /.notdef 38*219b2ee8SDavid du Colombier /.notdef 39*219b2ee8SDavid du Colombier /.notdef 40*219b2ee8SDavid du Colombier /.notdef 41*219b2ee8SDavid du Colombier /space 42*219b2ee8SDavid du Colombier /exclam 43*219b2ee8SDavid du Colombier /quotedbl 44*219b2ee8SDavid du Colombier /numbersign 45*219b2ee8SDavid du Colombier /dollar 46*219b2ee8SDavid du Colombier /percent 47*219b2ee8SDavid du Colombier /ampersand 48*219b2ee8SDavid du Colombier /quoteright 49*219b2ee8SDavid du Colombier /parenleft 50*219b2ee8SDavid du Colombier /parenright 51*219b2ee8SDavid du Colombier /asterisk 52*219b2ee8SDavid du Colombier /plus 53*219b2ee8SDavid du Colombier /comma 54*219b2ee8SDavid du Colombier /minus 55*219b2ee8SDavid du Colombier /period 56*219b2ee8SDavid du Colombier /slash 57*219b2ee8SDavid du Colombier /zero 58*219b2ee8SDavid du Colombier /one 59*219b2ee8SDavid du Colombier /two 60*219b2ee8SDavid du Colombier /three 61*219b2ee8SDavid du Colombier /four 62*219b2ee8SDavid du Colombier /five 63*219b2ee8SDavid du Colombier /six 64*219b2ee8SDavid du Colombier /seven 65*219b2ee8SDavid du Colombier /eight 66*219b2ee8SDavid du Colombier /nine 67*219b2ee8SDavid du Colombier /colon 68*219b2ee8SDavid du Colombier /semicolon 69*219b2ee8SDavid du Colombier /less 70*219b2ee8SDavid du Colombier /equal 71*219b2ee8SDavid du Colombier /greater 72*219b2ee8SDavid du Colombier /question 73*219b2ee8SDavid du Colombier /at 74*219b2ee8SDavid du Colombier /A 75*219b2ee8SDavid du Colombier /B 76*219b2ee8SDavid du Colombier /C 77*219b2ee8SDavid du Colombier /D 78*219b2ee8SDavid du Colombier /E 79*219b2ee8SDavid du Colombier /F 80*219b2ee8SDavid du Colombier /G 81*219b2ee8SDavid du Colombier /H 82*219b2ee8SDavid du Colombier /I 83*219b2ee8SDavid du Colombier /J 84*219b2ee8SDavid du Colombier /K 85*219b2ee8SDavid du Colombier /L 86*219b2ee8SDavid du Colombier /M 87*219b2ee8SDavid du Colombier /N 88*219b2ee8SDavid du Colombier /O 89*219b2ee8SDavid du Colombier /P 90*219b2ee8SDavid du Colombier /Q 91*219b2ee8SDavid du Colombier /R 92*219b2ee8SDavid du Colombier /S 93*219b2ee8SDavid du Colombier /T 94*219b2ee8SDavid du Colombier /U 95*219b2ee8SDavid du Colombier /V 96*219b2ee8SDavid du Colombier /W 97*219b2ee8SDavid du Colombier /X 98*219b2ee8SDavid du Colombier /Y 99*219b2ee8SDavid du Colombier /Z 100*219b2ee8SDavid du Colombier /bracketleft 101*219b2ee8SDavid du Colombier /backslash 102*219b2ee8SDavid du Colombier /bracketright 103*219b2ee8SDavid du Colombier /asciicircum 104*219b2ee8SDavid du Colombier /underscore 105*219b2ee8SDavid du Colombier /quoteleft 106*219b2ee8SDavid du Colombier /a 107*219b2ee8SDavid du Colombier /b 108*219b2ee8SDavid du Colombier /c 109*219b2ee8SDavid du Colombier /d 110*219b2ee8SDavid du Colombier /e 111*219b2ee8SDavid du Colombier /f 112*219b2ee8SDavid du Colombier /g 113*219b2ee8SDavid du Colombier /h 114*219b2ee8SDavid du Colombier /i 115*219b2ee8SDavid du Colombier /j 116*219b2ee8SDavid du Colombier /k 117*219b2ee8SDavid du Colombier /l 118*219b2ee8SDavid du Colombier /m 119*219b2ee8SDavid du Colombier /n 120*219b2ee8SDavid du Colombier /o 121*219b2ee8SDavid du Colombier /p 122*219b2ee8SDavid du Colombier /q 123*219b2ee8SDavid du Colombier /r 124*219b2ee8SDavid du Colombier /s 125*219b2ee8SDavid du Colombier /t 126*219b2ee8SDavid du Colombier /u 127*219b2ee8SDavid du Colombier /v 128*219b2ee8SDavid du Colombier /w 129*219b2ee8SDavid du Colombier /x 130*219b2ee8SDavid du Colombier /y 131*219b2ee8SDavid du Colombier /z 132*219b2ee8SDavid du Colombier /braceleft 133*219b2ee8SDavid du Colombier /bar 134*219b2ee8SDavid du Colombier /braceright 135*219b2ee8SDavid du Colombier /asciitilde 136*219b2ee8SDavid du Colombier /.notdef 137*219b2ee8SDavid du Colombier /.notdef 138*219b2ee8SDavid du Colombier /.notdef 139*219b2ee8SDavid du Colombier /.notdef 140*219b2ee8SDavid du Colombier /.notdef 141*219b2ee8SDavid du Colombier /.notdef 142*219b2ee8SDavid du Colombier /.notdef 143*219b2ee8SDavid du Colombier /.notdef 144*219b2ee8SDavid du Colombier /.notdef 145*219b2ee8SDavid du Colombier /.notdef 146*219b2ee8SDavid du Colombier /.notdef 147*219b2ee8SDavid du Colombier /.notdef 148*219b2ee8SDavid du Colombier /.notdef 149*219b2ee8SDavid du Colombier /.notdef 150*219b2ee8SDavid du Colombier /.notdef 151*219b2ee8SDavid du Colombier /.notdef 152*219b2ee8SDavid du Colombier /.notdef 153*219b2ee8SDavid du Colombier /dotlessi 154*219b2ee8SDavid du Colombier /grave 155*219b2ee8SDavid du Colombier /acute 156*219b2ee8SDavid du Colombier /circumflex 157*219b2ee8SDavid du Colombier /tilde 158*219b2ee8SDavid du Colombier /macron 159*219b2ee8SDavid du Colombier /breve 160*219b2ee8SDavid du Colombier /dotaccent 161*219b2ee8SDavid du Colombier /dieresis 162*219b2ee8SDavid du Colombier /.notdef 163*219b2ee8SDavid du Colombier /ring 164*219b2ee8SDavid du Colombier /cedilla 165*219b2ee8SDavid du Colombier /.notdef 166*219b2ee8SDavid du Colombier /hungarumlaut 167*219b2ee8SDavid du Colombier /ogonek 168*219b2ee8SDavid du Colombier /caron 169*219b2ee8SDavid du Colombier /.notdef % was space 170*219b2ee8SDavid du Colombier /exclamdown 171*219b2ee8SDavid du Colombier /cent 172*219b2ee8SDavid du Colombier /sterling 173*219b2ee8SDavid du Colombier /currency 174*219b2ee8SDavid du Colombier /yen 175*219b2ee8SDavid du Colombier /brokenbar 176*219b2ee8SDavid du Colombier /section 177*219b2ee8SDavid du Colombier /dieresis 178*219b2ee8SDavid du Colombier /copyright 179*219b2ee8SDavid du Colombier /ordfeminine 180*219b2ee8SDavid du Colombier /guillemotleft 181*219b2ee8SDavid du Colombier /logicalnot 182*219b2ee8SDavid du Colombier /hyphen 183*219b2ee8SDavid du Colombier /registered 184*219b2ee8SDavid du Colombier /macron 185*219b2ee8SDavid du Colombier /degree 186*219b2ee8SDavid du Colombier /plusminus 187*219b2ee8SDavid du Colombier /twosuperior 188*219b2ee8SDavid du Colombier /threesuperior 189*219b2ee8SDavid du Colombier /acute 190*219b2ee8SDavid du Colombier /mu 191*219b2ee8SDavid du Colombier /paragraph 192*219b2ee8SDavid du Colombier /periodcentered 193*219b2ee8SDavid du Colombier /cedilla 194*219b2ee8SDavid du Colombier /onesuperior 195*219b2ee8SDavid du Colombier /ordmasculine 196*219b2ee8SDavid du Colombier /guillemotright 197*219b2ee8SDavid du Colombier /onequarter 198*219b2ee8SDavid du Colombier /onehalf 199*219b2ee8SDavid du Colombier /threequarters 200*219b2ee8SDavid du Colombier /questiondown 201*219b2ee8SDavid du Colombier /Agrave 202*219b2ee8SDavid du Colombier /Aacute 203*219b2ee8SDavid du Colombier /Acircumflex 204*219b2ee8SDavid du Colombier /Atilde 205*219b2ee8SDavid du Colombier /Adieresis 206*219b2ee8SDavid du Colombier /Aring 207*219b2ee8SDavid du Colombier /AE 208*219b2ee8SDavid du Colombier /Ccedilla 209*219b2ee8SDavid du Colombier /Egrave 210*219b2ee8SDavid du Colombier /Eacute 211*219b2ee8SDavid du Colombier /Ecircumflex 212*219b2ee8SDavid du Colombier /Edieresis 213*219b2ee8SDavid du Colombier /Igrave 214*219b2ee8SDavid du Colombier /Iacute 215*219b2ee8SDavid du Colombier /Icircumflex 216*219b2ee8SDavid du Colombier /Idieresis 217*219b2ee8SDavid du Colombier /Eth 218*219b2ee8SDavid du Colombier /Ntilde 219*219b2ee8SDavid du Colombier /Ograve 220*219b2ee8SDavid du Colombier /Oacute 221*219b2ee8SDavid du Colombier /Ocircumflex 222*219b2ee8SDavid du Colombier /Otilde 223*219b2ee8SDavid du Colombier /Odieresis 224*219b2ee8SDavid du Colombier /multiply 225*219b2ee8SDavid du Colombier /Oslash 226*219b2ee8SDavid du Colombier /Ugrave 227*219b2ee8SDavid du Colombier /Uacute 228*219b2ee8SDavid du Colombier /Ucircumflex 229*219b2ee8SDavid du Colombier /Udieresis 230*219b2ee8SDavid du Colombier /Yacute 231*219b2ee8SDavid du Colombier /Thorn 232*219b2ee8SDavid du Colombier /germandbls 233*219b2ee8SDavid du Colombier /agrave 234*219b2ee8SDavid du Colombier /aacute 235*219b2ee8SDavid du Colombier /acircumflex 236*219b2ee8SDavid du Colombier /atilde 237*219b2ee8SDavid du Colombier /adieresis 238*219b2ee8SDavid du Colombier /aring 239*219b2ee8SDavid du Colombier /ae 240*219b2ee8SDavid du Colombier /ccedilla 241*219b2ee8SDavid du Colombier /egrave 242*219b2ee8SDavid du Colombier /eacute 243*219b2ee8SDavid du Colombier /ecircumflex 244*219b2ee8SDavid du Colombier /edieresis 245*219b2ee8SDavid du Colombier /igrave 246*219b2ee8SDavid du Colombier /iacute 247*219b2ee8SDavid du Colombier /icircumflex 248*219b2ee8SDavid du Colombier /idieresis 249*219b2ee8SDavid du Colombier /eth 250*219b2ee8SDavid du Colombier /ntilde 251*219b2ee8SDavid du Colombier /ograve 252*219b2ee8SDavid du Colombier /oacute 253*219b2ee8SDavid du Colombier /ocircumflex 254*219b2ee8SDavid du Colombier /otilde 255*219b2ee8SDavid du Colombier /odieresis 256*219b2ee8SDavid du Colombier /divide 257*219b2ee8SDavid du Colombier /oslash 258*219b2ee8SDavid du Colombier /ugrave 259*219b2ee8SDavid du Colombier /uacute 260*219b2ee8SDavid du Colombier /ucircumflex 261*219b2ee8SDavid du Colombier /udieresis 262*219b2ee8SDavid du Colombier /yacute 263*219b2ee8SDavid du Colombier /thorn 264*219b2ee8SDavid du Colombier /ydieresis 265*219b2ee8SDavid du Colombier] def 266*219b2ee8SDavid du Colombier 267*219b2ee8SDavid du Colombier/NewFontDirectory FontDirectory maxlength dict def 268*219b2ee8SDavid du Colombier 269*219b2ee8SDavid du Colombier% 270*219b2ee8SDavid du Colombier% Apparently no guarantee findfont is defined in systemdict so the obvious 271*219b2ee8SDavid du Colombier% 272*219b2ee8SDavid du Colombier% systemdict /findfont get exec 273*219b2ee8SDavid du Colombier% 274*219b2ee8SDavid du Colombier% can generate an error. So far the only exception is a VT600 (version 48.0). 275*219b2ee8SDavid du Colombier% 276*219b2ee8SDavid du Colombier 277*219b2ee8SDavid du Colombieruserdict /@RealFindfont known not { 278*219b2ee8SDavid du Colombier userdict begin 279*219b2ee8SDavid du Colombier /@RealFindfont systemdict begin /findfont load end def 280*219b2ee8SDavid du Colombier end 281*219b2ee8SDavid du Colombier} if 282*219b2ee8SDavid du Colombier 283*219b2ee8SDavid du Colombier/findfont { 284*219b2ee8SDavid du Colombier dup NewFontDirectory exch known not { 285*219b2ee8SDavid du Colombier dup 286*219b2ee8SDavid du Colombier %dup systemdict /findfont get exec % not always in systemdict 287*219b2ee8SDavid du Colombier dup userdict /@RealFindfont get exec 288*219b2ee8SDavid du Colombier dup /Encoding get StandardEncoding eq { 289*219b2ee8SDavid du Colombier dup length 1 add dict begin 290*219b2ee8SDavid du Colombier {1 index /FID ne {def}{pop pop} ifelse} forall 291*219b2ee8SDavid du Colombier /Encoding UTFLatin1Encoding def 292*219b2ee8SDavid du Colombier /Metrics 1 dict def 293*219b2ee8SDavid du Colombier Metrics /.notdef 0 put 294*219b2ee8SDavid du Colombier currentdict 295*219b2ee8SDavid du Colombier end 296*219b2ee8SDavid du Colombier /DummyFontName exch definefont 297*219b2ee8SDavid du Colombier } if 298*219b2ee8SDavid du Colombier NewFontDirectory 3 1 roll put 299*219b2ee8SDavid du Colombier } if 300*219b2ee8SDavid du Colombier NewFontDirectory exch get 301*219b2ee8SDavid du Colombier} bind def 302*219b2ee8SDavid du Colombier 303*219b2ee8SDavid du Colombier% 304*219b2ee8SDavid du Colombier% Assume A0, except for A0A0 which is replaced by 20A0, can be ignored. 305*219b2ee8SDavid du Colombier% Works with ASCII or Latin1 because A0 has been re-encoded as a zero 306*219b2ee8SDavid du Colombier% width non-printing character. 307*219b2ee8SDavid du Colombier% 308*219b2ee8SDavid du Colombier 309*219b2ee8SDavid du Colombier/UTFstring { 310*219b2ee8SDavid du Colombier dup { 311*219b2ee8SDavid du Colombier (\240\240) search { 312*219b2ee8SDavid du Colombier pop 313*219b2ee8SDavid du Colombier 0 16#20 put 314*219b2ee8SDavid du Colombier }{pop exit} ifelse 315*219b2ee8SDavid du Colombier } loop 316*219b2ee8SDavid du Colombier} bind def 317*219b2ee8SDavid du Colombier 318*219b2ee8SDavid du Colombier/ashow {mark 4 1 roll UTFstring //ashow cvx exec cleartomark} bind def 319*219b2ee8SDavid du Colombier/awidthshow {mark 7 1 roll UTFstring //awidthshow cvx exec cleartomark} bind def 320*219b2ee8SDavid du Colombier/show {mark exch UTFstring //show cvx exec cleartomark} bind def 321*219b2ee8SDavid du Colombier/stringwidth {UTFstring //stringwidth cvx exec} bind def 322*219b2ee8SDavid du Colombier/widthshow {mark 5 1 roll UTFstring //widthshow cvx exec cleartomark} bind def 323*219b2ee8SDavid du Colombier 324*219b2ee8SDavid du Colombier% 325*219b2ee8SDavid du Colombier% kshow is harder - stack can't change because of the procedure. 326*219b2ee8SDavid du Colombier% 327*219b2ee8SDavid du Colombier 328*219b2ee8SDavid du Colombier/kshow dup load type /operatortype eq 329*219b2ee8SDavid du Colombier {{UTFstring kshow} bind} 330*219b2ee8SDavid du Colombier {{UTFstring //kshow cvx exec} bind} 331*219b2ee8SDavid du Colombierifelse def 332*219b2ee8SDavid du Colombier 333