13d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby/*************************************************************************/
23d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby/* module:          Library for Memory Functions                         */
33d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby/*                                                                       */
43d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby/* file:            libmem.c                                             */
53d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby/* target system:   ALL                                                  */
63d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby/* target OS:       ALL                                                  */
73d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby/*                                                                       */
83d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby/* Description:                                                          */
93d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby/* Header for the implementation of common memory handling functions     */
103d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby/*************************************************************************/
113d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
123d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby/*
133d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * Copyright Notice
143d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication
153d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc.,
163d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001).
173d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * All Rights Reserved.
183d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * Implementation of all or part of any Specification may require
193d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * licenses under third party intellectual property rights,
203d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * including without limitation, patent rights (such a third party
213d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * may or may not be a Supporter). The Sponsors of the Specification
223d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * are not responsible and shall not be held responsible in any
233d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * manner for identifying or failing to identify any or all such
243d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * third party intellectual property rights.
253d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby *
263d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED
273d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM,
283d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA,
293d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML
303d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
313d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
323d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
333d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT
343d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO.,
353d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY
363d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF
373d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF
383d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL,
393d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH
403d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED
413d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE.
423d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby *
433d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * The above notice and this paragraph must be included on all copies
443d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * of this document that are made.
453d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby *
463d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby */
473d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
483d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby/*************************************************************************
493d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby *  Definitions
503d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby *************************************************************************/
513d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
523d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
533d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#include <smldef.h>
543d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#include "dmMemory.h"
553d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#include "libmem.h"
563d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#ifdef __PALM_OS__
573d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#include "MemoryMgr.h"
583d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#endif
593d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
603d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#ifdef MEMORY_PROFILING
613d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby  // %%% luz 2002-10-02
623d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby  #include "profiling.h"
633d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#endif
643d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
653d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby/*************************************************************************
663d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby *  External Functions  for all TOOLKIT Versions
673d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby *************************************************************************/
683d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
693d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
703d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby/**
713d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * FUNCTION: smlLibFree
723d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby *
733d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * Deallocates the memory of object "pObject", which has been allocated
743d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * previously.
753d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * If "pObject" is a NULL pointer nothing happens.
763d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * If "pObject" is a pointer to memory which has not been allocated
773d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * previouly, the behaviour is undefined.
783d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * The contents of the deallocated memory object is destroyed.
793d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby */
803d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake HambySML_API void smlLibFree(void *pObject)
813d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{
823d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby	if (! pObject) return;
833d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby  #ifdef __PALM_OS__
843d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby	  MemPtrFree(pObject);
853d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby  #else
863d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    DmFreeMem(pObject);
873d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby  #endif
883d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby}
893d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
903d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
913d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby/**
923d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * FUNCTION: smlLibRealloc
933d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby *
943d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * Changes size of preallocated space for memory object "pObject"
953d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * to the new size specified by "constSize".
963d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby *
973d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * If the new size is larger than the old size, the old contents
983d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * is not changed. Additionally space is added at the the end of
993d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * "pObject". The new allocated space is not initialized
1003d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * to any special value.
1013d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * If the new size is smaller than the old size, the unused space
1023d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * is discarded.
1033d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby *
1043d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * If "pObject" is a NULL pointer, this function behaves just like
1053d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * smlLibMalloc().
1063d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * If "pObject" does not point to a previously allocated memory area,
1073d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * the behavior is undefined.
1083d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * If "constSize" is 0, a NULL pointer is returned and the space
1093d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * which "pObject" points to is freed up.
1103d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby *
1113d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * Returns a pointer to the first byte of the resized object.
1123d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * If no new memory could be allocated, a NULL Pointer is returned
1133d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * without changing the memory object "pObject" (Nothing happens to the content).
1143d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby *
1153d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * IN/OUT           void *pObject,      memory object, which size should be changed
1163d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * IN:              MemSize_t constSize new size the memory object shall use
1173d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby * RETURN:          void*               Pointer to memory object, which size has been
1183d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby *                                      be changed
1193d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby *                                      NULL, if not successfull or
1203d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby *                                            if constSize==0
1213d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby */
1223d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake HambySML_API void *smlLibRealloc(void *pObject, MemSize_t constSize)
1233d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{
1243d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#ifdef __PALM_OS__
1253d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby	VoidPtr_t	_new_object;
1263d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby	MemSize_t 	_old_size;
1273d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1283d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby  	// It's a malloc!
1293d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby  	if (pObject == NULL)
1303d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby    		return smlLibMalloc(constSize);
1313d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1323d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby  	_old_size = MemPtrSize(pObject);
1333d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby  	if (constSize <= _old_size) {
1343d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby     		// make it smaller
1353d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby     		MemPtrResize(pObject, constSize);
1363d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby     		_new_object = pObject;
1373d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby  	} else {
1383d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby     		// maker it larger (we need to allocate new memory somewhere else)
1393d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby     		_new_object = smlLibMalloc(constSize);
1403d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby     		if (_new_object != NULL) {
1413d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        		smlLibMemmove(_new_object, pObject, _old_size);
1423d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby        		smlLibFree(pObject);
1433d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby     		}
1443d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby  	}
1453d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1463d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby	return _new_object;
1473d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#else
1483d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby  return DmReallocMem(pObject, (UINT32)constSize);
1493d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1503d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#endif
1513d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby}
1523d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1533d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1543d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#ifndef __PALM_OS__
1553d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby/* If not Palm OS we use the Standard ANSI C functions */
1563d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake HambySML_API void *smlLibMemset(void *pObject, int value, MemSize_t count){
1573d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby	return memset(pObject, value, count);
1583d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby}
1593d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake HambySML_API void *smlLibMemcpy(void *pTarget, const void *pSource, MemSize_t count){
1603d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby	return memcpy(pTarget, pSource, count);
1613d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby}
1623d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake HambySML_API void *smlLibMemmove(void *pTarget, const void *pSource, MemSize_t count){
1633d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby	return memmove(pTarget, pSource, count);
1643d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby}
1653d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake HambySML_API int smlLibMemcmp(const void *pTarget, const void *pSource, MemSize_t count){
1663d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby	return memcmp(pTarget, pSource, count);
1673d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby}
1683d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby/*SML_API void *smlLibMalloc(MemSize_t size) {
1693d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby  return (void *)DmAllocMem((UINT32)size);
1703d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1713d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby}*/
1723d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#endif
1733d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1743d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
1753d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby
176