X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fident%2Fident.c;h=fbfe388b3e10b14a8b57335e632e44987ade44c6;hb=2be6077d3c0d1cdc8fad965f1857ac3a08c632aa;hp=01aa98f6aa4ac8137554f669e3cb9bef9ed3ff67;hpb=3c21ababf2b5985dbe433fda07855fc331456987;p=libfirm diff --git a/ir/ident/ident.c b/ir/ident/ident.c index 01aa98f6a..fbfe388b3 100644 --- a/ir/ident/ident.c +++ b/ir/ident/ident.c @@ -1,171 +1,100 @@ -/* Ident --- unique handles for identifiers - Copyright (C) 1995, 1996 Markus Armbruster - All rights reserved. */ - -/* $Id$ */ - -#ifdef HAVE_CONFIG_H -# include -#endif +/* + * This file is part of libFirm. + * Copyright (C) 2012 University of Karlsruhe. + */ + +/** + * @file + * @brief Hash table to store names. + * @author Goetz Lindenmaier + */ +#include "config.h" #include #include +#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 +#include "xmalloc.h" +#include "hashptr.h" static set *id_set; -#if 0 /* nowhere used */ -static ident * -new_id_derived (const char *pfx, ident *id) +void init_ident(void) { - 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)); + /* it's ok to use memcmp here, we check only strings */ + id_set = new_set(memcmp, 128); } - -static ident * -new_id_internal (void) +ident *new_id_from_chars(const char *str, size_t 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); + unsigned hash = hash_data((const unsigned char*)str, len); + ident *result = (ident*) set_hinsert0(id_set, str, len, hash); + return result; } - -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 != NULL); + return new_id_from_chars(str, strlen(str)); } -#endif - -#ifndef NDEBUG -static void -ids_vrfy (ident **id) +const char *get_id_str(ident *id) { - int i; - - for (i = 0; i < ARR_LEN (id); ++i) { - ID_VRFY (id[i]); - } + struct set_entry *entry = (struct set_entry*) id; + return (const char*) entry->dptr; } -#endif - -int -ident_print (XP_PAR1, const xprintf_info *info ATTRIBUTE((unused)), XP_PARN) +size_t get_id_strlen(ident *id) { - ident *id = XP_GETARG (ident *, 0); - return XPMR (ID_TO_STR (id), ID_TO_STRLEN (id)); + struct set_entry *entry = (struct set_entry*) id; + return entry->size; } - -void -id_init (void) +void finish_ident(void) { - 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 + del_set(id_set); + id_set = NULL; } - -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))); +int id_is_prefix(ident *prefix, ident *id) +{ + size_t prefix_len = get_id_strlen(prefix); + if (prefix_len > get_id_strlen(id)) + return 0; + return 0 == memcmp(get_id_str(prefix), get_id_str(id), prefix_len); } -INLINE const char *id_to_str (ident *id) { - return ((const char *)&(id)->dptr[0]); -} +int id_is_suffix(ident *suffix, ident *id) +{ + size_t suflen = get_id_strlen(suffix); + size_t idlen = get_id_strlen(id); + const char *part; -INLINE int id_to_strlen(ident *id) { - return ((id)->size); -} + if (suflen > idlen) + return 0; -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; -} + part = get_id_str(id); + part = part + (idlen - 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; + return 0 == memcmp(get_id_str(suffix), part, suflen); } -int print_id (ident *id) { - xprintf("%I", id); +int id_contains_char(ident *id, char c) +{ + return strchr(get_id_str(id), c) != NULL; } -int fprint_id (FILE *F, ident *id) { - xfprintf(F, "%I", id); +ident *id_unique(const char *tag) +{ + static unsigned unique_id = 0; + char buf[256]; + + snprintf(buf, sizeof(buf), tag, unique_id); + unique_id++; + return new_id_from_str(buf); }