You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

269 lines
8.7 KiB

/**
@file
@ingroup st
@brief Symbol table package.
@details The st library provides functions to create, maintain,
and query symbol tables.
@copyright@parblock
Copyright (c) 1994-1998 The Regents of the Univ. of California.
All rights reserved.
Permission is hereby granted, without written agreement and without license
or royalty fees, to use, copy, modify, and distribute this software and its
documentation for any purpose, provided that the above copyright notice and
the following two paragraphs appear in all copies of this software.
IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN
"AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO PROVIDE
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
@endparblock
@copyright@parblock
Copyright (c) 1999-2015, Regents of the University of Colorado
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
Neither the name of the University of Colorado nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
@endparblock
*/
#ifndef ST_H_
#define ST_H_
/*---------------------------------------------------------------------------*/
/* Nested includes */
/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
/* Constant declarations */
/*---------------------------------------------------------------------------*/
/**
* @brief Value returned if memory is exhausted.
*/
#define ST_OUT_OF_MEM -10000
/**
* @brief Default value for the maximum table density.
* @see st_init_table_with_params
*/
#define ST_DEFAULT_MAX_DENSITY 5
/**
* @brief Default value for the initial table size.
* @see st_init_table_with_params
*/
#define ST_DEFAULT_INIT_TABLE_SIZE 11
/**
* @brief Default table growth factor.
* @see st_init_table_with_params
*/
#define ST_DEFAULT_GROW_FACTOR 2.0
/**
* @brief Default table reorder flag.
* @see st_init_table_with_params
*/
#define ST_DEFAULT_REORDER_FLAG 0
/*---------------------------------------------------------------------------*/
/* Stucture declarations */
/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
/* Type declarations */
/*---------------------------------------------------------------------------*/
/**
* @brief Type of symbol tables.
*/
typedef struct st_table st_table;
/**
* @brief Type of symbol table generators.
*/
typedef struct st_generator st_generator;
/**
* @brief Type of return values for iterators.
*/
enum st_retval {ST_CONTINUE, ST_STOP, ST_DELETE};
/**
* @brief Type for function passed to @ref st_foreach.
*/
typedef enum st_retval (*st_foreach_t)(void *, void *, void *);
/**
* @brief Type of comparison functions.
*/
typedef int (*st_compare_t)(void const *, void const *);
/**
* @brief Type of hash functions.
*/
typedef int (*st_hash_t)(void const *, int);
/**
* @brief Type of comparison functions with extra argument.
*/
typedef int (*st_compare_arg_t)(void const *, void const *, void const *);
/**
* @brief Type of hash functions with extra argument.
*/
typedef int (*st_hash_arg_t)(void const *, int, void const *);
/*---------------------------------------------------------------------------*/
/* Variable declarations */
/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
/* Macro declarations */
/*---------------------------------------------------------------------------*/
/**
@brief Checks whethere `key` is in `table`.
@details Returns 1 if there is an entry under `key` in `table`, 0
otherwise.
@sideeffect None
@see st_lookup
*/
#define st_is_member(table,key) st_lookup(table,key,(void **) 0)
/**
@brief Iteration macro.
@details
An iteration macro which loops over all the entries in
`table`, setting `key` to point to the key and `value` to the
associated value (if it is not nil). `gen` is a generator variable
used internally. Sample usage:
void *key, *value;
st_generator *gen;
st_foreach_item(table, gen, &key, &value) {
process_item(value);
}
@sideeffect None
@see st_foreach_item_int st_foreach
*/
#define st_foreach_item(table, gen, key, value) \
for(gen=st_init_gen(table); st_gen(gen,key,value) || (st_free_gen(gen),0);)
/**
@brief Iteration macro.
@details
An iteration macro which loops over all the entries in
`table`, setting `key` to point to the key and `value` to the
associated value (if it is not nil). `value` is assumed to be a
pointer to an integer. `gen` is a generator variable used
internally. Sample usage:
void *key;
int value;
st_generator *gen;
st_foreach_item_int(table, gen, &key, &value) {
process_item(value);
}
@sideeffect None
@see st_foreach_item st_foreach
*/
#define st_foreach_item_int(table, gen, key, value) \
for(gen=st_init_gen(table); st_gen_int(gen,key,value) || (st_free_gen(gen),0);)
/*---------------------------------------------------------------------------*/
/* Function prototypes */
/*---------------------------------------------------------------------------*/
#ifdef __cplusplus
extern "C" {
#endif
st_table *st_init_table_with_params (st_compare_t, st_hash_t, int, int, double, int);
st_table *st_init_table (st_compare_t, st_hash_t);
st_table *st_init_table_with_params_and_arg (st_compare_arg_t, st_hash_arg_t, void const *, int, int, double, int);
st_table *st_init_table_with_arg (st_compare_arg_t, st_hash_arg_t, void const *);
void st_free_table (st_table *);
int st_lookup (st_table *, void const *, void **);
int st_lookup_int (st_table *, void const *, int *);
int st_insert (st_table *, void *, void *);
int st_add_direct (st_table *, void *, void *);
int st_find_or_add (st_table *, void *, void ***);
int st_find (st_table *, void const *, void ***);
st_table *st_copy (st_table const *);
int st_delete (st_table *, void **, void **);
int st_delete_int (st_table *, void **, int *);
int st_count(st_table const *);
int st_foreach (st_table *, st_foreach_t, void *);
int st_strhash (void const *, int);
int st_numhash (void const *, int);
int st_ptrhash (void const *, int);
int st_numcmp (void const *, void const *);
int st_ptrcmp (void const *, void const *);
st_generator *st_init_gen (st_table const *);
int st_gen (st_generator *, void **, void **);
int st_gen_int (st_generator *, void **, int *);
void st_free_gen (st_generator *);
#ifdef __cplusplus
} /* end of extern "C" */
#endif
#endif /* ST_H_ */