X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fident%2Fident.c;h=22d15c233025567d1d542a06ee5ebd4c947049db;hb=ad7ea5e733b5a62df40a954ff5acdb2131cc4ace;hp=6b46413939bd44a34fd6d8046279110301505d90;hpb=7bca625cffc0464a36743eb0baa58f56e02598ec;p=libfirm diff --git a/ir/ident/ident.c b/ir/ident/ident.c index 6b4641393..22d15c233 100644 --- a/ir/ident/ident.c +++ b/ir/ident/ident.c @@ -2,6 +2,8 @@ Copyright (C) 1995, 1996 Markus Armbruster All rights reserved. */ +/* $Id$ */ + #ifdef HAVE_CONFIG_H # include #endif @@ -9,72 +11,92 @@ #include #include #include +#include + +#include "ident_t.h" #include "array.h" #include "tune.h" -#include "ident.h" -#include "xprintf.h" +#include "misc.h" +#include "set.h" -#define XX_USER(name) ident *id_##name; -#define XX_INTERNAL(name, str) XX_USER(name) -//#include "xx_ident.h" -#undef XX_USER -#undef XX_INTERNAL +#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) -set *id_set; +/* Vormals Debugunterstuetzung, entfernt (debug.h). */ +# define ID_VRFY(id) ((void)0) +# define IDS_VRFY(id) ((void)0) + +#ifdef STATS +# define id_stats() set_stats (id_set) +#else +# define id_stats() ((void)0) +#endif -ident * -new_id_derived (const char *pfx, ident *id) +static set *id_set; + +void id_init(void) { - int pfx_len = strlen (pfx); - int len = pfx_len + ID_TO_STRLEN (id); - char *str = alloca (len); + id_set = new_set(memcmp, TUNE_NIDENTS); +} - 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)); +INLINE ident *id_from_str (const char *str, int len) +{ + assert(len > 0); + return set_hinsert0(id_set, str, len, ID_HASH(str, len)); } +ident *new_id_from_str(const char *str) +{ + assert(str); + return id_from_str(str, strlen(str)); +} -ident * -new_id_internal (void) +INLINE const char *id_to_str(ident *id) { - 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); + return (const char *)id->dptr; } +INLINE int id_to_strlen(ident *id) +{ + return id->size; +} -bool -id_is_internal (ident *id) +int id_is_prefix(ident *prefix, ident *id) { - assert (ID_TO_STRLEN (id)); - return !!ispunct (ID_TO_STR(id)[0]); + if (id_to_strlen(prefix) > id_to_strlen(id)) return 0; + return 0 == memcmp(prefix->dptr, id->dptr, id_to_strlen(prefix)); } +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; -#ifndef NDEBUG + part = (char *)id->dptr; + part = part + (idlen - suflen); -void -ids_vrfy (ident **id) + return 0 == memcmp(suffix->dptr, part, suflen); +} + +int id_contains_char(ident *id, char c) { - int i; + return strchr(id_to_str(id), c) != NULL; +} - for (i = 0; i < ARR_LEN (id); ++i) { - ID_VRFY (id[i]); - } +int print_id (ident *id) +{ + return xprintf("%I", id); } -#endif +int fprint_id (FILE *F, ident *id) +{ + return xfprintf(F, "%I", id); +} int ident_print (XP_PAR1, const xprintf_info *info ATTRIBUTE((unused)), XP_PARN) @@ -82,16 +104,3 @@ ident_print (XP_PAR1, const xprintf_info *info ATTRIBUTE((unused)), XP_PARN) ident *id = XP_GETARG (ident *, 0); return XPMR (ID_TO_STR (id), ID_TO_STRLEN (id)); } - - -void -id_init (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); - //#include "xx_ident.h" -#undef XX_USER -#undef XX_INTERNAL -}