| // |
| // Array class for the CUPS PPD Compiler. |
| // |
| // Copyright 2007-2019 by Apple Inc. |
| // Copyright 2002-2005 by Easy Software Products. |
| // |
| // Licensed under Apache License v2.0. See the file "LICENSE" for more information. |
| // |
| |
| // |
| // Include necessary headers... |
| // |
| |
| #include "ppdc-private.h" |
| |
| |
| // |
| // 'ppdcArray::ppdcArray()' - Create a new array. |
| // |
| |
| ppdcArray::ppdcArray(ppdcArray *a) |
| : ppdcShared() |
| { |
| PPDC_NEW; |
| |
| if (a) |
| { |
| count = a->count; |
| alloc = count; |
| |
| if (count) |
| { |
| // Make a copy of the array... |
| data = new ppdcShared *[count]; |
| |
| memcpy(data, a->data, (size_t)count * sizeof(ppdcShared *)); |
| |
| for (size_t i = 0; i < count; i ++) |
| data[i]->retain(); |
| } |
| else |
| data = 0; |
| } |
| else |
| { |
| count = 0; |
| alloc = 0; |
| data = 0; |
| } |
| |
| current = 0; |
| } |
| |
| |
| // |
| // 'ppdcArray::~ppdcArray()' - Destroy an array. |
| // |
| |
| ppdcArray::~ppdcArray() |
| { |
| PPDC_DELETE; |
| |
| for (size_t i = 0; i < count; i ++) |
| data[i]->release(); |
| |
| if (alloc) |
| delete[] data; |
| } |
| |
| |
| // |
| // 'ppdcArray::add()' - Add an element to an array. |
| // |
| |
| void |
| ppdcArray::add(ppdcShared *d) |
| { |
| ppdcShared **temp; |
| |
| |
| if (count >= alloc) |
| { |
| alloc += 10; |
| temp = new ppdcShared *[alloc]; |
| |
| memcpy(temp, data, (size_t)count * sizeof(ppdcShared *)); |
| |
| delete[] data; |
| data = temp; |
| } |
| |
| data[count++] = d; |
| } |
| |
| |
| // |
| // 'ppdcArray::first()' - Return the first element in the array. |
| // |
| |
| ppdcShared * |
| ppdcArray::first() |
| { |
| current = 0; |
| |
| if (current >= count) |
| return (0); |
| else |
| return (data[current ++]); |
| } |
| |
| |
| // |
| // 'ppdcArray::next()' - Return the next element in the array. |
| // |
| |
| ppdcShared * |
| ppdcArray::next() |
| { |
| if (current >= count) |
| return (0); |
| else |
| return (data[current ++]); |
| } |
| |
| |
| // |
| // 'ppdcArray::remove()' - Remove an element from the array. |
| // |
| |
| void |
| ppdcArray::remove(ppdcShared *d) // I - Data element |
| { |
| size_t i; // Looping var |
| |
| |
| for (i = 0; i < count; i ++) |
| if (d == data[i]) |
| break; |
| |
| if (i >= count) |
| return; |
| |
| count --; |
| d->release(); |
| |
| if (i < count) |
| memmove(data + i, data + i + 1, (size_t)(count - i) * sizeof(ppdcShared *)); |
| } |