source: trunk/poppler/mypoppler/poppler/Object.cc @ 2

Last change on this file since 2 was 2, checked in by Eugene Romanenko, 15 years ago

First import

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