13e12c5d1SDavid du Colombier% 23e12c5d1SDavid du Colombier% Encoding vector, operator and procedure redefinitions for Plan 9 UTF 33e12c5d1SDavid du Colombier% encoding. Prologues are expected to take steps to ensure operator 43e12c5d1SDavid du Colombier% redefinitions given here are actually used. Current implementation 53e12c5d1SDavid du Colombier% assumes UTF byte streams that represent ASCII or Latin1 text. 63e12c5d1SDavid du Colombier% 73e12c5d1SDavid du Colombier 83e12c5d1SDavid du Colombier/UTFLatin1Encoding [ 93e12c5d1SDavid du Colombier /.notdef 103e12c5d1SDavid du Colombier /.notdef 113e12c5d1SDavid du Colombier /.notdef 123e12c5d1SDavid du Colombier /.notdef 133e12c5d1SDavid du Colombier /.notdef 143e12c5d1SDavid du Colombier /.notdef 153e12c5d1SDavid du Colombier /.notdef 163e12c5d1SDavid du Colombier /.notdef 173e12c5d1SDavid du Colombier /.notdef 183e12c5d1SDavid du Colombier /.notdef 193e12c5d1SDavid du Colombier /.notdef 203e12c5d1SDavid du Colombier /.notdef 213e12c5d1SDavid du Colombier /.notdef 223e12c5d1SDavid du Colombier /.notdef 233e12c5d1SDavid du Colombier /.notdef 243e12c5d1SDavid du Colombier /.notdef 253e12c5d1SDavid du Colombier /.notdef 263e12c5d1SDavid du Colombier /.notdef 273e12c5d1SDavid du Colombier /.notdef 283e12c5d1SDavid du Colombier /.notdef 293e12c5d1SDavid du Colombier /.notdef 303e12c5d1SDavid du Colombier /.notdef 313e12c5d1SDavid du Colombier /.notdef 323e12c5d1SDavid du Colombier /.notdef 333e12c5d1SDavid du Colombier /.notdef 343e12c5d1SDavid du Colombier /.notdef 353e12c5d1SDavid du Colombier /.notdef 363e12c5d1SDavid du Colombier /.notdef 373e12c5d1SDavid du Colombier /.notdef 383e12c5d1SDavid du Colombier /.notdef 393e12c5d1SDavid du Colombier /.notdef 403e12c5d1SDavid du Colombier /.notdef 413e12c5d1SDavid du Colombier /space 423e12c5d1SDavid du Colombier /exclam 433e12c5d1SDavid du Colombier /quotedbl 443e12c5d1SDavid du Colombier /numbersign 453e12c5d1SDavid du Colombier /dollar 463e12c5d1SDavid du Colombier /percent 473e12c5d1SDavid du Colombier /ampersand 483e12c5d1SDavid du Colombier /quoteright 493e12c5d1SDavid du Colombier /parenleft 503e12c5d1SDavid du Colombier /parenright 513e12c5d1SDavid du Colombier /asterisk 523e12c5d1SDavid du Colombier /plus 533e12c5d1SDavid du Colombier /comma 543e12c5d1SDavid du Colombier /minus 553e12c5d1SDavid du Colombier /period 563e12c5d1SDavid du Colombier /slash 573e12c5d1SDavid du Colombier /zero 583e12c5d1SDavid du Colombier /one 593e12c5d1SDavid du Colombier /two 603e12c5d1SDavid du Colombier /three 613e12c5d1SDavid du Colombier /four 623e12c5d1SDavid du Colombier /five 633e12c5d1SDavid du Colombier /six 643e12c5d1SDavid du Colombier /seven 653e12c5d1SDavid du Colombier /eight 663e12c5d1SDavid du Colombier /nine 673e12c5d1SDavid du Colombier /colon 683e12c5d1SDavid du Colombier /semicolon 693e12c5d1SDavid du Colombier /less 703e12c5d1SDavid du Colombier /equal 713e12c5d1SDavid du Colombier /greater 723e12c5d1SDavid du Colombier /question 733e12c5d1SDavid du Colombier /at 743e12c5d1SDavid du Colombier /A 753e12c5d1SDavid du Colombier /B 763e12c5d1SDavid du Colombier /C 773e12c5d1SDavid du Colombier /D 783e12c5d1SDavid du Colombier /E 793e12c5d1SDavid du Colombier /F 803e12c5d1SDavid du Colombier /G 813e12c5d1SDavid du Colombier /H 823e12c5d1SDavid du Colombier /I 833e12c5d1SDavid du Colombier /J 843e12c5d1SDavid du Colombier /K 853e12c5d1SDavid du Colombier /L 863e12c5d1SDavid du Colombier /M 873e12c5d1SDavid du Colombier /N 883e12c5d1SDavid du Colombier /O 893e12c5d1SDavid du Colombier /P 903e12c5d1SDavid du Colombier /Q 913e12c5d1SDavid du Colombier /R 923e12c5d1SDavid du Colombier /S 933e12c5d1SDavid du Colombier /T 943e12c5d1SDavid du Colombier /U 953e12c5d1SDavid du Colombier /V 963e12c5d1SDavid du Colombier /W 973e12c5d1SDavid du Colombier /X 983e12c5d1SDavid du Colombier /Y 993e12c5d1SDavid du Colombier /Z 1003e12c5d1SDavid du Colombier /bracketleft 1013e12c5d1SDavid du Colombier /backslash 1023e12c5d1SDavid du Colombier /bracketright 1033e12c5d1SDavid du Colombier /asciicircum 1043e12c5d1SDavid du Colombier /underscore 1053e12c5d1SDavid du Colombier /quoteleft 1063e12c5d1SDavid du Colombier /a 1073e12c5d1SDavid du Colombier /b 1083e12c5d1SDavid du Colombier /c 1093e12c5d1SDavid du Colombier /d 1103e12c5d1SDavid du Colombier /e 1113e12c5d1SDavid du Colombier /f 1123e12c5d1SDavid du Colombier /g 1133e12c5d1SDavid du Colombier /h 1143e12c5d1SDavid du Colombier /i 1153e12c5d1SDavid du Colombier /j 1163e12c5d1SDavid du Colombier /k 1173e12c5d1SDavid du Colombier /l 1183e12c5d1SDavid du Colombier /m 1193e12c5d1SDavid du Colombier /n 1203e12c5d1SDavid du Colombier /o 1213e12c5d1SDavid du Colombier /p 1223e12c5d1SDavid du Colombier /q 1233e12c5d1SDavid du Colombier /r 1243e12c5d1SDavid du Colombier /s 1253e12c5d1SDavid du Colombier /t 1263e12c5d1SDavid du Colombier /u 1273e12c5d1SDavid du Colombier /v 1283e12c5d1SDavid du Colombier /w 1293e12c5d1SDavid du Colombier /x 1303e12c5d1SDavid du Colombier /y 1313e12c5d1SDavid du Colombier /z 1323e12c5d1SDavid du Colombier /braceleft 1333e12c5d1SDavid du Colombier /bar 1343e12c5d1SDavid du Colombier /braceright 1353e12c5d1SDavid du Colombier /asciitilde 1363e12c5d1SDavid du Colombier /.notdef 1373e12c5d1SDavid du Colombier /.notdef 1383e12c5d1SDavid du Colombier /.notdef 1393e12c5d1SDavid du Colombier /.notdef 1403e12c5d1SDavid du Colombier /.notdef 1413e12c5d1SDavid du Colombier /.notdef 1423e12c5d1SDavid du Colombier /.notdef 1433e12c5d1SDavid du Colombier /.notdef 1443e12c5d1SDavid du Colombier /.notdef 1453e12c5d1SDavid du Colombier /.notdef 1463e12c5d1SDavid du Colombier /.notdef 1473e12c5d1SDavid du Colombier /.notdef 1483e12c5d1SDavid du Colombier /.notdef 1493e12c5d1SDavid du Colombier /.notdef 1503e12c5d1SDavid du Colombier /.notdef 1513e12c5d1SDavid du Colombier /.notdef 1523e12c5d1SDavid du Colombier /.notdef 1533e12c5d1SDavid du Colombier /dotlessi 1543e12c5d1SDavid du Colombier /grave 1553e12c5d1SDavid du Colombier /acute 1563e12c5d1SDavid du Colombier /circumflex 1573e12c5d1SDavid du Colombier /tilde 1583e12c5d1SDavid du Colombier /macron 1593e12c5d1SDavid du Colombier /breve 1603e12c5d1SDavid du Colombier /dotaccent 1613e12c5d1SDavid du Colombier /dieresis 1623e12c5d1SDavid du Colombier /.notdef 1633e12c5d1SDavid du Colombier /ring 1643e12c5d1SDavid du Colombier /cedilla 1653e12c5d1SDavid du Colombier /.notdef 1663e12c5d1SDavid du Colombier /hungarumlaut 1673e12c5d1SDavid du Colombier /ogonek 1683e12c5d1SDavid du Colombier /caron 169*219b2ee8SDavid du Colombier /.notdef % was space 1703e12c5d1SDavid du Colombier /exclamdown 1713e12c5d1SDavid du Colombier /cent 1723e12c5d1SDavid du Colombier /sterling 1733e12c5d1SDavid du Colombier /currency 1743e12c5d1SDavid du Colombier /yen 1753e12c5d1SDavid du Colombier /brokenbar 1763e12c5d1SDavid du Colombier /section 1773e12c5d1SDavid du Colombier /dieresis 1783e12c5d1SDavid du Colombier /copyright 1793e12c5d1SDavid du Colombier /ordfeminine 1803e12c5d1SDavid du Colombier /guillemotleft 1813e12c5d1SDavid du Colombier /logicalnot 1823e12c5d1SDavid du Colombier /hyphen 1833e12c5d1SDavid du Colombier /registered 1843e12c5d1SDavid du Colombier /macron 1853e12c5d1SDavid du Colombier /degree 1863e12c5d1SDavid du Colombier /plusminus 1873e12c5d1SDavid du Colombier /twosuperior 1883e12c5d1SDavid du Colombier /threesuperior 1893e12c5d1SDavid du Colombier /acute 1903e12c5d1SDavid du Colombier /mu 1913e12c5d1SDavid du Colombier /paragraph 1923e12c5d1SDavid du Colombier /periodcentered 1933e12c5d1SDavid du Colombier /cedilla 1943e12c5d1SDavid du Colombier /onesuperior 1953e12c5d1SDavid du Colombier /ordmasculine 1963e12c5d1SDavid du Colombier /guillemotright 1973e12c5d1SDavid du Colombier /onequarter 1983e12c5d1SDavid du Colombier /onehalf 1993e12c5d1SDavid du Colombier /threequarters 2003e12c5d1SDavid du Colombier /questiondown 2013e12c5d1SDavid du Colombier /Agrave 2023e12c5d1SDavid du Colombier /Aacute 2033e12c5d1SDavid du Colombier /Acircumflex 2043e12c5d1SDavid du Colombier /Atilde 2053e12c5d1SDavid du Colombier /Adieresis 2063e12c5d1SDavid du Colombier /Aring 2073e12c5d1SDavid du Colombier /AE 2083e12c5d1SDavid du Colombier /Ccedilla 2093e12c5d1SDavid du Colombier /Egrave 2103e12c5d1SDavid du Colombier /Eacute 2113e12c5d1SDavid du Colombier /Ecircumflex 2123e12c5d1SDavid du Colombier /Edieresis 2133e12c5d1SDavid du Colombier /Igrave 2143e12c5d1SDavid du Colombier /Iacute 2153e12c5d1SDavid du Colombier /Icircumflex 2163e12c5d1SDavid du Colombier /Idieresis 2173e12c5d1SDavid du Colombier /Eth 2183e12c5d1SDavid du Colombier /Ntilde 2193e12c5d1SDavid du Colombier /Ograve 2203e12c5d1SDavid du Colombier /Oacute 2213e12c5d1SDavid du Colombier /Ocircumflex 2223e12c5d1SDavid du Colombier /Otilde 2233e12c5d1SDavid du Colombier /Odieresis 2243e12c5d1SDavid du Colombier /multiply 2253e12c5d1SDavid du Colombier /Oslash 2263e12c5d1SDavid du Colombier /Ugrave 2273e12c5d1SDavid du Colombier /Uacute 2283e12c5d1SDavid du Colombier /Ucircumflex 2293e12c5d1SDavid du Colombier /Udieresis 2303e12c5d1SDavid du Colombier /Yacute 2313e12c5d1SDavid du Colombier /Thorn 2323e12c5d1SDavid du Colombier /germandbls 2333e12c5d1SDavid du Colombier /agrave 2343e12c5d1SDavid du Colombier /aacute 2353e12c5d1SDavid du Colombier /acircumflex 2363e12c5d1SDavid du Colombier /atilde 2373e12c5d1SDavid du Colombier /adieresis 2383e12c5d1SDavid du Colombier /aring 2393e12c5d1SDavid du Colombier /ae 2403e12c5d1SDavid du Colombier /ccedilla 2413e12c5d1SDavid du Colombier /egrave 2423e12c5d1SDavid du Colombier /eacute 2433e12c5d1SDavid du Colombier /ecircumflex 2443e12c5d1SDavid du Colombier /edieresis 2453e12c5d1SDavid du Colombier /igrave 2463e12c5d1SDavid du Colombier /iacute 2473e12c5d1SDavid du Colombier /icircumflex 2483e12c5d1SDavid du Colombier /idieresis 2493e12c5d1SDavid du Colombier /eth 2503e12c5d1SDavid du Colombier /ntilde 2513e12c5d1SDavid du Colombier /ograve 2523e12c5d1SDavid du Colombier /oacute 2533e12c5d1SDavid du Colombier /ocircumflex 2543e12c5d1SDavid du Colombier /otilde 2553e12c5d1SDavid du Colombier /odieresis 2563e12c5d1SDavid du Colombier /divide 2573e12c5d1SDavid du Colombier /oslash 2583e12c5d1SDavid du Colombier /ugrave 2593e12c5d1SDavid du Colombier /uacute 2603e12c5d1SDavid du Colombier /ucircumflex 2613e12c5d1SDavid du Colombier /udieresis 2623e12c5d1SDavid du Colombier /yacute 2633e12c5d1SDavid du Colombier /thorn 2643e12c5d1SDavid du Colombier /ydieresis 2653e12c5d1SDavid du Colombier] def 2663e12c5d1SDavid du Colombier 2673e12c5d1SDavid du Colombier/NewFontDirectory FontDirectory maxlength dict def 2683e12c5d1SDavid du Colombier 2693e12c5d1SDavid du Colombier% 2703e12c5d1SDavid du Colombier% Apparently no guarantee findfont is defined in systemdict so the obvious 2713e12c5d1SDavid du Colombier% 2723e12c5d1SDavid du Colombier% systemdict /findfont get exec 2733e12c5d1SDavid du Colombier% 2743e12c5d1SDavid du Colombier% can generate an error. So far the only exception is a VT600 (version 48.0). 2753e12c5d1SDavid du Colombier% 2763e12c5d1SDavid du Colombier 2773e12c5d1SDavid du Colombieruserdict /@RealFindfont known not { 2783e12c5d1SDavid du Colombier userdict begin 2793e12c5d1SDavid du Colombier /@RealFindfont systemdict begin /findfont load end def 2803e12c5d1SDavid du Colombier end 2813e12c5d1SDavid du Colombier} if 2823e12c5d1SDavid du Colombier 2833e12c5d1SDavid du Colombier/findfont { 2843e12c5d1SDavid du Colombier dup NewFontDirectory exch known not { 2853e12c5d1SDavid du Colombier dup 2863e12c5d1SDavid du Colombier %dup systemdict /findfont get exec % not always in systemdict 2873e12c5d1SDavid du Colombier dup userdict /@RealFindfont get exec 2883e12c5d1SDavid du Colombier dup /Encoding get StandardEncoding eq { 2893e12c5d1SDavid du Colombier dup length 1 add dict begin 2903e12c5d1SDavid du Colombier {1 index /FID ne {def}{pop pop} ifelse} forall 2913e12c5d1SDavid du Colombier /Encoding UTFLatin1Encoding def 2923e12c5d1SDavid du Colombier /Metrics 1 dict def 2933e12c5d1SDavid du Colombier Metrics /.notdef 0 put 2943e12c5d1SDavid du Colombier currentdict 2953e12c5d1SDavid du Colombier end 2963e12c5d1SDavid du Colombier /DummyFontName exch definefont 2973e12c5d1SDavid du Colombier } if 2983e12c5d1SDavid du Colombier NewFontDirectory 3 1 roll put 2993e12c5d1SDavid du Colombier } if 3003e12c5d1SDavid du Colombier NewFontDirectory exch get 3013e12c5d1SDavid du Colombier} bind def 3023e12c5d1SDavid du Colombier 3033e12c5d1SDavid 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. 3073e12c5d1SDavid du Colombier% 3083e12c5d1SDavid du Colombier 3093e12c5d1SDavid du Colombier/UTFstring { 3103e12c5d1SDavid du Colombier dup { 311*219b2ee8SDavid du Colombier (\240\240) search { 3123e12c5d1SDavid du Colombier pop 313*219b2ee8SDavid du Colombier 0 16#20 put 3143e12c5d1SDavid du Colombier }{pop exit} ifelse 3153e12c5d1SDavid du Colombier } loop 3163e12c5d1SDavid du Colombier} bind def 3173e12c5d1SDavid du Colombier 3183e12c5d1SDavid du Colombier/ashow {mark 4 1 roll UTFstring //ashow cvx exec cleartomark} bind def 3193e12c5d1SDavid du Colombier/awidthshow {mark 7 1 roll UTFstring //awidthshow cvx exec cleartomark} bind def 3203e12c5d1SDavid du Colombier/show {mark exch UTFstring //show cvx exec cleartomark} bind def 3213e12c5d1SDavid du Colombier/stringwidth {UTFstring //stringwidth cvx exec} bind def 3223e12c5d1SDavid du Colombier/widthshow {mark 5 1 roll UTFstring //widthshow cvx exec cleartomark} bind def 3233e12c5d1SDavid du Colombier 3243e12c5d1SDavid du Colombier% 3253e12c5d1SDavid du Colombier% kshow is harder - stack can't change because of the procedure. 3263e12c5d1SDavid du Colombier% 3273e12c5d1SDavid du Colombier 3283e12c5d1SDavid du Colombier/kshow dup load type /operatortype eq 3293e12c5d1SDavid du Colombier {{UTFstring kshow} bind} 3303e12c5d1SDavid du Colombier {{UTFstring //kshow cvx exec} bind} 3313e12c5d1SDavid du Colombierifelse def 3323e12c5d1SDavid du Colombier 333