Blame lib/Mrm/Mrmptrlist.c

Packit b099d7
/* 
Packit b099d7
 * Motif
Packit b099d7
 *
Packit b099d7
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are free software; you can
Packit b099d7
 * redistribute them and/or modify them under the terms of the GNU
Packit b099d7
 * Lesser General Public License as published by the Free Software
Packit b099d7
 * Foundation; either version 2 of the License, or (at your option)
Packit b099d7
 * any later version.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are distributed in the hope that
Packit b099d7
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
Packit b099d7
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit b099d7
 * PURPOSE. See the GNU Lesser General Public License for more
Packit b099d7
 * details.
Packit b099d7
 *
Packit b099d7
 * You should have received a copy of the GNU Lesser General Public
Packit b099d7
 * License along with these librararies and programs; if not, write
Packit b099d7
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
Packit b099d7
 * Floor, Boston, MA 02110-1301 USA
Packit b099d7
 */ 
Packit b099d7
/* 
Packit b099d7
 * HISTORY
Packit b099d7
 */ 
Packit b099d7
#ifdef HAVE_CONFIG_H
Packit b099d7
#include <config.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
#ifdef REV_INFO
Packit b099d7
#ifndef lint
Packit b099d7
static char rcsid[] = "$XConsortium: Mrmptrlist.c /main/12 1996/11/13 14:03:53 drk $"
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
Packit b099d7
/* (c) Copyright 1989, 1990, DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. */
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *  FACILITY:
Packit b099d7
 *
Packit b099d7
 *      UIL Resource Manager (URM):
Packit b099d7
 *
Packit b099d7
 *  ABSTRACT:
Packit b099d7
 *
Packit b099d7
 *	These routines manage a dynamic pointer list
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *
Packit b099d7
 *  INCLUDE FILES
Packit b099d7
 *
Packit b099d7
 */
Packit b099d7
Packit b099d7
#include <Mrm/MrmAppl.h>
Packit b099d7
#include <Mrm/Mrm.h>
Packit b099d7
#include "MrmMsgI.h"
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *
Packit b099d7
 *  TABLE OF CONTENTS
Packit b099d7
 *
Packit b099d7
 */
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine acquires and initializes a new pointer list.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	size		number of pointer slots to allocate in list
Packit b099d7
 *	list_id_return	to return pointer to new list structure
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *	MrmSUCCESS	operation succeeded
Packit b099d7
 *	MrmFAILURE	allocation failure
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal
Packit b099d7
UrmPlistInit (int		size,
Packit b099d7
	      URMPointerListPtr	*list_id_return)
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Allocate the list buffer and the slot vector buffer, and initialize
Packit b099d7
   */
Packit b099d7
  *list_id_return = (URMPointerListPtr) XtMalloc (sizeof(URMPointerList)) ;
Packit b099d7
  if ( *list_id_return == NULL )
Packit b099d7
    return Urm__UT_Error ("UrmPlistInit", _MrmMMsg_0046,
Packit b099d7
			  NULL, NULL, MrmFAILURE) ;
Packit b099d7
Packit b099d7
  (*list_id_return)->ptr_vec = (XtPointer *) XtMalloc (size*sizeof(XtPointer)) ;
Packit b099d7
  if ( (*list_id_return)->ptr_vec == NULL )
Packit b099d7
    return Urm__UT_Error ("UrmPlistInit", _MrmMMsg_0047,
Packit b099d7
			  NULL, NULL, MrmFAILURE) ;
Packit b099d7
Packit b099d7
  (*list_id_return)->num_slots = size ;
Packit b099d7
  (*list_id_return)->num_ptrs = 0 ;
Packit b099d7
  return MrmSUCCESS ;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine reallocates the list vector in a pointer list in order
Packit b099d7
 *	to increase its size. The contents of the current list are copied
Packit b099d7
 *	into the new list.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	list_id		The pointer list to be resized
Packit b099d7
 *	size		The new number of pointer slots
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *	MrmSUCCESS	operation succeeded
Packit b099d7
 *	MrmFAILURE	memory allocation failure
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
UrmPlistResize (URMPointerListPtr	list_id,
Packit b099d7
		int			size)
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Allocate the new vector, and copy the current vector into it.
Packit b099d7
   */
Packit b099d7
  list_id->ptr_vec = (XtPointer *) XtRealloc ((char *)(list_id->ptr_vec),
Packit b099d7
					      size*sizeof(XtPointer)) ;
Packit b099d7
  if ( list_id->ptr_vec == NULL )
Packit b099d7
    return Urm__UT_Error ("UrmPlistResize", _MrmMMsg_0048,
Packit b099d7
			  NULL, NULL, MrmFAILURE) ;
Packit b099d7
Packit b099d7
  list_id->num_slots = size ;
Packit b099d7
  return MrmSUCCESS ;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine frees the pointer vector and list structure.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	list_id		The pointer list to be freed
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *	MrmSUCCESS	operation succeeded
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal UrmPlistFree (URMPointerListPtr	list_id)
Packit b099d7
{
Packit b099d7
Packit b099d7
  XtFree ((char*)list_id->ptr_vec) ;
Packit b099d7
  XtFree ((char*)list_id) ;
Packit b099d7
  return MrmSUCCESS ;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine frees each of the items pointed to by the active
Packit b099d7
 *	pointers in the pointer list. The items must have been allocated
Packit b099d7
 *	with XtMalloc.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	list_id		The pointer list
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *	MrmSUCCESS	operatoin succeeded
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
UrmPlistFreeContents (URMPointerListPtr	list_id)
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  int			ndx ;		/* loop index */
Packit b099d7
Packit b099d7
Packit b099d7
  for ( ndx=0 ; ndx<list_id->num_ptrs ; ndx++ )
Packit b099d7
    XtFree (list_id->ptr_vec[ndx]) ;
Packit b099d7
  return MrmSUCCESS ;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine appends a pointer to the list. If no space remains,
Packit b099d7
 *	the list is resized to double its current size.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	list_id		The pointer list
Packit b099d7
 *	ptr		The pointer to append
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *	MrmSUCCESS	operation succeeded
Packit b099d7
 *	MrmFAILURE	allocation failure
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
UrmPlistAppendPointer (URMPointerListPtr	list_id ,
Packit b099d7
		       XtPointer		ptr )
Packit b099d7
{
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  Cardinal		result ;	/* function results */
Packit b099d7
Packit b099d7
Packit b099d7
  if ( list_id->num_ptrs == list_id->num_slots )
Packit b099d7
    {
Packit b099d7
      result = UrmPlistResize (list_id, 2*list_id->num_slots) ;
Packit b099d7
      if ( result != MrmSUCCESS ) return result ;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  list_id->ptr_vec[list_id->num_ptrs] = ptr ;
Packit b099d7
  list_id->num_ptrs++ ;
Packit b099d7
  return MrmSUCCESS ;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine allocates space for a string, copies, and appends the
Packit b099d7
 *	pointer to the string in the pointer list. All the strings in the
Packit b099d7
 *	list may be freed with UrmPlistFreeContents.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	list_id		The pointer list
Packit b099d7
 *	stg		The string to alocate, copy, and append
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *	MrmSUCCESS	operation succeeded
Packit b099d7
 *	MrmFAILURE	allocation failure
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
UrmPlistAppendString (URMPointerListPtr		list_id ,
Packit b099d7
		      String			stg )
Packit b099d7
{
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  Cardinal		result ;	/* function results */
Packit b099d7
  String			newstg ;	/* allocated string */
Packit b099d7
Packit b099d7
Packit b099d7
  newstg = XtMalloc (strlen(stg)+1) ;
Packit b099d7
  if ( newstg == NULL )
Packit b099d7
    return Urm__UT_Error ("UrmPlistAppendString", _MrmMMsg_0049,
Packit b099d7
			  NULL, NULL, MrmFAILURE) ;
Packit b099d7
Packit b099d7
  strcpy (newstg, stg) ;
Packit b099d7
  result = UrmPlistAppendPointer (list_id, newstg) ;
Packit b099d7
  return result ;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine searches a list (assumed to be a list of string
Packit b099d7
 *	pointers) for a case-sensitive match to a string. If found,
Packit b099d7
 *	its index in the list is found; else -1 is returned.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	list_id		The pointer list
Packit b099d7
 *	stg		the (case-sensitive) string to be found
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *	0-based index in list if found
Packit b099d7
 *	-1 if not found
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
MrmCount 
Packit b099d7
UrmPlistFindString (URMPointerListPtr		list_id ,
Packit b099d7
		    String			stg )
Packit b099d7
Packit b099d7
{
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  MrmCount		ndx ;		/* search index */
Packit b099d7
Packit b099d7
Packit b099d7
  for ( ndx=0 ; ndx
Packit b099d7
    if ( strcmp(stg,(String)UrmPlistPtrN(list_id,ndx)) == 0 )
Packit b099d7
      return ndx ;
Packit b099d7
  return -1 ;
Packit b099d7
Packit b099d7
}
Packit b099d7