/* * Motif * * Copyright (c) 1987-2012, The Open Group. All rights reserved. * * These libraries and programs are free software; you can * redistribute them and/or modify them under the terms of the GNU * Lesser General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) * any later version. * * These libraries and programs are distributed in the hope that * they will be useful, but WITHOUT ANY WARRANTY; without even the * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public * License along with these librararies and programs; if not, write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301 USA */ /* * HISTORY */ #ifdef HAVE_CONFIG_H #include #endif #ifdef REV_INFO #ifndef lint static char rcsid[] = "$XConsortium: Mrmcontext.c /main/12 1996/11/13 14:00:18 drk $" #endif #endif /* (c) Copyright 1989, 1990, DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. */ /* *++ * FACILITY: * * UIL Resource Manager (URM): * * URM context routines * * ABSTRACT: * * These routines create, modify, and delete a URM context structure. * Note that accessors for a URM context are macros. * *-- */ /* * * INCLUDE FILES * */ #include #include #include "MrmMsgI.h" /* * * TABLE OF CONTENTS * * UrmGetResourceContext - Allocate a new resource context * * UrmResizeResourceContext - Resize a resource context * * UrmFreeResourceContext - Free a resource context * */ /* *++ * * PROCEDURE DESCRIPTION: * * UrmGetResourceContext allocates a new resource context, then * allocates a memory buffer of the requested size and associates it * with the context. * * FORMAL PARAMETERS: * * alloc_func Function to use in allocating memory for this * context. A null pointer means use default * (XtMalloc). * free_func Function to use in freeing memory for this * context. A null pointer means use default * (XtFree). * size Size of memory buffer to allocate. * context_id_return To return new context. * * IMPLICIT INPUTS: * * IMPLICIT OUTPUTS: * * FUNCTION VALUE: * * MrmSUCCESS operation succeeded * MrmFAILURE allocation failure * * SIDE EFFECTS: * *-- */ Cardinal UrmGetResourceContext (char *((*alloc_func) ()), void (*free_func) (), MrmSize size, URMResourceContextPtr *context_id_return) { /* * Set function defaults if NULL */ if ( alloc_func == NULL ) alloc_func = XtMalloc ; if ( free_func == NULL ) free_func = XtFree ; /* * Allocate the context buffer and memory buffer, and set the * context up. */ *context_id_return = (URMResourceContextPtr) (*alloc_func) (sizeof(URMResourceContext)) ; if ( *context_id_return == NULL ) return Urm__UT_Error ("UrmGetResourceContext", _MrmMMsg_0027, NULL, *context_id_return, MrmFAILURE) ; (*context_id_return)->validation = URMResourceContextValid ; (*context_id_return)->data_buffer = NULL ; if ( size > 0 ) { (*context_id_return)->data_buffer = (char *) (*alloc_func) (size) ; if ( (*context_id_return)->data_buffer == NULL ) { (*free_func) (*context_id_return) ; return Urm__UT_Error ("UrmGetResourceContext", _MrmMMsg_0001, NULL, *context_id_return, MrmFAILURE) ; } } (*context_id_return)->buffer_size = size ; (*context_id_return)->resource_size = 0 ; (*context_id_return)->group = URMgNul ; (*context_id_return)->type = URMtNul ; (*context_id_return)->access = 0 ; (*context_id_return)->lock = 0 ; (*context_id_return)->alloc_func = alloc_func ; (*context_id_return)->free_func = free_func ; /* * Context successfully created */ return MrmSUCCESS ; } /* *++ * * PROCEDURE DESCRIPTION: * * UrmResizeResourceContext reallocates the memory buffer in a * resource context to increase its size. The contents of the current * memory buffer are copied into the new memory buffer. If the size * parameter is smaller than the current memory buffer size, the request * is ignored. If the size parameter is greater than MrmMaxResourceSize, a * MrmTooMany error is returned * * FORMAL PARAMETERS: * * context_id Resource context to receive resized memory buffer * size New size for memory buffer in resource context * * IMPLICIT INPUTS: * * IMPLICIT OUTPUTS: * * FUNCTION VALUE: * * MrmSUCCESS operation succeeded * MrmBAD_CONTEXT Illegal resource context * MrmFAILURE memory allocation failure * MrmTOO_MANY size was larger than MrmMaxResourceSize * * SIDE EFFECTS: * *-- */ Cardinal UrmResizeResourceContext (URMResourceContextPtr context_id, int size) { /* * Local variables */ char *newbuf ; /* new buffer */ if ( ! UrmRCValid(context_id) ) return Urm__UT_Error ("UrmResizeResourceContext", _MrmMMsg_0028, NULL, context_id, MrmBAD_CONTEXT) ; if ( size > MrmMaxResourceSize) return Urm__UT_Error ("MrmResizeResourceContext", _MrmMMsg_0029, NULL, context_id, MrmTOO_MANY) ; /* * CR 8391: buffer will eventually be passed to * Urm__CW_EvaluateValOrOffset which is expecting a long. Make sure to * allocate at least a long so that we don't get array bounds read * violations. Ideally Urm__CW_EvaluateValOrOffset and the code that * calls it should be rewritten, but we don't have time for that now. */ if (size < sizeof(long)) size = sizeof(long); /* * Resize unless buffer is bigger than requested size. */ if ( context_id->buffer_size > size ) return MrmSUCCESS ; /* * Allocate the new buffer, copy the old buffer contents, and * update the context. */ if ( context_id->alloc_func == XtMalloc ) { context_id->data_buffer = XtRealloc (context_id->data_buffer, size) ; context_id->buffer_size = size ; } else { newbuf = (char *) (*(context_id->alloc_func)) (size) ; if ( newbuf == NULL ) return Urm__UT_Error ("UrmResizeResourceContext", _MrmMMsg_0001, NULL, context_id, MrmFAILURE) ; if ( context_id->data_buffer != NULL ) { UrmBCopy (context_id->data_buffer, newbuf, context_id->buffer_size) ; (*(context_id->free_func)) (context_id->data_buffer) ; } context_id->data_buffer = newbuf ; context_id->buffer_size = size ; } /* * Resize succeeded */ return MrmSUCCESS ; } /* *++ * * PROCEDURE DESCRIPTION: * * UrmFreeResourceContext frees the memory buffer and the * resource context. * * FORMAL PARAMETERS: * * context_id Resource context to be freed * * IMPLICIT INPUTS: * * IMPLICIT OUTPUTS: * * FUNCTION VALUE: * * MrmSUCCESS operation succeeded * MrmBAD_CONTEXT Illegal resource context * * SIDE EFFECTS: * *-- */ Cardinal UrmFreeResourceContext (URMResourceContextPtr context_id) { if ( ! UrmRCValid(context_id) ) return Urm__UT_Error ("UrmFreeResourceContext", _MrmMMsg_0028, NULL, context_id, MrmBAD_CONTEXT) ; context_id->validation = 0 ; if ( context_id->data_buffer != NULL ) (*(context_id->free_func)) (context_id->data_buffer) ; (*(context_id->free_func)) (context_id) ; return MrmSUCCESS ; }