343 lines · 4.4 KB · Text
RawDownload
%% 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