X-Git-Url: https://git.distorted.org.uk/~mdw/mLib/blobdiff_plain/0875b58fcccadd756e11487185c2ac1d3ed8ab4d..05fbeb037cbb48a9c86e843becba9d02486868cc:/sym.h?ds=sidebyside diff --git a/sym.h b/sym.h index 35a3fa6..94d43c5 100644 --- a/sym.h +++ b/sym.h @@ -1,36 +1,56 @@ /* -*-c-*- * - * $Id: sym.h,v 1.1 1998/06/17 23:44:42 mdw Exp $ + * $Id: sym.h,v 1.7 1999/06/01 09:49:33 mdw Exp $ * * Symbol table management * * (c) 1998 Straylight/Edgeware */ -/*----- Licensing notice --------------------------------------------------* +/*----- Licensing notice --------------------------------------------------* * * This file is part of the mLib utilities library. * * mLib is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * * mLib is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with mLib; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with mLib; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. */ /*----- Revision history --------------------------------------------------* * * $Log: sym.h,v $ - * Revision 1.1 1998/06/17 23:44:42 mdw - * Initial revision + * Revision 1.7 1999/06/01 09:49:33 mdw + * Allow things to be looked up by just their caller-supplied hashes. This + * actually needs to be thought through better. + * + * Revision 1.6 1999/05/26 21:08:31 mdw + * Rename symbols in line with newer conventions. + * + * Revision 1.5 1999/05/13 22:48:37 mdw + * Change `-ise' to `-ize' throughout. + * + * Revision 1.4 1999/05/06 19:51:35 mdw + * Reformatted the LGPL notice a little bit. + * + * Revision 1.3 1999/05/05 18:50:31 mdw + * Change licensing conditions to LGPL. + * + * Revision 1.2 1998/11/26 19:27:34 mdw + * Move SYM_NAME into the header file. Fix bugs. + * + * Revision 1.1.1.1 1998/06/17 23:44:42 mdw + * Initial version of mLib * */ @@ -45,6 +65,10 @@ #include +#ifndef BITS_H +# include "bits.h" +#endif + /*----- Type definitions --------------------------------------------------*/ /* --- Symbol table --- * @@ -73,7 +97,7 @@ typedef struct sym_table { typedef struct sym_base { struct sym_base *next; /* Next symbol in hash bin */ - unsigned long hash; /* Hash value for symbol's name */ + uint32 hash; /* Hash value for symbol's name */ union { char *p; /* Pointer to name string */ char b[SYM_BUFSZ]; /* Buffer containing a short name */ @@ -81,6 +105,13 @@ typedef struct sym_base { size_t len; /* Length of the symbol's name */ } sym_base; +/* --- A macro to pick a symbol's name out from the mess --- */ + +#define SYM_NAME(sy) \ + (((sym_base *)(sy))->len > SYM_BUFSZ ? \ + ((sym_base *)(sy))->name.p : \ + ((sym_base *)(sy))->name.b) + /* --- An iterator block --- */ typedef struct sym_iter { @@ -91,19 +122,19 @@ typedef struct sym_iter { /*----- External functions ------------------------------------------------*/ -/* --- @sym_createTable@ --- * +/* --- @sym_create@ --- * * - * Arguments: @sym_table *t@ = symbol table to initialise + * Arguments: @sym_table *t@ = symbol table to initialize * * Returns: --- * - * Use: Initialises the given symbol table. Raises @EXC_NOMEM@ if + * Use: Initializes the given symbol table. Raises @EXC_NOMEM@ if * there isn't enough memory. */ -extern void sym_createTable(sym_table */*t*/); +extern void sym_create(sym_table */*t*/); -/* --- @sym_destroyTable@ --- * +/* --- @sym_destroy@ --- * * * Arguments: @sym_table *t@ = pointer to symbol table in question * @@ -113,7 +144,7 @@ extern void sym_createTable(sym_table */*t*/); * occupy. */ -extern void sym_destroyTable(sym_table */*t*/); +extern void sym_destroy(sym_table */*t*/); /* --- @sym_find@ --- * * @@ -131,7 +162,9 @@ extern void sym_destroyTable(sym_table */*t*/); * may be given, in which case the name may contain arbitrary * binary data, or it may be given as a negative number, in * which case the length of the name is calculated as - * @strlen(n)@. + * @strlen(n) + 1@. The name pointer @n@ may also be zero; in + * this case, @l@ is taken to be a raw hash, and any element + * with a matching hash is taken to be the one wanted. * * The return value is the address of a pointer to a @sym_base@ * block (which may have other things on the end, as above). If @@ -163,7 +196,7 @@ extern void *sym_find(sym_table */*t*/, const char */*n*/, long /*l*/, extern void sym_remove(sym_table */*t*/, void */*b*/); -/* --- @sym_createIter@ --- * +/* --- @sym_mkiter@ --- * * * Arguments: @sym_iter *i@ = pointer to an iterator object * @sym_table *t@ = pointer to a symbol table object @@ -174,7 +207,7 @@ extern void sym_remove(sym_table */*t*/, void */*b*/); * iterate through a symbol table. */ -extern void sym_createIter(sym_iter */*i*/, sym_table */*t*/); +extern void sym_mkiter(sym_iter */*i*/, sym_table */*t*/); /* --- @sym_next@ --- * *