X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fident%2Fident.c;h=fbfe388b3e10b14a8b57335e632e44987ade44c6;hb=2be6077d3c0d1cdc8fad965f1857ac3a08c632aa;hp=071b3a3f2741de3edd6e2de3d3df52b9323f8036;hpb=fd1372960d9e56b8f4573aef4cb44593106d114f;p=libfirm diff --git a/ir/ident/ident.c b/ir/ident/ident.c index 071b3a3f2..fbfe388b3 100644 --- a/ir/ident/ident.c +++ b/ir/ident/ident.c @@ -1,136 +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 "array.h" -#include "tune.h" -#include "ident_t.h" -#include "xprintf.h" +#include +#include -#define XX_USER(name) ident *id_##name; -#define XX_INTERNAL(name, str) XX_USER(name) -#undef XX_USER -#undef XX_INTERNAL - -set *id_set; +#include "ident_t.h" +#include "set.h" +#include "xmalloc.h" +#include "hashptr.h" +static set *id_set; -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); } - -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; } - -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)); } - -#ifndef NDEBUG - -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); + del_set(id_set); + id_set = NULL; +} -#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 +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); } +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; + + if (suflen > idlen) + return 0; -#if 1 -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))); -} + part = get_id_str(id); + part = part + (idlen - suflen); -inline const char *id_to_str (ident *id) { - return ((const char *)&(id)->dptr[0]); + return 0 == memcmp(get_id_str(suffix), part, suflen); } -inline int id_to_strlen(ident *id) { - return ((id)->size); +int id_contains_char(ident *id, char c) +{ + return strchr(get_id_str(id), c) != NULL; } -#endif -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; -} +ident *id_unique(const char *tag) +{ + static unsigned unique_id = 0; + char buf[256]; -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; + snprintf(buf, sizeof(buf), tag, unique_id); + unique_id++; + return new_id_from_str(buf); }