home *** CD-ROM | disk | FTP | other *** search
/ Acorn User 10 / AU_CD10.iso / Updates / GhostScript / !GhostScr / 6_01 / lib / gs_btokn.ps < prev    next >
Text File  |  2000-03-09  |  11KB  |  318 lines

  1. %    Copyright (C) 1994, 2000 Aladdin Enterprises.  All rights reserved.
  2. % This file is part of Aladdin Ghostscript.
  3. % Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND.  No author
  4. % or distributor accepts any responsibility for the consequences of using it,
  5. % or for whether it serves any particular purpose or works at all, unless he
  6. % or she says so in writing.  Refer to the Aladdin Ghostscript Free Public
  7. % License (the "License") for full details.
  8. % Every copy of Aladdin Ghostscript must include a copy of the License,
  9. % normally in a plain ASCII text file named PUBLIC.  The License grants you
  10. % the right to copy, modify and redistribute Aladdin Ghostscript, but only
  11. % under certain conditions described in the License.  Among other things, the
  12. % License requires that the copyright notice and this notice be preserved on
  13. % all copies.
  14.  
  15. % $Id: gs_btokn.ps,v 1.2 2000/03/10 04:27:31 lpd Exp $
  16. % Initialization file for binary tokens.
  17. % When this is run, systemdict is still writable,
  18. % but everything defined here goes into level2dict.
  19.  
  20. % Define whether or not to allow writing dictionaries.
  21. % This is a non-standard feature!
  22. /WRITEDICTS false def
  23.  
  24. languagelevel 1 .setlanguagelevel
  25. level2dict begin
  26.  
  27. % Initialization for the system name table.
  28.  
  29. mark
  30. % 0
  31.     /abs /add /aload /anchorsearch /and
  32.     /arc /arcn /arct /arcto /array
  33.     /ashow /astore /awidthshow /begin /bind
  34.     /bitshift /ceiling /charpath /clear /cleartomark
  35. % 20
  36.     /clip /clippath /closepath /concat /concatmatrix
  37.     /copy /count /counttomark /currentcmykcolor /currentdash
  38.     /currentdict /currentfile /currentfont /currentgray /currentgstate
  39.     /currenthsbcolor /currentlinecap /currentlinejoin /currentlinewidth /currentmatrix
  40. % 40
  41.     /currentpoint /currentrgbcolor /currentshared /curveto /cvi
  42.     /cvlit /cvn /cvr /cvrs /cvs
  43.     /cvx /def /defineusername /dict /div
  44.     /dtransform /dup /end /eoclip /eofill
  45. % 60
  46.     /eoviewclip /eq /exch /exec /exit
  47.     /file /fill /findfont /flattenpath /floor
  48.     /flush /flushfile /for /forall /ge
  49.     /get /getinterval /grestore /gsave /gstate
  50. % 80
  51.     /gt /identmatrix /idiv /idtransform /if
  52.     /ifelse /image /imagemask /index /ineofill
  53.     /infill /initviewclip /inueofill /inufill /invertmatrix
  54.     /itransform /known /le /length /lineto
  55. % 100
  56.     /load /loop /lt /makefont /matrix
  57.     /maxlength /mod /moveto /mul /ne
  58.     /neg /newpath /not /null /or
  59.     /pathbbox /pathforall /pop /print /printobject
  60. % 120
  61.     /put /putinterval /rcurveto /read /readhexstring
  62.     /readline /readstring /rectclip /rectfill /rectstroke
  63.     /rectviewclip /repeat /restore /rlineto /rmoveto
  64.     /roll /rotate /round /save /scale
  65. % 140
  66.     /scalefont /search /selectfont /setbbox /setcachedevice
  67.     /setcachedevice2 /setcharwidth /setcmykcolor /setdash /setfont
  68.     /setgray /setgstate /sethsbcolor /setlinecap /setlinejoin
  69.     /setlinewidth /setmatrix /setrgbcolor /setshared /shareddict
  70. % 160
  71.     /show /showpage /stop /stopped /store
  72.     /string /stringwidth /stroke /strokepath /sub
  73.     /systemdict /token /transform /translate /truncate
  74.     /type /uappend /ucache /ueofill /ufill
  75. % 180
  76.     /undef /upath /userdict /ustroke /viewclip
  77.     /viewclippath /where /widthshow /write /writehexstring
  78.     /writeobject /writestring /wtranslation /xor /xshow
  79.     /xyshow /yshow /FontDirectory /SharedFontDirectory /Courier
  80. % 200
  81.     /Courier-Bold /Courier-BoldOblique /Courier-Oblique /Helvetica /Helvetica-Bold
  82.     /Helvetica-BoldOblique /Helvetica-Oblique /Symbol /Times-Bold /Times-BoldItalic
  83.     /Times-Italic /Times-Roman /execuserobject /currentcolor /currentcolorspace
  84.     /currentglobal /execform /filter /findresource /globaldict
  85. % 220
  86.     /makepattern /setcolor /setcolorspace /setglobal /setpagedevice
  87.     /setpattern
  88. % pad to 256
  89.     counttomark 256 exch sub { 0 } repeat
  90. % 256
  91.     /= /== /ISOLatin1Encoding /StandardEncoding
  92. % 260
  93.     ([) cvn (]) cvn /atan /banddevice /bytesavailable
  94.     /cachestatus /closefile /colorimage /condition /copypage
  95.     /cos /countdictstack /countexecstack /cshow /currentblackgeneration
  96.     /currentcacheparams /currentcolorscreen /currentcolortransfer /currentcontext /currentflat
  97. % 280
  98.     /currenthalftone /currenthalftonephase /currentmiterlimit /currentobjectformat /currentpacking
  99.     /currentscreen /currentstrokeadjust /currenttransfer /currentundercolorremoval /defaultmatrix
  100.     /definefont /deletefile /detach /deviceinfo /dictstack
  101.     /echo /erasepage /errordict /execstack /executeonly
  102. % 300
  103.     /exp /false /filenameforall /fileposition /fork
  104.     /framedevice /grestoreall /handleerror /initclip /initgraphics
  105.     /initmatrix /instroke /inustroke /join /kshow
  106.     /ln /lock /log /mark /monitor
  107. % 320
  108.     /noaccess /notify /nulldevice /packedarray /quit
  109.     /rand /rcheck /readonly /realtime /renamefile
  110.     /renderbands /resetfile /reversepath /rootfont /rrand
  111.     /run /scheck /setblackgeneration /setcachelimit /setcacheparams
  112. % 340
  113.     /setcolorscreen /setcolortransfer /setfileposition /setflat /sethalftone
  114.     /sethalftonephase /setmiterlimit /setobjectformat /setpacking /setscreen
  115.     /setstrokeadjust /settransfer /setucacheparams /setundercolorremoval /sin
  116.     /sqrt /srand /stack /status /statusdict
  117. % 360
  118.     /true /ucachestatus /undefinefont /usertime /ustrokepath
  119.     /version /vmreclaim /vmstatus /wait /wcheck
  120.     /xcheck /yield /defineuserobject /undefineuserobject /UserObjects
  121.     /cleardictstack
  122. % 376
  123.     /A /B /C /D /E /F /G /H /I /J /K /L /M
  124.     /N /O /P /Q /R /S /T /U /V /W /X /Y /Z
  125.     /a /b /c /d /e /f /g /h /i /j /k /l /m
  126.     /n /o /p /q /r /s /t /u /v /w /x /y /z
  127. % 428
  128.     /setvmthreshold (<<) cvn
  129.     (>>) cvn /currentcolorrendering /currentdevparams /currentoverprint /currentpagedevice
  130.     /currentsystemparams /currentuserparams /defineresource /findencoding /gcheck
  131. % 440
  132.     /glyphshow /languagelevel /product /pstack /resourceforall
  133.     /resourcestatus /revision /serialnumber /setcolorrendering /setdevparams
  134.     /setoverprint /setsystemparams /setuserparams /startjob /undefineresource
  135.     /GlobalFontDirectory /ASCII85Decode /ASCII85Encode /ASCIIHexDecode /ASCIIHexEncode
  136. % 460
  137.     /CCITTFaxDecode /CCITTFaxEncode /DCTDecode /DCTEncode /LZWDecode
  138.     /LZWEncode /NullEncode /RunLengthDecode /RunLengthEncode /SubFileDecode
  139.     /CIEBasedA /CIEBasedABC /DeviceCMYK /DeviceGray /DeviceRGB
  140.     /Indexed /Pattern /Separation /CIEBasedDEF /CIEBasedDEFG
  141. % 480
  142.     /DeviceN
  143. % 481 -- end
  144. .packtomark
  145. dup /SystemNames exch def .installsystemnames
  146.  
  147. % Define printobject and writeobject.
  148. % These are mostly implemented in PostScript, so that we don't have to
  149. % worry about interrupts or callbacks when writing to the output file.
  150.  
  151. % Define procedures for accumulating the space required to represent
  152. % an object in binary form.
  153. /cntdict mark        % <#refs> <#chars> <obj> -proc- <#refs> <#chars>
  154.   /integertype /pop load
  155.   /realtype 1 index
  156.   /marktype 1 index
  157.   /nulltype 1 index
  158.   /booleantype 1 index
  159.   /nametype { length add } bind
  160.   /stringtype 1 index
  161.   /arraytype null
  162.   /dicttype null
  163. .dicttomark def
  164. cntdict /arraytype {
  165.   dup dup length 5 -1 roll add 4 2 roll {
  166.     dup type //cntdict exch get exec
  167.   } forall
  168. } bind put
  169. cntdict /dicttype {
  170.   WRITEDICTS {
  171.     dup dup length 2 mul 5 -1 roll add 4 2 roll {
  172.       4 1 roll dup type //cntdict exch get exec
  173.       3 -1 roll dup type //cntdict exch get exec
  174.     } forall
  175.   } {
  176.     /writeobject load /typecheck signalerror
  177.   } ifelse
  178. } bind put
  179.  
  180. /w2dict mark
  181.   /nametype { 2 copy .writecvs pop } bind
  182.   /stringtype 1 index
  183. .dicttomark def
  184.  
  185. /.bosheader {        % <top_length> <total_length> <string8> .bosheader
  186.             %   <string4|8>
  187.   dup 0 currentobjectformat 127 add put        % object format => BOS tag
  188.   2 index 255 le 2 index 65531 le and {
  189.     % Use the short header format: tag toplen(1) totlen(2)
  190.     exch 4 add exch
  191.     0 4 getinterval
  192.     dup 1 5 -1 roll put
  193.   } {
  194.     % Use the long header format: tag 0(1) toplen(2) totlen(4)
  195.     exch 8 add exch
  196.     0 0 4 2 roll .bosobject exch pop exch pop    % store with byte swapping
  197.   } ifelse        % Stack: shortlen str
  198.   exch dup -8 bitshift exch 255 and    % str hibyte lobyte
  199.   currentobjectformat 1 and 0 eq {    % lsb first
  200.     exch
  201.   } if
  202.   2 index 3 3 -1 roll put
  203.   1 index 2 3 -1 roll put
  204. } .bind def
  205.  
  206. /.writeobjects {    % <file> <tag> <array> .writeobjects -
  207.   mark exch
  208.  
  209.     % Count the space required for refs and strings.
  210.  
  211.   dup length 0 3 -1 roll
  212.     % Stack: file tag -mark- #refs #chars array
  213.   dup 4 1 roll {
  214.     dup type //cntdict exch get exec
  215.    } forall
  216.  
  217.     % Write the header.
  218.  
  219.     % Stack: file tag -mark- array1 ... array|dictN #refs #chars
  220.   counttomark 3 add -2 roll 4 1 roll
  221.     % Stack: -mark- array1 ... array|dictN tag #refs #chars file
  222.   dup counttomark 1 sub index length
  223.   4 index 3 bitshift 4 index add
  224.   (xxxxxxxx) .bosheader writestring
  225.  
  226.     % Write the objects per se.
  227.  
  228.   3 1 roll pop
  229.   counttomark 1 sub index length 3 bitshift exch
  230.   3 bitshift
  231.     % Stack: -mark- array1 ... array|dictN tag file ref# char#
  232.   counttomark 4 sub {
  233.     counttomark -1 roll dup 6 1 roll
  234.     dup type /dicttype eq {        % can't be first object
  235.       { 5 1 roll (xxxxxxxx) .bosobject
  236.     3 index exch writestring
  237.     4 -1 roll (xxxxxxxx) .bosobject
  238.     3 index exch writestring
  239.       } forall
  240.     } {
  241.       { (xxxxxxxx) .bosobject
  242.     dup 1 6 index put
  243.     3 index exch writestring
  244.     4 -1 roll pop 0 4 1 roll    % clear tag
  245.       } forall
  246.     } ifelse
  247.   } repeat
  248.  
  249.     % Write the strings and names.
  250.  
  251.   pop pop exch pop
  252.     % Stack: -mark- array1 ... array|dictN file
  253.   counttomark 1 sub {
  254.     counttomark -1 roll {
  255.         % The counting pass ensured that the keys and values
  256.         % of any dictionary must be writable objects.
  257.         % Hence, we are processing a dictionary iff
  258.         % the next-to-top stack element is not a file.
  259.       1 index type /filetype ne {
  260.     exch 2 index exch dup type //w2dict exch .knownget
  261.      { exec } { pop } ifelse pop
  262.       } if
  263.       dup type //w2dict exch .knownget { exec } { pop } ifelse
  264.     } forall
  265.   } repeat
  266.  
  267.     % Clean up.
  268.  
  269.     % Stack: -mark- file
  270.   pop pop
  271.  
  272. } odef
  273.  
  274. /printobject {        % <obj> <tag> printobject -
  275.   (%stdout) (w) file 2 index 2 index writeobject pop pop
  276. } odef
  277. /writeobject {        % <file> <obj> <tag> writeobject -
  278.   3 copy exch
  279.         % We must allocate the array in local VM
  280.         % to avoid a possible invalidaccess.
  281.   .currentglobal false .setglobal exch 1 array astore exch .setglobal
  282.   .writeobjects pop pop pop
  283. } odef
  284.  
  285. % Implement binary error message output.
  286. /.objectprinttest {        % <obj> .objectprinttest -
  287.         % This is a pseudo-operator so it will restore the stack
  288.         % if it gets an error.
  289.   0 0 2 index dup type //cntdict exch get exec pop pop
  290. } bind odef
  291. /.printerror {
  292.   $error /binary get .languagelevel 2 ge and {
  293.     currentobjectformat 0 ne {
  294.       [ /Error $error /errorname get $error /command get
  295.         % Convert the object with cvs if it isn't printable.
  296.       dup { .objectprinttest } .internalstopped {
  297.     pop 100 string cvs
  298.       } if
  299.       false ] 250 printobject
  300.     }
  301.     //.printerror    % known to be a procedure
  302.     ifelse
  303.   }
  304.   //.printerror        % known to be a procedure
  305.   ifelse
  306. } bind def
  307.  
  308. currentdict /cntdict .undef
  309. currentdict /w2dict .undef
  310.  
  311. % End of level2dict
  312.  
  313. end
  314. .setlanguagelevel
  315.