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

Last change on this file since 461 was 461, checked in by Silvan Scherrer, 11 years ago

poppler update to 0.14.2

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