xref: /aosp_15_r20/external/libcups/ppdc/ppdc-array.cxx (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
1*5e7646d2SAndroid Build Coastguard Worker //
2*5e7646d2SAndroid Build Coastguard Worker // Array class for the CUPS PPD Compiler.
3*5e7646d2SAndroid Build Coastguard Worker //
4*5e7646d2SAndroid Build Coastguard Worker // Copyright 2007-2019 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker // Copyright 2002-2005 by Easy Software Products.
6*5e7646d2SAndroid Build Coastguard Worker //
7*5e7646d2SAndroid Build Coastguard Worker // Licensed under Apache License v2.0.  See the file "LICENSE" for more information.
8*5e7646d2SAndroid Build Coastguard Worker //
9*5e7646d2SAndroid Build Coastguard Worker 
10*5e7646d2SAndroid Build Coastguard Worker //
11*5e7646d2SAndroid Build Coastguard Worker // Include necessary headers...
12*5e7646d2SAndroid Build Coastguard Worker //
13*5e7646d2SAndroid Build Coastguard Worker 
14*5e7646d2SAndroid Build Coastguard Worker #include "ppdc-private.h"
15*5e7646d2SAndroid Build Coastguard Worker 
16*5e7646d2SAndroid Build Coastguard Worker 
17*5e7646d2SAndroid Build Coastguard Worker //
18*5e7646d2SAndroid Build Coastguard Worker // 'ppdcArray::ppdcArray()' - Create a new array.
19*5e7646d2SAndroid Build Coastguard Worker //
20*5e7646d2SAndroid Build Coastguard Worker 
ppdcArray(ppdcArray * a)21*5e7646d2SAndroid Build Coastguard Worker ppdcArray::ppdcArray(ppdcArray *a)
22*5e7646d2SAndroid Build Coastguard Worker   : ppdcShared()
23*5e7646d2SAndroid Build Coastguard Worker {
24*5e7646d2SAndroid Build Coastguard Worker   PPDC_NEW;
25*5e7646d2SAndroid Build Coastguard Worker 
26*5e7646d2SAndroid Build Coastguard Worker   if (a)
27*5e7646d2SAndroid Build Coastguard Worker   {
28*5e7646d2SAndroid Build Coastguard Worker     count = a->count;
29*5e7646d2SAndroid Build Coastguard Worker     alloc = count;
30*5e7646d2SAndroid Build Coastguard Worker 
31*5e7646d2SAndroid Build Coastguard Worker     if (count)
32*5e7646d2SAndroid Build Coastguard Worker     {
33*5e7646d2SAndroid Build Coastguard Worker       // Make a copy of the array...
34*5e7646d2SAndroid Build Coastguard Worker       data = new ppdcShared *[count];
35*5e7646d2SAndroid Build Coastguard Worker 
36*5e7646d2SAndroid Build Coastguard Worker       memcpy(data, a->data, (size_t)count * sizeof(ppdcShared *));
37*5e7646d2SAndroid Build Coastguard Worker 
38*5e7646d2SAndroid Build Coastguard Worker       for (size_t i = 0; i < count; i ++)
39*5e7646d2SAndroid Build Coastguard Worker         data[i]->retain();
40*5e7646d2SAndroid Build Coastguard Worker     }
41*5e7646d2SAndroid Build Coastguard Worker     else
42*5e7646d2SAndroid Build Coastguard Worker       data = 0;
43*5e7646d2SAndroid Build Coastguard Worker   }
44*5e7646d2SAndroid Build Coastguard Worker   else
45*5e7646d2SAndroid Build Coastguard Worker   {
46*5e7646d2SAndroid Build Coastguard Worker     count = 0;
47*5e7646d2SAndroid Build Coastguard Worker     alloc = 0;
48*5e7646d2SAndroid Build Coastguard Worker     data  = 0;
49*5e7646d2SAndroid Build Coastguard Worker   }
50*5e7646d2SAndroid Build Coastguard Worker 
51*5e7646d2SAndroid Build Coastguard Worker   current = 0;
52*5e7646d2SAndroid Build Coastguard Worker }
53*5e7646d2SAndroid Build Coastguard Worker 
54*5e7646d2SAndroid Build Coastguard Worker 
55*5e7646d2SAndroid Build Coastguard Worker //
56*5e7646d2SAndroid Build Coastguard Worker // 'ppdcArray::~ppdcArray()' - Destroy an array.
57*5e7646d2SAndroid Build Coastguard Worker //
58*5e7646d2SAndroid Build Coastguard Worker 
~ppdcArray()59*5e7646d2SAndroid Build Coastguard Worker ppdcArray::~ppdcArray()
60*5e7646d2SAndroid Build Coastguard Worker {
61*5e7646d2SAndroid Build Coastguard Worker   PPDC_DELETE;
62*5e7646d2SAndroid Build Coastguard Worker 
63*5e7646d2SAndroid Build Coastguard Worker   for (size_t i = 0; i < count; i ++)
64*5e7646d2SAndroid Build Coastguard Worker     data[i]->release();
65*5e7646d2SAndroid Build Coastguard Worker 
66*5e7646d2SAndroid Build Coastguard Worker   if (alloc)
67*5e7646d2SAndroid Build Coastguard Worker     delete[] data;
68*5e7646d2SAndroid Build Coastguard Worker }
69*5e7646d2SAndroid Build Coastguard Worker 
70*5e7646d2SAndroid Build Coastguard Worker 
71*5e7646d2SAndroid Build Coastguard Worker //
72*5e7646d2SAndroid Build Coastguard Worker // 'ppdcArray::add()' - Add an element to an array.
73*5e7646d2SAndroid Build Coastguard Worker //
74*5e7646d2SAndroid Build Coastguard Worker 
75*5e7646d2SAndroid Build Coastguard Worker void
add(ppdcShared * d)76*5e7646d2SAndroid Build Coastguard Worker ppdcArray::add(ppdcShared *d)
77*5e7646d2SAndroid Build Coastguard Worker {
78*5e7646d2SAndroid Build Coastguard Worker   ppdcShared	**temp;
79*5e7646d2SAndroid Build Coastguard Worker 
80*5e7646d2SAndroid Build Coastguard Worker 
81*5e7646d2SAndroid Build Coastguard Worker   if (count >= alloc)
82*5e7646d2SAndroid Build Coastguard Worker   {
83*5e7646d2SAndroid Build Coastguard Worker     alloc += 10;
84*5e7646d2SAndroid Build Coastguard Worker     temp  = new ppdcShared *[alloc];
85*5e7646d2SAndroid Build Coastguard Worker 
86*5e7646d2SAndroid Build Coastguard Worker     memcpy(temp, data, (size_t)count * sizeof(ppdcShared *));
87*5e7646d2SAndroid Build Coastguard Worker 
88*5e7646d2SAndroid Build Coastguard Worker     delete[] data;
89*5e7646d2SAndroid Build Coastguard Worker     data = temp;
90*5e7646d2SAndroid Build Coastguard Worker   }
91*5e7646d2SAndroid Build Coastguard Worker 
92*5e7646d2SAndroid Build Coastguard Worker   data[count++] = d;
93*5e7646d2SAndroid Build Coastguard Worker }
94*5e7646d2SAndroid Build Coastguard Worker 
95*5e7646d2SAndroid Build Coastguard Worker 
96*5e7646d2SAndroid Build Coastguard Worker //
97*5e7646d2SAndroid Build Coastguard Worker // 'ppdcArray::first()' - Return the first element in the array.
98*5e7646d2SAndroid Build Coastguard Worker //
99*5e7646d2SAndroid Build Coastguard Worker 
100*5e7646d2SAndroid Build Coastguard Worker ppdcShared *
first()101*5e7646d2SAndroid Build Coastguard Worker ppdcArray::first()
102*5e7646d2SAndroid Build Coastguard Worker {
103*5e7646d2SAndroid Build Coastguard Worker   current = 0;
104*5e7646d2SAndroid Build Coastguard Worker 
105*5e7646d2SAndroid Build Coastguard Worker   if (current >= count)
106*5e7646d2SAndroid Build Coastguard Worker     return (0);
107*5e7646d2SAndroid Build Coastguard Worker   else
108*5e7646d2SAndroid Build Coastguard Worker     return (data[current ++]);
109*5e7646d2SAndroid Build Coastguard Worker }
110*5e7646d2SAndroid Build Coastguard Worker 
111*5e7646d2SAndroid Build Coastguard Worker 
112*5e7646d2SAndroid Build Coastguard Worker //
113*5e7646d2SAndroid Build Coastguard Worker // 'ppdcArray::next()' - Return the next element in the array.
114*5e7646d2SAndroid Build Coastguard Worker //
115*5e7646d2SAndroid Build Coastguard Worker 
116*5e7646d2SAndroid Build Coastguard Worker ppdcShared *
next()117*5e7646d2SAndroid Build Coastguard Worker ppdcArray::next()
118*5e7646d2SAndroid Build Coastguard Worker {
119*5e7646d2SAndroid Build Coastguard Worker   if (current >= count)
120*5e7646d2SAndroid Build Coastguard Worker     return (0);
121*5e7646d2SAndroid Build Coastguard Worker   else
122*5e7646d2SAndroid Build Coastguard Worker     return (data[current ++]);
123*5e7646d2SAndroid Build Coastguard Worker }
124*5e7646d2SAndroid Build Coastguard Worker 
125*5e7646d2SAndroid Build Coastguard Worker 
126*5e7646d2SAndroid Build Coastguard Worker //
127*5e7646d2SAndroid Build Coastguard Worker // 'ppdcArray::remove()' - Remove an element from the array.
128*5e7646d2SAndroid Build Coastguard Worker //
129*5e7646d2SAndroid Build Coastguard Worker 
130*5e7646d2SAndroid Build Coastguard Worker void
remove(ppdcShared * d)131*5e7646d2SAndroid Build Coastguard Worker ppdcArray::remove(ppdcShared *d)		// I - Data element
132*5e7646d2SAndroid Build Coastguard Worker {
133*5e7646d2SAndroid Build Coastguard Worker   size_t	i;				// Looping var
134*5e7646d2SAndroid Build Coastguard Worker 
135*5e7646d2SAndroid Build Coastguard Worker 
136*5e7646d2SAndroid Build Coastguard Worker   for (i = 0; i < count; i ++)
137*5e7646d2SAndroid Build Coastguard Worker     if (d == data[i])
138*5e7646d2SAndroid Build Coastguard Worker       break;
139*5e7646d2SAndroid Build Coastguard Worker 
140*5e7646d2SAndroid Build Coastguard Worker   if (i >= count)
141*5e7646d2SAndroid Build Coastguard Worker     return;
142*5e7646d2SAndroid Build Coastguard Worker 
143*5e7646d2SAndroid Build Coastguard Worker   count --;
144*5e7646d2SAndroid Build Coastguard Worker   d->release();
145*5e7646d2SAndroid Build Coastguard Worker 
146*5e7646d2SAndroid Build Coastguard Worker   if (i < count)
147*5e7646d2SAndroid Build Coastguard Worker     memmove(data + i, data + i + 1, (size_t)(count - i) * sizeof(ppdcShared *));
148*5e7646d2SAndroid Build Coastguard Worker }
149