512b62fb1b
* configure.in (i?86-*-beos{pe,elf,}*): Recognize. * i386/t-beos, i386/x-beos, i386/xm-beos.h: New files. * i386/beos-elf.h, i386/beos-pe.h: New files. * Makefile.in (CROSS_SYSTEM_HEADER_DIR): New. * cross-make (SYSTEM_HEADER_DIR): Define using CROSS_SYSTEM_HEADER_DIR. * gcc.c (LIBRARY_PATH_ENV): Provide default. (process_command): Use it. (main): Likewise. Kill trailing = from env vars. (build_search_list): Put it back. * collect2.c (main): Use LIBRARY_PATH_ENV. * configure.in (GCC_NEED_DECLARATIONS): Add environ. * toplev.c: Use NEED_DECLARATION_ENVIRON. * tm.texi (Frame Layout): Document SMALL_STACK. * c-common.c (c_common_nodes_and_builtins): Check it. * system.h: Undef alloca after including glibc's <stdlib.h>, if USE_C_ALLOCA is defined. * gcc.c (set_input): New fn. (main): After all input files are compiled, reset the input file info to the first. * aclocal.m4 (rindex, index): If already defined, don't attempt to redefine. * ginclude/varargs.h: (__va_list__): Define ifndef. * ginclude/stdarg.h: Likewise. * ginclude/stddef.h (__WCHAR_TYPE__) [BEOS]: Use int instead of unsigned char. * hash.h (true, false, boolean): Undef before enum. From-SVN: r31366
136 lines
4.7 KiB
C
136 lines
4.7 KiB
C
/* Header file for generic hash table support.
|
|
Copyright (C) 1993, 1994, 1997, 1998 Free Software Foundation, Inc.
|
|
Written by Steve Chamberlain <sac@cygnus.com>
|
|
|
|
This file was lifted from BFD, the Binary File Descriptor library.
|
|
|
|
This program 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.
|
|
|
|
This program 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 this program; if not, write to the Free Software
|
|
Foundation, 59 Temple Place - Suite 330,
|
|
Boston, MA 02111-1307, USA. */
|
|
|
|
#ifndef IN_GCC
|
|
#include <ansidecl.h>
|
|
#endif /* ! IN_GCC */
|
|
|
|
#include "obstack.h"
|
|
|
|
#undef false
|
|
#undef true
|
|
#undef boolean
|
|
|
|
typedef enum {false, true} boolean;
|
|
|
|
typedef PTR hash_table_key;
|
|
|
|
/* Hash table routines. There is no way to free up a hash table. */
|
|
|
|
/* An element in the hash table. Most uses will actually use a larger
|
|
structure, and an instance of this will be the first field. */
|
|
|
|
struct hash_entry
|
|
{
|
|
/* Next entry for this hash code. */
|
|
struct hash_entry *next;
|
|
/* The thing being hashed. */
|
|
hash_table_key key;
|
|
/* Hash code. This is the full hash code, not the index into the
|
|
table. */
|
|
unsigned long hash;
|
|
};
|
|
|
|
/* A hash table. */
|
|
|
|
struct hash_table
|
|
{
|
|
/* The hash array. */
|
|
struct hash_entry **table;
|
|
/* The number of slots in the hash table. */
|
|
unsigned int size;
|
|
/* A function used to create new elements in the hash table. The
|
|
first entry is itself a pointer to an element. When this
|
|
function is first invoked, this pointer will be NULL. However,
|
|
having the pointer permits a hierarchy of method functions to be
|
|
built each of which calls the function in the superclass. Thus
|
|
each function should be written to allocate a new block of memory
|
|
only if the argument is NULL. */
|
|
struct hash_entry *(*newfunc) PARAMS ((struct hash_entry *,
|
|
struct hash_table *,
|
|
hash_table_key));
|
|
/* A function to compute the hash code for a key in the hash table. */
|
|
unsigned long (*hash) PARAMS ((hash_table_key));
|
|
/* A function to compare two keys. */
|
|
boolean (*comp) PARAMS ((hash_table_key, hash_table_key));
|
|
/* An obstack for this hash table. */
|
|
struct obstack memory;
|
|
};
|
|
|
|
/* Initialize a hash table. */
|
|
extern boolean hash_table_init
|
|
PARAMS ((struct hash_table *,
|
|
struct hash_entry *(*) (struct hash_entry *,
|
|
struct hash_table *,
|
|
hash_table_key),
|
|
unsigned long (*hash) (hash_table_key),
|
|
boolean (*comp) (hash_table_key, hash_table_key)));
|
|
|
|
/* Initialize a hash table specifying a size. */
|
|
extern boolean hash_table_init_n
|
|
PARAMS ((struct hash_table *,
|
|
struct hash_entry *(*) (struct hash_entry *,
|
|
struct hash_table *,
|
|
hash_table_key),
|
|
unsigned long (*hash) (hash_table_key),
|
|
boolean (*comp) (hash_table_key, hash_table_key),
|
|
unsigned int size));
|
|
|
|
/* Free up a hash table. */
|
|
extern void hash_table_free PARAMS ((struct hash_table *));
|
|
|
|
/* Look up KEY in a hash table. If CREATE is true, a new entry
|
|
will be created for this KEY if one does not already exist. If
|
|
COPY is non-NULL, it is used to copy the KEY before storing it in
|
|
the hash table. */
|
|
extern struct hash_entry *hash_lookup
|
|
PARAMS ((struct hash_table *, hash_table_key key, boolean create,
|
|
hash_table_key (*copy)(struct obstack*, hash_table_key)));
|
|
|
|
/* Base method for creating a hash table entry. */
|
|
extern struct hash_entry *hash_newfunc
|
|
PARAMS ((struct hash_entry *, struct hash_table *,
|
|
hash_table_key key));
|
|
|
|
/* Grab some space for a hash table entry. */
|
|
extern PTR hash_allocate PARAMS ((struct hash_table *,
|
|
unsigned int));
|
|
|
|
/* Traverse a hash table in a random order, calling a function on each
|
|
element. If the function returns false, the traversal stops. The
|
|
INFO argument is passed to the function. */
|
|
extern void hash_traverse PARAMS ((struct hash_table *,
|
|
boolean (*) (struct hash_entry *,
|
|
hash_table_key),
|
|
hash_table_key info));
|
|
|
|
/* Hash a string K, which is really of type `char*'. */
|
|
extern unsigned long string_hash PARAMS ((hash_table_key k));
|
|
|
|
/* Compare two strings K1, K2 which are really of type `char*'. */
|
|
extern boolean string_compare PARAMS ((hash_table_key k1,
|
|
hash_table_key k2));
|
|
|
|
/* Copy a string K, which is really of type `char*'. */
|
|
extern hash_table_key string_copy PARAMS ((struct obstack* memory,
|
|
hash_table_key k));
|
|
|