beta-0.89.2
[luatex.git] / source / libs / poppler / poppler-src / poppler / Array.cc
blob230c32876832395e689be0d8c08028fe467730d5
1 //========================================================================
2 //
3 // Array.cc
4 //
5 // Copyright 1996-2003 Glyph & Cog, LLC
6 //
7 //========================================================================
9 //========================================================================
11 // Modified under the Poppler project - http://poppler.freedesktop.org
13 // All changes made under the Poppler project to this file are licensed
14 // under GPL version 2 or later
16 // Copyright (C) 2005 Kristian Høgsberg <krh@redhat.com>
17 // Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it>
18 // Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de>
19 // Copyright (C) 2013 Albert Astals Cid <aacid@kde.org>
21 // To see a description of the changes please see the Changelog file that
22 // came with your tarball or type make ChangeLog if you are building from git
24 //========================================================================
26 #include <config.h>
28 #ifdef USE_GCC_PRAGMAS
29 #pragma implementation
30 #endif
32 #include <stdlib.h>
33 #include <stddef.h>
34 #include "goo/gmem.h"
35 #include "Object.h"
36 #include "Array.h"
38 #if MULTITHREADED
39 # define arrayLocker() MutexLocker locker(&mutex)
40 #else
41 # define arrayLocker()
42 #endif
43 //------------------------------------------------------------------------
44 // Array
45 //------------------------------------------------------------------------
47 Array::Array(XRef *xrefA) {
48 xref = xrefA;
49 elems = NULL;
50 size = length = 0;
51 ref = 1;
52 #if MULTITHREADED
53 gInitMutex(&mutex);
54 #endif
57 Array::~Array() {
58 int i;
60 for (i = 0; i < length; ++i)
61 elems[i].free();
62 gfree(elems);
63 #if MULTITHREADED
64 gDestroyMutex(&mutex);
65 #endif
68 Object *Array::copy(XRef *xrefA, Object *obj) {
69 arrayLocker();
70 obj->initArray(xrefA);
71 for (int i = 0; i < length; ++i) {
72 Object obj1;
73 obj->arrayAdd(elems[i].copy(&obj1));
75 return obj;
78 int Array::incRef() {
79 arrayLocker();
80 ++ref;
81 return ref;
84 int Array::decRef() {
85 arrayLocker();
86 --ref;
87 return ref;
90 void Array::add(Object *elem) {
91 arrayLocker();
92 if (length == size) {
93 if (length == 0) {
94 size = 8;
95 } else {
96 size *= 2;
98 elems = (Object *)greallocn(elems, size, sizeof(Object));
100 elems[length] = *elem;
101 ++length;
104 void Array::remove(int i) {
105 arrayLocker();
106 if (i < 0 || i >= length) {
107 #ifdef DEBUG_MEM
108 abort();
109 #else
110 return;
111 #endif
113 --length;
114 memmove( elems + i, elems + i + 1, sizeof(elems[0]) * (length - i) );
117 Object *Array::get(int i, Object *obj, int recursion) {
118 if (i < 0 || i >= length) {
119 #ifdef DEBUG_MEM
120 abort();
121 #else
122 return obj->initNull();
123 #endif
125 return elems[i].fetch(xref, obj, recursion);
128 Object *Array::getNF(int i, Object *obj) {
129 if (i < 0 || i >= length) {
130 #ifdef DEBUG_MEM
131 abort();
132 #else
133 return obj->initNull();
134 #endif
136 return elems[i].copy(obj);
139 GBool Array::getString(int i, GooString *string)
141 Object obj;
143 if (getNF(i, &obj)->isString()) {
144 string->clear();
145 string->append(obj.getString());
146 obj.free();
147 return gTrue;
148 } else {
149 obj.free();
150 return gFalse;