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