Blame Array.c

rpm-build 34167a
/*
rpm-build 34167a
Copyright 1989, 1998  The Open Group
rpm-build 34167a
rpm-build 34167a
Permission to use, copy, modify, distribute, and sell this software and its
rpm-build 34167a
documentation for any purpose is hereby granted without fee, provided that
rpm-build 34167a
the above copyright notice appear in all copies and that both that
rpm-build 34167a
copyright notice and this permission notice appear in supporting
rpm-build 34167a
documentation.
rpm-build 34167a
rpm-build 34167a
The above copyright notice and this permission notice shall be included in
rpm-build 34167a
all copies or substantial portions of the Software.
rpm-build 34167a
rpm-build 34167a
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
rpm-build 34167a
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
rpm-build 34167a
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
rpm-build 34167a
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
rpm-build 34167a
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
rpm-build 34167a
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
rpm-build 34167a
rpm-build 34167a
Except as contained in this notice, the name of The Open Group shall not be
rpm-build 34167a
used in advertising or otherwise to promote the sale, use or other dealings
rpm-build 34167a
in this Software without prior written authorization from The Open Group.
rpm-build 34167a
 *
rpm-build 34167a
 * Author:  Keith Packard, MIT X Consortium
rpm-build 34167a
 */
rpm-build 34167a
rpm-build 34167a
#ifdef HAVE_CONFIG_H
rpm-build 34167a
#include <config.h>
rpm-build 34167a
#endif
rpm-build 34167a
#include <X11/Xos.h>
rpm-build 34167a
#include <X11/X.h>
rpm-build 34167a
#include <X11/Xmd.h>
rpm-build 34167a
#include <X11/Xdmcp.h>
rpm-build 34167a
#include <stdint.h>
rpm-build 34167a
#include <stdlib.h>
rpm-build 34167a
rpm-build 34167a
/*
rpm-build 34167a
 * This variant of malloc does not return NULL if zero size is passed into.
rpm-build 34167a
 */
rpm-build 34167a
static void *
rpm-build 34167a
xmalloc(size_t size)
rpm-build 34167a
{
rpm-build 34167a
    return malloc(size ? size : 1);
rpm-build 34167a
}
rpm-build 34167a
rpm-build 34167a
/*
rpm-build 34167a
 * This variant of calloc does not return NULL if zero count is passed into.
rpm-build 34167a
 */
rpm-build 34167a
static void *
rpm-build 34167a
xcalloc(size_t n, size_t size)
rpm-build 34167a
{
rpm-build 34167a
    return calloc(n ? n : 1, size);
rpm-build 34167a
}
rpm-build 34167a
rpm-build 34167a
/*
rpm-build 34167a
 * This variant of realloc does not return NULL if zero size is passed into
rpm-build 34167a
 */
rpm-build 34167a
static void *
rpm-build 34167a
xrealloc(void *ptr, size_t size)
rpm-build 34167a
{
rpm-build 34167a
    return realloc(ptr, size ? size : 1);
rpm-build 34167a
}
rpm-build 34167a
rpm-build 34167a
int
rpm-build 34167a
XdmcpAllocARRAY8 (ARRAY8Ptr array, int length)
rpm-build 34167a
{
rpm-build 34167a
    /* length defined in ARRAY8 struct is a CARD16 (not CARD8 like the rest) */
rpm-build 34167a
    if ((length > UINT16_MAX) || (length < 0))
rpm-build 34167a
        array->data = NULL;
rpm-build 34167a
    else
rpm-build 34167a
        array->data = xmalloc(length * sizeof (CARD8));
rpm-build 34167a
rpm-build 34167a
    if (array->data == NULL) {
rpm-build 34167a
	array->length = 0;
rpm-build 34167a
	return FALSE;
rpm-build 34167a
    }
rpm-build 34167a
    array->length = (CARD16) length;
rpm-build 34167a
    return TRUE;
rpm-build 34167a
}
rpm-build 34167a
rpm-build 34167a
int
rpm-build 34167a
XdmcpAllocARRAY16 (ARRAY16Ptr array, int length)
rpm-build 34167a
{
rpm-build 34167a
    /* length defined in ARRAY16 struct is a CARD8 */
rpm-build 34167a
    if ((length > UINT8_MAX) || (length < 0))
rpm-build 34167a
        array->data = NULL;
rpm-build 34167a
    else
rpm-build 34167a
        array->data = xmalloc(length * sizeof (CARD16));
rpm-build 34167a
rpm-build 34167a
    if (array->data == NULL) {
rpm-build 34167a
	array->length = 0;
rpm-build 34167a
	return FALSE;
rpm-build 34167a
    }
rpm-build 34167a
    array->length = (CARD8) length;
rpm-build 34167a
    return TRUE;
rpm-build 34167a
}
rpm-build 34167a
rpm-build 34167a
int
rpm-build 34167a
XdmcpAllocARRAY32 (ARRAY32Ptr array, int length)
rpm-build 34167a
{
rpm-build 34167a
    /* length defined in ARRAY32 struct is a CARD8 */
rpm-build 34167a
    if ((length > UINT8_MAX) || (length < 0))
rpm-build 34167a
        array->data = NULL;
rpm-build 34167a
    else
rpm-build 34167a
        array->data = xmalloc(length * sizeof (CARD32));
rpm-build 34167a
rpm-build 34167a
    if (array->data == NULL) {
rpm-build 34167a
	array->length = 0;
rpm-build 34167a
	return FALSE;
rpm-build 34167a
    }
rpm-build 34167a
    array->length = (CARD8) length;
rpm-build 34167a
    return TRUE;
rpm-build 34167a
}
rpm-build 34167a
rpm-build 34167a
int
rpm-build 34167a
XdmcpAllocARRAYofARRAY8 (ARRAYofARRAY8Ptr array, int length)
rpm-build 34167a
{
rpm-build 34167a
    /* length defined in ARRAYofARRAY8 struct is a CARD8 */
rpm-build 34167a
    if ((length > UINT8_MAX) || (length < 0))
rpm-build 34167a
        array->data = NULL;
rpm-build 34167a
    else
rpm-build 34167a
        /*
rpm-build 34167a
         * Use calloc to ensure the pointers are cleared out so we
rpm-build 34167a
         * don't try to free garbage if XdmcpDisposeARRAYofARRAY8()
rpm-build 34167a
         * is called before the caller sets them to valid pointers.
rpm-build 34167a
         */
rpm-build 34167a
        array->data = xcalloc(length, sizeof (ARRAY8));
rpm-build 34167a
rpm-build 34167a
    if (array->data == NULL) {
rpm-build 34167a
	array->length = 0;
rpm-build 34167a
	return FALSE;
rpm-build 34167a
    }
rpm-build 34167a
    array->length = (CARD8) length;
rpm-build 34167a
    return TRUE;
rpm-build 34167a
}
rpm-build 34167a
rpm-build 34167a
int
rpm-build 34167a
XdmcpARRAY8Equal (const ARRAY8Ptr array1, const ARRAY8Ptr array2)
rpm-build 34167a
{
rpm-build 34167a
    if (array1->length != array2->length)
rpm-build 34167a
	return FALSE;
rpm-build 34167a
    if (memcmp(array1->data, array2->data, array1->length) != 0)
rpm-build 34167a
	return FALSE;
rpm-build 34167a
    return TRUE;
rpm-build 34167a
}
rpm-build 34167a
rpm-build 34167a
int
rpm-build 34167a
XdmcpCopyARRAY8 (const ARRAY8Ptr src, ARRAY8Ptr dst)
rpm-build 34167a
{
rpm-build 34167a
    if (!XdmcpAllocARRAY8(dst, src->length))
rpm-build 34167a
	return FALSE;
rpm-build 34167a
    memmove (dst->data, src->data, src->length * sizeof (CARD8));
rpm-build 34167a
    return TRUE;
rpm-build 34167a
}
rpm-build 34167a
rpm-build 34167a
int
rpm-build 34167a
XdmcpReallocARRAY8 (ARRAY8Ptr array, int length)
rpm-build 34167a
{
rpm-build 34167a
    CARD8Ptr	newData;
rpm-build 34167a
rpm-build 34167a
    /* length defined in ARRAY8 struct is a CARD16 (not CARD8 like the rest) */
rpm-build 34167a
    if ((length > UINT16_MAX) || (length < 0))
rpm-build 34167a
	return FALSE;
rpm-build 34167a
rpm-build 34167a
    newData = (CARD8Ptr) xrealloc(array->data, length * sizeof (CARD8));
rpm-build 34167a
    if (!newData)
rpm-build 34167a
	return FALSE;
rpm-build 34167a
    array->length = (CARD16) length;
rpm-build 34167a
    array->data = newData;
rpm-build 34167a
    return TRUE;
rpm-build 34167a
}
rpm-build 34167a
rpm-build 34167a
int
rpm-build 34167a
XdmcpReallocARRAYofARRAY8 (ARRAYofARRAY8Ptr array, int length)
rpm-build 34167a
{
rpm-build 34167a
    ARRAY8Ptr	newData;
rpm-build 34167a
rpm-build 34167a
    /* length defined in ARRAYofARRAY8 struct is a CARD8 */
rpm-build 34167a
    if ((length > UINT8_MAX) || (length < 0))
rpm-build 34167a
	return FALSE;
rpm-build 34167a
rpm-build 34167a
    newData = (ARRAY8Ptr) xrealloc(array->data, length * sizeof (ARRAY8));
rpm-build 34167a
    if (!newData)
rpm-build 34167a
	return FALSE;
rpm-build 34167a
    if (length > array->length)
rpm-build 34167a
        memset(newData + array->length, 0,
rpm-build 34167a
               (length - array->length) * sizeof (ARRAY8));
rpm-build 34167a
    array->length = (CARD8) length;
rpm-build 34167a
    array->data = newData;
rpm-build 34167a
    return TRUE;
rpm-build 34167a
}
rpm-build 34167a
rpm-build 34167a
int
rpm-build 34167a
XdmcpReallocARRAY16 (ARRAY16Ptr array, int length)
rpm-build 34167a
{
rpm-build 34167a
    CARD16Ptr	newData;
rpm-build 34167a
rpm-build 34167a
    /* length defined in ARRAY16 struct is a CARD8 */
rpm-build 34167a
    if ((length > UINT8_MAX) || (length < 0))
rpm-build 34167a
	return FALSE;
rpm-build 34167a
    newData = (CARD16Ptr) xrealloc(array->data, length * sizeof (CARD16));
rpm-build 34167a
    if (!newData)
rpm-build 34167a
	return FALSE;
rpm-build 34167a
    array->length = (CARD8) length;
rpm-build 34167a
    array->data = newData;
rpm-build 34167a
    return TRUE;
rpm-build 34167a
}
rpm-build 34167a
rpm-build 34167a
int
rpm-build 34167a
XdmcpReallocARRAY32 (ARRAY32Ptr array, int length)
rpm-build 34167a
{
rpm-build 34167a
    CARD32Ptr	newData;
rpm-build 34167a
rpm-build 34167a
    /* length defined in ARRAY32 struct is a CARD8 */
rpm-build 34167a
    if ((length > UINT8_MAX) || (length < 0))
rpm-build 34167a
	return FALSE;
rpm-build 34167a
rpm-build 34167a
    newData = (CARD32Ptr) xrealloc(array->data, length * sizeof (CARD32));
rpm-build 34167a
    if (!newData)
rpm-build 34167a
	return FALSE;
rpm-build 34167a
    array->length = (CARD8) length;
rpm-build 34167a
    array->data = newData;
rpm-build 34167a
    return TRUE;
rpm-build 34167a
}
rpm-build 34167a
rpm-build 34167a
void
rpm-build 34167a
XdmcpDisposeARRAY8 (ARRAY8Ptr array)
rpm-build 34167a
{
rpm-build 34167a
    free(array->data);
rpm-build 34167a
    array->length = 0;
rpm-build 34167a
    array->data = NULL;
rpm-build 34167a
}
rpm-build 34167a
rpm-build 34167a
void
rpm-build 34167a
XdmcpDisposeARRAY16 (ARRAY16Ptr array)
rpm-build 34167a
{
rpm-build 34167a
    free(array->data);
rpm-build 34167a
    array->length = 0;
rpm-build 34167a
    array->data = NULL;
rpm-build 34167a
}
rpm-build 34167a
rpm-build 34167a
void
rpm-build 34167a
XdmcpDisposeARRAY32 (ARRAY32Ptr array)
rpm-build 34167a
{
rpm-build 34167a
    free(array->data);
rpm-build 34167a
    array->length = 0;
rpm-build 34167a
    array->data = NULL;
rpm-build 34167a
}
rpm-build 34167a
rpm-build 34167a
void
rpm-build 34167a
XdmcpDisposeARRAYofARRAY8 (ARRAYofARRAY8Ptr array)
rpm-build 34167a
{
rpm-build 34167a
    int	i;
rpm-build 34167a
rpm-build 34167a
    if (array->data != NULL) {
rpm-build 34167a
	for (i = 0; i < (int)array->length; i++)
rpm-build 34167a
	    XdmcpDisposeARRAY8 (&array->data[i]);
rpm-build 34167a
	free(array->data);
rpm-build 34167a
    }
rpm-build 34167a
    array->length = 0;
rpm-build 34167a
    array->data = NULL;
rpm-build 34167a
}