mirror of
https://github.com/michaelrsweet/pdfio.git
synced 2024-12-26 13:28:22 +01:00
Implement binary string support in arrays, copy method.
This commit is contained in:
parent
f5c9aef7da
commit
9610892dd7
123
pdfio-array.c
123
pdfio-array.c
@ -33,6 +33,11 @@ pdfioArrayAppendArray(
|
||||
_pdfio_value_t v; // Value for array
|
||||
|
||||
|
||||
// Range check input
|
||||
if (!a || !value)
|
||||
return (false);
|
||||
|
||||
// Add an array...
|
||||
v.type = PDFIO_VALTYPE_ARRAY;
|
||||
v.value.array = value;
|
||||
|
||||
@ -40,6 +45,39 @@ pdfioArrayAppendArray(
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 'pdfioArrayAppendBinary()' - Add a binary string value to an array.
|
||||
//
|
||||
|
||||
bool // O - `true` on success, `false` on failure
|
||||
pdfioArrayAppendBinary(
|
||||
pdfio_array_t *a, // I - Array
|
||||
unsigned char *value, // I - Value
|
||||
size_t valuelen) // I - Length of value
|
||||
{
|
||||
_pdfio_value_t v; // Value for array
|
||||
|
||||
|
||||
// Range check input
|
||||
if (!a || !value || !valuelen)
|
||||
return (false);
|
||||
|
||||
// Add a binary string...
|
||||
v.type = PDFIO_VALTYPE_BINARY;
|
||||
v.value.binary.datalen = valuelen;
|
||||
|
||||
if ((v.value.binary.data = (unsigned char *)malloc(valuelen)) == NULL)
|
||||
{
|
||||
_pdfioFileError(a->pdf, "Unable to allocate memory for binary string - %s", strerror(errno));
|
||||
return (false);
|
||||
}
|
||||
|
||||
memcpy(v.value.binary.data, value, valuelen);
|
||||
|
||||
return (append_value(a, &v));
|
||||
|
||||
}
|
||||
|
||||
//
|
||||
// 'pdfioArrayAppendBoolean()' - Add a boolean value to an array.
|
||||
//
|
||||
@ -52,6 +90,11 @@ pdfioArrayAppendBoolean(
|
||||
_pdfio_value_t v; // Value for array
|
||||
|
||||
|
||||
// Range check input
|
||||
if (!a)
|
||||
return (false);
|
||||
|
||||
// Add a boolean...
|
||||
v.type = PDFIO_VALTYPE_BOOLEAN;
|
||||
v.value.boolean = value;
|
||||
|
||||
@ -71,6 +114,11 @@ pdfioArrayAppendDict(
|
||||
_pdfio_value_t v; // Value for array
|
||||
|
||||
|
||||
// Range check input
|
||||
if (!a || !value)
|
||||
return (false);
|
||||
|
||||
// Add a dictionary...
|
||||
v.type = PDFIO_VALTYPE_DICT;
|
||||
v.value.dict = value;
|
||||
|
||||
@ -90,6 +138,11 @@ pdfioArrayAppendName(
|
||||
_pdfio_value_t v; // Value for array
|
||||
|
||||
|
||||
// Range check input
|
||||
if (!a || !value)
|
||||
return (false);
|
||||
|
||||
// Add a name string...
|
||||
v.type = PDFIO_VALTYPE_NAME;
|
||||
v.value.name = value;
|
||||
|
||||
@ -109,6 +162,11 @@ pdfioArrayAppendNumber(
|
||||
_pdfio_value_t v; // Value for array
|
||||
|
||||
|
||||
// Range check input
|
||||
if (!a)
|
||||
return (false);
|
||||
|
||||
// Add a number...
|
||||
v.type = PDFIO_VALTYPE_NUMBER;
|
||||
v.value.number = value;
|
||||
|
||||
@ -128,6 +186,11 @@ pdfioArrayAppendObject(
|
||||
_pdfio_value_t v; // Value for array
|
||||
|
||||
|
||||
// Range check input
|
||||
if (!a || !value || a->pdf != value->pdf)
|
||||
return (false);
|
||||
|
||||
// Add an indirect reference...
|
||||
v.type = PDFIO_VALTYPE_INDIRECT;
|
||||
v.value.obj = value;
|
||||
|
||||
@ -147,6 +210,11 @@ pdfioArrayAppendString(
|
||||
_pdfio_value_t v; // Value for array
|
||||
|
||||
|
||||
// Range check input
|
||||
if (!a || !value)
|
||||
return (false);
|
||||
|
||||
// Add a string...
|
||||
v.type = PDFIO_VALTYPE_STRING;
|
||||
v.value.string = value;
|
||||
|
||||
@ -162,10 +230,34 @@ pdfio_array_t * // O - New array or `NULL` on error
|
||||
pdfioArrayCopy(pdfio_file_t *pdf, // I - PDF file
|
||||
pdfio_array_t *a) // I - Original array
|
||||
{
|
||||
// TODO: Implement me
|
||||
(void)pdf;
|
||||
(void)a;
|
||||
pdfio_array_t *na; // New array
|
||||
size_t i; // Looping var
|
||||
_pdfio_value_t *vsrc, // Current source value
|
||||
vdst; // Current destination value
|
||||
|
||||
|
||||
// Create the new array...
|
||||
if ((na = pdfioArrayCreate(pdf)) == NULL)
|
||||
return (NULL);
|
||||
|
||||
// Pre-allocate the values array to make this a little faster...
|
||||
if ((na->values = (_pdfio_value_t *)malloc(a->num_values * sizeof(_pdfio_value_t))) == NULL)
|
||||
return (NULL); // Let pdfioFileClose do the cleanup...
|
||||
|
||||
na->alloc_values = a->num_values;
|
||||
|
||||
// Copy and add each of the source array's values...
|
||||
for (i = a->num_values, vsrc = a->values; i > 0; i --, vsrc ++)
|
||||
{
|
||||
if (!_pdfioValueCopy(pdf, &vdst, a->pdf, vsrc))
|
||||
return (NULL); // Let pdfioFileClose do the cleanup...
|
||||
|
||||
if (!append_value(na, &vdst))
|
||||
return (NULL); // Let pdfioFileClose do the cleanup...
|
||||
}
|
||||
|
||||
// Successfully copied the array, so return it...
|
||||
return (na);
|
||||
}
|
||||
|
||||
|
||||
@ -236,6 +328,31 @@ pdfioArrayGetArray(pdfio_array_t *a, // I - Array
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 'pdfioArrayGetBinary()' - Get a binary string value from an array.
|
||||
//
|
||||
|
||||
unsigned char * // O - Value
|
||||
pdfioArrayGetBinary(
|
||||
pdfio_array_t *a, // I - Array
|
||||
size_t n, // I - Index
|
||||
size_t *length) // O - Length of string
|
||||
{
|
||||
if (!a || n >= a->num_values || a->values[n].type != PDFIO_VALTYPE_BINARY || !length)
|
||||
{
|
||||
if (length)
|
||||
*length = 0;
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
*length = a->values[n].value.binary.datalen;
|
||||
return (a->values[n].value.binary.data);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 'pdfioArrayGetBoolean()' - Get a boolean value from an array.
|
||||
//
|
||||
|
Loading…
Reference in New Issue
Block a user