cups/ppdc/ppdc-array.cxx

149 lines
2.1 KiB
C++
Raw Normal View History

2022-05-13 20:08:20 +08:00
//
// 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 *));
}