123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- /*
- * CDE - Common Desktop Environment
- *
- * Copyright (c) 1993-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 libraries and programs; if not, write
- * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
- * Floor, Boston, MA 02110-1301 USA
- */
- /* $XConsortium: nametbl.c /main/1 1996/04/21 19:24:03 drk $ */
- /*
- * (c) Copyright 1993, 1994 Hewlett-Packard Company
- * (c) Copyright 1993, 1994 International Business Machines Corp.
- * (c) Copyright 1993, 1994 Novell, Inc.
- * (c) Copyright 1993, 1994 Sun Microsystems, Inc.
- */
- #include <EUSCompat.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include "nametbl.h"
- #include "hash.h"
- #define MAX_CAL_TBL_SIZE 23
- #define MAX_ENTRY_TBL_SIZE 37
- extern _DtCmNameTable *
- _DtCm_make_name_table(int size, char **names)
- {
- _DtCmNameTable *tbl;
- int i;
- if ((tbl = (_DtCmNameTable *)calloc(1, sizeof(_DtCmNameTable))) == NULL)
- return (NULL);
- if ((tbl->tbl = _DtCmMakeHash(MAX_CAL_TBL_SIZE)) == NULL) {
- free(tbl);
- return (NULL);
- }
- if ((tbl->names = (char **)malloc(sizeof(char *) * (size+1))) == NULL) {
- _DtCm_free_name_table(tbl);
- return (NULL);
- }
- for (i = 1; i <= size; i++) {
- if ((tbl->names[i] = strdup(names[i])) == NULL) {
- tbl->size = i;
- _DtCm_free_name_table(tbl);
- return (NULL);
- }
- *(int *)_DtCmGetHash(tbl->tbl, (unsigned char *)names[i]) = i;
- }
- tbl->size = i - 1;
- return (tbl);
- }
- extern void
- _DtCm_free_name_table(_DtCmNameTable *tbl)
- {
- int i;
- if (tbl == NULL) return;
- if (tbl->tbl)
- _DtCmDestroyHash(tbl->tbl, NULL, NULL);
- for (i = 1; i <= tbl->size; i++)
- free(tbl->names[i]);
- if (tbl->names)
- free(tbl->names);
- free(tbl);
- }
- /*
- * if index == 0, then add one more element to the table
- * otherwise use the index to add the new name and extend the
- * table by (index - size)
- */
- extern CSA_return_code
- _DtCm_add_name_to_table(_DtCmNameTable *tbl, int index, char *newname)
- {
- int *ptr;
- char **newptr;
- if (index > 0 && index <= tbl->size && tbl->names[index])
- return (CSA_E_INVALID_PARAMETER);
- if (index == 0)
- index = tbl->size + 1;
- /* add new name to table */
- ptr = (int *)_DtCmGetHash(tbl->tbl, (unsigned char *)newname);
- if (ptr)
- *ptr = index;
- if (index > tbl->size) {
- if ((newptr = (char **)realloc(tbl->names,
- sizeof(char *)*(index + 1))) == NULL) {
- *ptr = -1;
- return (CSA_E_INSUFFICIENT_MEMORY);
- } else {
- tbl->names = newptr;
- memset((void *)&tbl->names[tbl->size+1], 0,
- sizeof(char *)*(index - tbl->size));
- }
- }
- if ((tbl->names[index] = strdup(newname)) == NULL) {
- *ptr = -1;
- return (CSA_E_INSUFFICIENT_MEMORY);
- } else {
- if (index > tbl->size)
- tbl->size = index;
- }
- return (CSA_SUCCESS);
- }
- extern int
- _DtCm_get_index_from_table(_DtCmNameTable *tbl, char *name)
- {
- int *ptr;
- ptr = (int *)_DtCmFindHash(tbl->tbl, (unsigned char *)name);
- if (ptr)
- return (*ptr);
- else
- return (-1);
- }
- /*
- * if index == 0, then add one more element to the table
- * other use the index to add the new name and extend the
- * table by (index - size)
- */
- extern CSA_return_code
- _DtCmExtendNameTable(
- char *name,
- int index,
- int type,
- _DtCmNameTable *base,
- int basesize,
- char **basenames,
- _DtCmNameTable **tbl,
- int **types)
- {
- _DtCmNameTable *ntbl;
- int *newarray;
- int newindex;
- if (index > 0 && index <= (*tbl)->size)
- return (CSA_E_INVALID_PARAMETER);
- if (*tbl == base) {
- if ((ntbl = _DtCm_make_name_table(basesize, basenames)) == NULL)
- {
- return (CSA_E_INSUFFICIENT_MEMORY);
- } else
- *tbl = ntbl;
- }
- if (types) {
- newindex = (index == 0) ? (*tbl)->size+1 : index;
- if ((newarray = (int *)realloc(*types,
- sizeof(int) * (newindex+1))) == NULL) {
- return (CSA_E_INSUFFICIENT_MEMORY);
- } else {
- *types = newarray;
- (*types)[newindex] = type;
- }
- }
- return (_DtCm_add_name_to_table(*tbl, index, name));
- }
|