Array.c revision 44dda7b2
144dda7b2Smrg/*
244dda7b2SmrgCopyright 1989, 1998  The Open Group
344dda7b2Smrg
444dda7b2SmrgPermission to use, copy, modify, distribute, and sell this software and its
544dda7b2Smrgdocumentation for any purpose is hereby granted without fee, provided that
644dda7b2Smrgthe above copyright notice appear in all copies and that both that
744dda7b2Smrgcopyright notice and this permission notice appear in supporting
844dda7b2Smrgdocumentation.
944dda7b2Smrg
1044dda7b2SmrgThe above copyright notice and this permission notice shall be included in
1144dda7b2Smrgall copies or substantial portions of the Software.
1244dda7b2Smrg
1344dda7b2SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1444dda7b2SmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1544dda7b2SmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
1644dda7b2SmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
1744dda7b2SmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
1844dda7b2SmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1944dda7b2Smrg
2044dda7b2SmrgExcept as contained in this notice, the name of The Open Group shall not be
2144dda7b2Smrgused in advertising or otherwise to promote the sale, use or other dealings
2244dda7b2Smrgin this Software without prior written authorization from The Open Group.
2344dda7b2Smrg *
2444dda7b2Smrg * Author:  Keith Packard, MIT X Consortium
2544dda7b2Smrg */
2644dda7b2Smrg
2744dda7b2Smrg#ifdef HAVE_CONFIG_H
2844dda7b2Smrg#include <config.h>
2944dda7b2Smrg#endif
3044dda7b2Smrg#include <X11/Xos.h>
3144dda7b2Smrg#include <X11/X.h>
3244dda7b2Smrg#include <X11/Xmd.h>
3344dda7b2Smrg#include <X11/Xdmcp.h>
3444dda7b2Smrg#include <stdint.h>
3544dda7b2Smrg#include <stdlib.h>
3644dda7b2Smrg
3744dda7b2Smrg/*
3844dda7b2Smrg * This variant of malloc does not return NULL if zero size is passed into.
3944dda7b2Smrg */
4044dda7b2Smrgstatic void *
4144dda7b2Smrgxmalloc(size_t size)
4244dda7b2Smrg{
4344dda7b2Smrg    return malloc(size ? size : 1);
4444dda7b2Smrg}
4544dda7b2Smrg
4644dda7b2Smrg/*
4744dda7b2Smrg * This variant of realloc does not return NULL if zero size is passed into
4844dda7b2Smrg */
4944dda7b2Smrgstatic void *
5044dda7b2Smrgxrealloc(void *ptr, size_t size)
5144dda7b2Smrg{
5244dda7b2Smrg    return realloc(ptr, size ? size : 1);
5344dda7b2Smrg}
5444dda7b2Smrg
5544dda7b2Smrgint
5644dda7b2SmrgXdmcpAllocARRAY8 (ARRAY8Ptr array, int length)
5744dda7b2Smrg{
5844dda7b2Smrg    CARD8Ptr	newData;
5944dda7b2Smrg
6044dda7b2Smrg    /* length defined in ARRAY8 struct is a CARD16 (not CARD8 like the rest) */
6144dda7b2Smrg    if (length > UINT16_MAX)
6244dda7b2Smrg	return FALSE;
6344dda7b2Smrg
6444dda7b2Smrg    newData = (CARD8Ptr) xmalloc(length * sizeof (CARD8));
6544dda7b2Smrg    if (!newData)
6644dda7b2Smrg	return FALSE;
6744dda7b2Smrg    array->length = (CARD16) length;
6844dda7b2Smrg    array->data = newData;
6944dda7b2Smrg    return TRUE;
7044dda7b2Smrg}
7144dda7b2Smrg
7244dda7b2Smrgint
7344dda7b2SmrgXdmcpAllocARRAY16 (ARRAY16Ptr array, int length)
7444dda7b2Smrg{
7544dda7b2Smrg    CARD16Ptr	newData;
7644dda7b2Smrg
7744dda7b2Smrg    /* length defined in ARRAY16 struct is a CARD8 */
7844dda7b2Smrg    if (length > UINT8_MAX)
7944dda7b2Smrg	return FALSE;
8044dda7b2Smrg
8144dda7b2Smrg    newData = (CARD16Ptr) xmalloc(length * sizeof (CARD16));
8244dda7b2Smrg    if (!newData)
8344dda7b2Smrg	return FALSE;
8444dda7b2Smrg    array->length = (CARD8) length;
8544dda7b2Smrg    array->data = newData;
8644dda7b2Smrg    return TRUE;
8744dda7b2Smrg}
8844dda7b2Smrg
8944dda7b2Smrgint
9044dda7b2SmrgXdmcpAllocARRAY32 (ARRAY32Ptr array, int length)
9144dda7b2Smrg{
9244dda7b2Smrg    CARD32Ptr	newData;
9344dda7b2Smrg
9444dda7b2Smrg    /* length defined in ARRAY32 struct is a CARD8 */
9544dda7b2Smrg    if (length > UINT8_MAX)
9644dda7b2Smrg	return FALSE;
9744dda7b2Smrg
9844dda7b2Smrg    newData = (CARD32Ptr) xmalloc(length * sizeof (CARD32));
9944dda7b2Smrg    if (!newData)
10044dda7b2Smrg	return FALSE;
10144dda7b2Smrg    array->length = (CARD8) length;
10244dda7b2Smrg    array->data = newData;
10344dda7b2Smrg    return TRUE;
10444dda7b2Smrg}
10544dda7b2Smrg
10644dda7b2Smrgint
10744dda7b2SmrgXdmcpAllocARRAYofARRAY8 (ARRAYofARRAY8Ptr array, int length)
10844dda7b2Smrg{
10944dda7b2Smrg    ARRAY8Ptr	newData;
11044dda7b2Smrg
11144dda7b2Smrg    /* length defined in ARRAYofARRAY8 struct is a CARD8 */
11244dda7b2Smrg    if (length > UINT8_MAX)
11344dda7b2Smrg	return FALSE;
11444dda7b2Smrg
11544dda7b2Smrg    newData = (ARRAY8Ptr) xmalloc(length * sizeof (ARRAY8));
11644dda7b2Smrg    if (!newData)
11744dda7b2Smrg	return FALSE;
11844dda7b2Smrg    array->length = (CARD8) length;
11944dda7b2Smrg    array->data = newData;
12044dda7b2Smrg    return TRUE;
12144dda7b2Smrg}
12244dda7b2Smrg
12344dda7b2Smrgint
12444dda7b2SmrgXdmcpARRAY8Equal (const ARRAY8Ptr array1, const ARRAY8Ptr array2)
12544dda7b2Smrg{
12644dda7b2Smrg    if (array1->length != array2->length)
12744dda7b2Smrg	return FALSE;
12844dda7b2Smrg    if (memcmp(array1->data, array2->data, array1->length) != 0)
12944dda7b2Smrg	return FALSE;
13044dda7b2Smrg    return TRUE;
13144dda7b2Smrg}
13244dda7b2Smrg
13344dda7b2Smrgint
13444dda7b2SmrgXdmcpCopyARRAY8 (const ARRAY8Ptr src, ARRAY8Ptr dst)
13544dda7b2Smrg{
13644dda7b2Smrg    dst->length = src->length;
13744dda7b2Smrg    dst->data = (CARD8 *) xmalloc(dst->length * sizeof (CARD8));
13844dda7b2Smrg    if (!dst->data)
13944dda7b2Smrg	return FALSE;
14044dda7b2Smrg    memmove (dst->data, src->data, src->length * sizeof (CARD8));
14144dda7b2Smrg    return TRUE;
14244dda7b2Smrg}
14344dda7b2Smrg
14444dda7b2Smrgint
14544dda7b2SmrgXdmcpReallocARRAY8 (ARRAY8Ptr array, int length)
14644dda7b2Smrg{
14744dda7b2Smrg    CARD8Ptr	newData;
14844dda7b2Smrg
14944dda7b2Smrg    /* length defined in ARRAY8 struct is a CARD16 (not CARD8 like the rest) */
15044dda7b2Smrg    if (length > UINT16_MAX)
15144dda7b2Smrg	return FALSE;
15244dda7b2Smrg
15344dda7b2Smrg    newData = (CARD8Ptr) xrealloc(array->data, length * sizeof (CARD8));
15444dda7b2Smrg    if (!newData)
15544dda7b2Smrg	return FALSE;
15644dda7b2Smrg    array->length = (CARD16) length;
15744dda7b2Smrg    array->data = newData;
15844dda7b2Smrg    return TRUE;
15944dda7b2Smrg}
16044dda7b2Smrg
16144dda7b2Smrgint
16244dda7b2SmrgXdmcpReallocARRAYofARRAY8 (ARRAYofARRAY8Ptr array, int length)
16344dda7b2Smrg{
16444dda7b2Smrg    ARRAY8Ptr	newData;
16544dda7b2Smrg
16644dda7b2Smrg    /* length defined in ARRAYofARRAY8 struct is a CARD8 */
16744dda7b2Smrg    if (length > UINT8_MAX)
16844dda7b2Smrg	return FALSE;
16944dda7b2Smrg
17044dda7b2Smrg    newData = (ARRAY8Ptr) xrealloc(array->data, length * sizeof (ARRAY8));
17144dda7b2Smrg    if (!newData)
17244dda7b2Smrg	return FALSE;
17344dda7b2Smrg    array->length = (CARD8) length;
17444dda7b2Smrg    array->data = newData;
17544dda7b2Smrg    return TRUE;
17644dda7b2Smrg}
17744dda7b2Smrg
17844dda7b2Smrgint
17944dda7b2SmrgXdmcpReallocARRAY16 (ARRAY16Ptr array, int length)
18044dda7b2Smrg{
18144dda7b2Smrg    CARD16Ptr	newData;
18244dda7b2Smrg
18344dda7b2Smrg    /* length defined in ARRAY16 struct is a CARD8 */
18444dda7b2Smrg    if (length > UINT8_MAX)
18544dda7b2Smrg	return FALSE;
18644dda7b2Smrg    newData = (CARD16Ptr) xrealloc(array->data, length * sizeof (CARD16));
18744dda7b2Smrg    if (!newData)
18844dda7b2Smrg	return FALSE;
18944dda7b2Smrg    array->length = (CARD8) length;
19044dda7b2Smrg    array->data = newData;
19144dda7b2Smrg    return TRUE;
19244dda7b2Smrg}
19344dda7b2Smrg
19444dda7b2Smrgint
19544dda7b2SmrgXdmcpReallocARRAY32 (ARRAY32Ptr array, int length)
19644dda7b2Smrg{
19744dda7b2Smrg    CARD32Ptr	newData;
19844dda7b2Smrg
19944dda7b2Smrg    /* length defined in ARRAY32 struct is a CARD8 */
20044dda7b2Smrg    if (length > UINT8_MAX)
20144dda7b2Smrg	return FALSE;
20244dda7b2Smrg
20344dda7b2Smrg    newData = (CARD32Ptr) xrealloc(array->data, length * sizeof (CARD32));
20444dda7b2Smrg    if (!newData)
20544dda7b2Smrg	return FALSE;
20644dda7b2Smrg    array->length = (CARD8) length;
20744dda7b2Smrg    array->data = newData;
20844dda7b2Smrg    return TRUE;
20944dda7b2Smrg}
21044dda7b2Smrg
21144dda7b2Smrgvoid
21244dda7b2SmrgXdmcpDisposeARRAY8 (ARRAY8Ptr array)
21344dda7b2Smrg{
21444dda7b2Smrg    free(array->data);
21544dda7b2Smrg    array->length = 0;
21644dda7b2Smrg    array->data = NULL;
21744dda7b2Smrg}
21844dda7b2Smrg
21944dda7b2Smrgvoid
22044dda7b2SmrgXdmcpDisposeARRAY16 (ARRAY16Ptr array)
22144dda7b2Smrg{
22244dda7b2Smrg    free(array->data);
22344dda7b2Smrg    array->length = 0;
22444dda7b2Smrg    array->data = NULL;
22544dda7b2Smrg}
22644dda7b2Smrg
22744dda7b2Smrgvoid
22844dda7b2SmrgXdmcpDisposeARRAY32 (ARRAY32Ptr array)
22944dda7b2Smrg{
23044dda7b2Smrg    free(array->data);
23144dda7b2Smrg    array->length = 0;
23244dda7b2Smrg    array->data = NULL;
23344dda7b2Smrg}
23444dda7b2Smrg
23544dda7b2Smrgvoid
23644dda7b2SmrgXdmcpDisposeARRAYofARRAY8 (ARRAYofARRAY8Ptr array)
23744dda7b2Smrg{
23844dda7b2Smrg    int	i;
23944dda7b2Smrg
24044dda7b2Smrg    if (array->data != NULL) {
24144dda7b2Smrg	for (i = 0; i < (int)array->length; i++)
24244dda7b2Smrg	    XdmcpDisposeARRAY8 (&array->data[i]);
24344dda7b2Smrg	free(array->data);
24444dda7b2Smrg    }
24544dda7b2Smrg    array->length = 0;
24644dda7b2Smrg    array->data = NULL;
24744dda7b2Smrg}
248