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