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 WorkerppdcArray::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 WorkerppdcArray::~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 WorkerppdcArray::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 WorkerppdcArray::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 WorkerppdcArray::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 WorkerppdcArray::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