X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fident%2Fident.c;h=22d15c233025567d1d542a06ee5ebd4c947049db;hb=ad7ea5e733b5a62df40a954ff5acdb2131cc4ace;hp=2ca2933d5a25d6c792030674281389782dc29b19;hpb=0694b15d1ea3f573d7bc531c389dd45e9dc55728;p=libfirm diff --git a/ir/ident/ident.c b/ir/ident/ident.c index 2ca2933d5..22d15c233 100644 --- a/ir/ident/ident.c +++ b/ir/ident/ident.c @@ -11,134 +11,96 @@ #include #include #include +#include + +#include "ident_t.h" #include "array.h" #include "tune.h" -#include "ident_t.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) -#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) -{ - 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)); -} +static set *id_set; - -ident * -new_id_internal (void) +void id_init(void) { - 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); + id_set = new_set(memcmp, TUNE_NIDENTS); } - -bool -id_is_internal (ident *id) +INLINE ident *id_from_str (const char *str, int len) { - assert (ID_TO_STRLEN (id)); - return !!ispunct (ID_TO_STR(id)[0]); + assert(len > 0); + return set_hinsert0(id_set, str, len, ID_HASH(str, len)); } - -#ifndef NDEBUG - -void -ids_vrfy (ident **id) +ident *new_id_from_str(const char *str) { - int i; - - for (i = 0; i < ARR_LEN (id); ++i) { - ID_VRFY (id[i]); - } + assert(str); + return id_from_str(str, strlen(str)); } -#endif - -int -ident_print (XP_PAR1, const xprintf_info *info ATTRIBUTE((unused)), XP_PARN) +INLINE const char *id_to_str(ident *id) { - ident *id = XP_GETARG (ident *, 0); - return XPMR (ID_TO_STR (id), ID_TO_STRLEN (id)); + return (const char *)id->dptr; } - -void -id_init (void) +INLINE int id_to_strlen(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 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))); + return id->size; } -INLINE const char *id_to_str (ident *id) { - return ((const char *)&(id)->dptr[0]); -} - -INLINE int id_to_strlen(ident *id) { - return ((id)->size); -} -#endif - -int id_is_prefix (ident *prefix, ident *id) { +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(prefix->dptr, id->dptr, id_to_strlen(prefix)); } -int id_is_suffix (ident *suffix, ident *id) { +int id_is_suffix(ident *suffix, ident *id) +{ int suflen = id_to_strlen(suffix); - int idlen = id_to_strlen(id); + int idlen = id_to_strlen(id); char *part; + if (suflen > idlen) return 0; - part = (char *) &id->dptr[0]; + part = (char *)id->dptr; part = part + (idlen - suflen); - if (0 == memcmp(&(suffix->dptr[0]), part, suflen)) - return 1; - return 0; + + return 0 == memcmp(suffix->dptr, part, suflen); } -int print_id (ident *id) { - xprintf("%I", id); +int id_contains_char(ident *id, char c) +{ + return strchr(id_to_str(id), c) != NULL; } -int fprint_id (FILE *F, ident *id) { - xfprintf(F, "%I", id); +int print_id (ident *id) +{ + return xprintf("%I", id); +} + +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) +{ + ident *id = XP_GETARG (ident *, 0); + return XPMR (ID_TO_STR (id), ID_TO_STRLEN (id)); }