X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fident%2Fident.c;h=027f02df38693fe161b8fec47f3da15dbbdfa02c;hb=fbcb96cc20a7b5d06136e4c70870e86173e658eb;hp=cb3b0825ad1625a93cd4bfb421c04243330f5078;hpb=d743c7ac94ab7d3f964b075ea2bb9f6c25ec4d52;p=libfirm diff --git a/ir/ident/ident.c b/ir/ident/ident.c index cb3b0825a..027f02df3 100644 --- a/ir/ident/ident.c +++ b/ir/ident/ident.c @@ -1,8 +1,14 @@ -/* Ident --- unique handles for identifiers - Copyright (C) 1995, 1996 Markus Armbruster - All rights reserved. */ - -/* $Id$ */ +/* + * Project: libFIRM + * File name: ir/common/ident.c + * Purpose: Hash table to store names. + * Author: Goetz Lindenmaier + * Modified by: + * Created: + * CVS-ID: $Id$ + * Copyright: (c) 1999-2003 Universität Karlsruhe + * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE. + */ #ifdef HAVE_CONFIG_H # include @@ -12,162 +18,72 @@ #include #include #include +#include #include "ident_t.h" #include "array.h" -#include "tune.h" -#include "misc.h" #include "set.h" -/* Caution: strings _not_ zero-terminated! */ -#define ID_FROM_STR(str, len) \ - (assert ((len) > 0), \ - (const set_entry *)set_hinsert (id_set, (str), (len), ID_HASH ((str), (len)))) -#define ID_TO_STR(id) ((const char *)&(id)->dptr[0]) -#define ID_TO_STRLEN(id) ((id)->size) -#define ID_TO_HASH(id) ((long)(id) + (id)->hash) - -/* Vormals Debugunterstuetzung, entfernt (debug.h). */ -# define ID_VRFY(id) ((void)0) - -#ifdef NDEBUG -# define IDS_VRFY(id) ((void)0) -#else -# define IDS_VRFY(id) ids_vrfy ((id)) -static void ids_vrfy (ident **id); -#endif - -#ifdef STATS -# define id_stats() set_stats (id_set) -#else -# define id_stats() ((void)0) -#endif - -extern set *id_set; - -#define XX_USER(name) ident *id_##name; -#define XX_INTERNAL(name, str) XX_USER(name) -#undef XX_USER -#undef XX_INTERNAL - static set *id_set; -#if 0 /* nowhere used */ -static ident * -new_id_derived (const char *pfx, ident *id) +void id_init(int initial_n_idents) { - int pfx_len = strlen (pfx); - int len = pfx_len + ID_TO_STRLEN (id); - char *str = alloca (len); - - memcpy (str, pfx, pfx_len); - memcpy (str+pfx_len, ID_TO_STR (id), ID_TO_STRLEN (id)); - return ID_FROM_STR (str, pfx_len + ID_TO_STRLEN (id)); + id_set = new_set(memcmp, initial_n_idents); } - -static ident * -new_id_internal (void) +INLINE ident *id_from_str (const char *str, int len) { - static char str[] = "_0000000"; - int i; - - i = sizeof (str) - 2; - while (++str[i] == '9'+1) { - str[i--] = '0'; - /* if following assertion fails, we get called far too often ;-) */ - assert (i >= 0); - } - assert (('0' <= str[i]) && (str[i] <= '9')); - - return ID_FROM_STR (str, sizeof (str) - 1); + assert(len > 0); + return set_hinsert0(id_set, str, len, ID_HASH(str, len)); } - -static bool -id_is_internal (ident *id) +ident *new_id_from_str(const char *str) { - assert (ID_TO_STRLEN (id)); - return !!ispunct (ID_TO_STR(id)[0]); + assert(str); + return id_from_str(str, strlen(str)); } -#endif - -#ifndef NDEBUG -static void -ids_vrfy (ident **id) +INLINE const char *get_id_str(ident *id) { - int i; - - for (i = 0; i < ARR_LEN (id); ++i) { - ID_VRFY (id[i]); - } + return (const char *)id->dptr; } -#endif - -int -ident_print (XP_PAR1, const xprintf_info *info ATTRIBUTE((unused)), XP_PARN) +INLINE int get_id_strlen(ident *id) { - ident *id = XP_GETARG (ident *, 0); - return XPMR (ID_TO_STR (id), ID_TO_STRLEN (id)); + return id->size; } - -void -id_init (void) +int id_is_prefix(ident *prefix, ident *id) { - id_set = new_set (memcmp, TUNE_NIDENTS); - -#define XX_USER(name) id_##name = ID_FROM_STR(#name, sizeof(#name)- 1); -#define XX_INTERNAL(name, str) id_##name = ID_FROM_STR((str), sizeof((str))-1); -#undef XX_USER -#undef XX_INTERNAL + if (get_id_strlen(prefix) > get_id_strlen(id)) return 0; + return 0 == memcmp(prefix->dptr, id->dptr, get_id_strlen(prefix)); } +int id_is_suffix(ident *suffix, ident *id) +{ + int suflen = get_id_strlen(suffix); + int idlen = get_id_strlen(id); + char *part; -INLINE ident *id_from_str (const char *str, int len) { - assert (len > 0); - return (const set_entry *) set_hinsert (id_set, - (str), - (len), - ID_HASH ((str), (len))); -} - -INLINE const char *id_to_str (ident *id) { - return ((const char *)&(id)->dptr[0]); -} + if (suflen > idlen) return 0; -INLINE int id_to_strlen(ident *id) { - return ((id)->size); -} + part = (char *)id->dptr; + part = part + (idlen - suflen); -int id_is_prefix (ident *prefix, ident *id) { - if (id_to_strlen(prefix) > id_to_strlen(id)) return 0; - if (0 == memcmp(&(prefix->dptr[0]), &(id->dptr[0]), id_to_strlen(prefix))) - return 1; - return 0; + return 0 == memcmp(suffix->dptr, part, suflen); } -int id_is_suffix (ident *suffix, ident *id) { - int suflen = id_to_strlen(suffix); - int idlen = id_to_strlen(id); - char *part; - if (suflen > idlen) return 0; - - part = (char *) &id->dptr[0]; - part = part + (idlen - suflen); - if (0 == memcmp(&(suffix->dptr[0]), part, suflen)) - return 1; - return 0; +int id_contains_char(ident *id, char c) +{ + return strchr(get_id_str(id), c) != NULL; } -int print_id (ident *id) { - xprintf("%I", id); - return(0); +int print_id (ident *id) +{ + return printf("%s", get_id_str(id)); } -int fprint_id (FILE *F, ident *id) { - xfprintf(F, "%I", id); - return(0); +int fprint_id (FILE *F, ident *id) +{ + return fprintf(F, "%s", get_id_str(id)); }