]> git.lizzy.rs Git - plan9front.git/blob - sys/lib/ghostscript/gs_cidfm.ps
acid leak: remove arena pointer a < 0xff000000 check
[plan9front.git] / sys / lib / ghostscript / gs_cidfm.ps
1 %    Copyright (C) 2000 artofcode LLC.  All rights reserved.
2
3 % This software is provided AS-IS with no warranty, either express or
4 % implied.
5
6 % This software is distributed under license and may not be copied,
7 % modified or distributed except as expressly authorized under the terms
8 % of the license contained in the file LICENSE in this distribution.
9
10 % For more information about licensing, please refer to
11 % http://www.ghostscript.com/licensing/. For information on
12 % commercial licensing, go to http://www.artifex.com/licensing/ or
13 % contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14 % San Rafael, CA  94903, U.S.A., +1(415)492-9861.
15
16 % $Id: gs_cidfm.ps,v 1.7 2004/10/25 15:11:37 igor Exp $
17 % Redefine CIDFont category with cidfmap .
18
19 languagelevel 2 .setlanguagelevel
20
21 4 dict begin
22 /CategoryName /CIDFont def
23
24 /MapFileName (cidfmap) def
25
26 /IsMyRecord      % <raw_record> -> <raw_record> bool
27 { % Only for client's needs.
28   dup type /nametype eq
29 } bind def
30
31 /RecordVirtualMethods 3 dict begin
32
33   /MakeInstance   % <Name> <record> MakeInstance <Name> <Instance> <size>
34   { % We know that currentdict is the category.
35     /Substitute get FindResource            % /Name <<CIDFont>>
36     dup length dict copy                    % /Name <<CIDFont>>
37     1 index ResourceStatus pop exch pop     % /Name <<CIDFont>> size
38   } bind def
39
40   /GetFilePath  % <scratch> <Name> <record> GetFilePath <filepath>
41   { % We know that currentdict is the category.
42     exch pop
43     /Substitute get exch ResourceFileName
44   } bind def
45
46   /GetSize   % <Name> <record> GetSize <size>
47   { % We know that currentdict is the category.
48     /Substitute get ResourceStatus {
49       exch pop exch pop
50     } {
51       /undefinedresource signalerror
52     } ifelse
53   } bind def
54
55   /GetCSI   % <record> GetCSI null
56             % <record> GetCSI dict
57   { % We know that currentdict is the category.
58     RESMPDEBUG { (cidfm GetCSI beg ) = } if
59     /Substitute get                     % /Name
60     GetCIDSystemInfoFromMap
61     RESMPDEBUG { (cidfm GetCSI end ) print dup = } if
62   } bind def
63
64   /IsActive % <record> IsActive <bool>
65   { pop true
66   } bind def
67
68 currentdict end def
69
70 /VerifyMap  % <raw_map> VerifyMap -
71 { % Checks for vicious substitution cycles.
72   dup length dict copy                  % <<map>>
73   dup length dict                       % <<map>> <<temp>>
74   { % Choose a random record :
75     true 2 index {                      % <<map>> <<temp>> true /Name /Subs
76       3 2 roll pop false exit           % <<map>> <<temp>> /Name /Subs false
77     } forall
78     { exit                              % <<map>> <<temp>>
79     } if                                % <<map>> <<temp>> /Name /Subs
80     % Move the substitution chain to <<temp>>, checking for a cycle :
81     3 index 2 index undef               % <<map>> <<temp>> /Name /Subs
82     exch 2 index exch 0 put             % <<map>> <<temp>> /Subs
83     { //IsMyRecord exec not {
84         % Not a substitution, the chain terminates.
85         pop exit                        % <<map>> <<temp>>
86       } if                              % <<map>> <<temp>> /Subs
87       1 index 1 index known {
88         (Vicious substitution cycle in map file with the entry ) print =string cvs print ( .) =
89         /VerifyMap cvx /undefinedresource signalerror
90       } if                              % <<map>> <<temp>> /Subs
91       1 index 1 index 0 put
92       dup 3 index exch .knownget not {  % <<map>> <<temp>> /Subs
93         % No more substitutions, the chain terminates.
94         pop exit                        % <<map>> <<temp>>
95       } if                              % <<map>> <<temp>> /Subs /Subs1
96       exch                              % <<map>> <<temp>> /Subs1 /Subs
97       3 index exch undef                % <<map>> <<temp>> /Subs1
98     } loop
99     % Not cycled, now purge the <<temp>> :
100     { % Choose a random record :
101       true 1 index {                    % <<map>> <<temp>> true /Name /Subs
102         3 2 roll pop false exit         % <<map>> <<temp>> /Name /Subs false
103       } forall
104       { exit                            % <<map>> <<temp>>
105       } if                              % <<map>> <<temp>> /Name /Subs
106       % Remove it :
107       pop 1 index exch undef            % <<map>> <<temp>>
108     } loop
109   } loop
110   pop pop                               %
111 } bind def
112
113 /PreprocessRecord  % <map> <Name> <raw_record> PreprocessRecord <map> <Name> <record> <bool>
114 { //IsMyRecord exec {
115     1 dict begin
116     /Substitute exch def
117     /RecordVirtualMethods //RecordVirtualMethods def
118     currentdict end
119     true
120   } {
121     false
122   } ifelse
123 } bind def
124
125 currentdict end 
126
127 /MappedCategoryRedefiner /ProcSet findresource /Redefine get exec
128
129 .setlanguagelevel