]> git.ipfire.org Git - thirdparty/cups.git/blob - pdftops/Object.cxx
Load cups into easysw/current.
[thirdparty/cups.git] / pdftops / Object.cxx
1 //========================================================================
2 //
3 // Object.cc
4 //
5 // Copyright 1996-2003 Glyph & Cog, LLC
6 //
7 //========================================================================
8
9 #include <config.h>
10
11 #ifdef USE_GCC_PRAGMAS
12 #pragma implementation
13 #endif
14
15 #include <stddef.h>
16 #include "Object.h"
17 #include "Array.h"
18 #include "Dict.h"
19 #include "Error.h"
20 #include "Stream.h"
21 #include "XRef.h"
22
23 //------------------------------------------------------------------------
24 // Object
25 //------------------------------------------------------------------------
26
27 char *objTypeNames[numObjTypes] = {
28 "boolean",
29 "integer",
30 "real",
31 "string",
32 "name",
33 "null",
34 "array",
35 "dictionary",
36 "stream",
37 "ref",
38 "cmd",
39 "error",
40 "eof",
41 "none"
42 };
43
44 #ifdef DEBUG_MEM
45 int Object::numAlloc[numObjTypes] =
46 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
47 #endif
48
49 Object *Object::initArray(XRef *xref) {
50 initObj(objArray);
51 array = new Array(xref);
52 return this;
53 }
54
55 Object *Object::initDict(XRef *xref) {
56 initObj(objDict);
57 dict = new Dict(xref);
58 return this;
59 }
60
61 Object *Object::initDict(Dict *dictA) {
62 initObj(objDict);
63 dict = dictA;
64 dict->incRef();
65 return this;
66 }
67
68 Object *Object::initStream(Stream *streamA) {
69 initObj(objStream);
70 stream = streamA;
71 return this;
72 }
73
74 Object *Object::copy(Object *obj) {
75 *obj = *this;
76 switch (type) {
77 case objString:
78 obj->string = string->copy();
79 break;
80 case objName:
81 obj->name = copyString(name);
82 break;
83 case objArray:
84 array->incRef();
85 break;
86 case objDict:
87 dict->incRef();
88 break;
89 case objStream:
90 stream->incRef();
91 break;
92 case objCmd:
93 obj->cmd = copyString(cmd);
94 break;
95 default:
96 break;
97 }
98 #ifdef DEBUG_MEM
99 ++numAlloc[type];
100 #endif
101 return obj;
102 }
103
104 Object *Object::fetch(XRef *xref, Object *obj) {
105 return (type == objRef && xref) ?
106 xref->fetch(ref.num, ref.gen, obj) : copy(obj);
107 }
108
109 void Object::free() {
110 switch (type) {
111 case objString:
112 delete string;
113 break;
114 case objName:
115 gfree(name);
116 break;
117 case objArray:
118 if (!array->decRef()) {
119 delete array;
120 }
121 break;
122 case objDict:
123 if (!dict->decRef()) {
124 delete dict;
125 }
126 break;
127 case objStream:
128 if (!stream->decRef()) {
129 delete stream;
130 }
131 break;
132 case objCmd:
133 gfree(cmd);
134 break;
135 default:
136 break;
137 }
138 #ifdef DEBUG_MEM
139 --numAlloc[type];
140 #endif
141 type = objNone;
142 }
143
144 char *Object::getTypeName() {
145 return objTypeNames[type];
146 }
147
148 void Object::print(FILE *f) {
149 Object obj;
150 int i;
151
152 switch (type) {
153 case objBool:
154 fprintf(f, "%s", booln ? "true" : "false");
155 break;
156 case objInt:
157 fprintf(f, "%d", intg);
158 break;
159 case objReal:
160 fprintf(f, "%g", real);
161 break;
162 case objString:
163 fprintf(f, "(");
164 fwrite(string->getCString(), 1, string->getLength(), f);
165 fprintf(f, ")");
166 break;
167 case objName:
168 fprintf(f, "/%s", name);
169 break;
170 case objNull:
171 fprintf(f, "null");
172 break;
173 case objArray:
174 fprintf(f, "[");
175 for (i = 0; i < arrayGetLength(); ++i) {
176 if (i > 0)
177 fprintf(f, " ");
178 arrayGetNF(i, &obj);
179 obj.print(f);
180 obj.free();
181 }
182 fprintf(f, "]");
183 break;
184 case objDict:
185 fprintf(f, "<<");
186 for (i = 0; i < dictGetLength(); ++i) {
187 fprintf(f, " /%s ", dictGetKey(i));
188 dictGetValNF(i, &obj);
189 obj.print(f);
190 obj.free();
191 }
192 fprintf(f, " >>");
193 break;
194 case objStream:
195 fprintf(f, "<stream>");
196 break;
197 case objRef:
198 fprintf(f, "%d %d R", ref.num, ref.gen);
199 break;
200 case objCmd:
201 fprintf(f, "%s", cmd);
202 break;
203 case objError:
204 fprintf(f, "<error>");
205 break;
206 case objEOF:
207 fprintf(f, "<EOF>");
208 break;
209 case objNone:
210 fprintf(f, "<none>");
211 break;
212 }
213 }
214
215 void Object::memCheck(FILE *f) {
216 #ifdef DEBUG_MEM
217 int i;
218 int t;
219
220 t = 0;
221 for (i = 0; i < numObjTypes; ++i)
222 t += numAlloc[i];
223 if (t > 0) {
224 fprintf(f, "Allocated objects:\n");
225 for (i = 0; i < numObjTypes; ++i) {
226 if (numAlloc[i] > 0)
227 fprintf(f, " %-20s: %6d\n", objTypeNames[i], numAlloc[i]);
228 }
229 }
230 #endif
231 }