add isl_local_space_substitute_equalities
[isl.git] / isl_name.c
bloba9a6382f75ef00e77409326c0cdc4f9904268d03
1 /*
2 * Copyright 2008-2009 Katholieke Universiteit Leuven
4 * Use of this software is governed by the GNU LGPLv2.1 license
6 * Written by Sven Verdoolaege, K.U.Leuven, Departement
7 * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
8 */
10 #include <string.h>
11 #include <isl_ctx_private.h>
12 #include "isl_name.h"
14 struct isl_name *isl_name_alloc(struct isl_ctx *ctx, const char *s)
16 const char *copy = strdup(s);
17 struct isl_name *name;
19 if (!copy)
20 return NULL;
21 name = isl_alloc_type(ctx, struct isl_name);
22 if (!name)
23 goto error;
25 name->ref = 1;
26 name->name = copy;
28 name->hash = isl_hash_init();
29 name->hash = isl_hash_string(name->hash, s);
31 return name;
32 error:
33 free((char *)copy);
34 return NULL;
37 static int isl_name_has_name(const void *entry, const void *val)
39 struct isl_name *name = (struct isl_name *)entry;
40 const char *s = (const char *)val;
42 return !strcmp(name->name, s);
45 struct isl_name *isl_name_get(struct isl_ctx *ctx, const char *name)
47 struct isl_hash_table_entry *entry;
48 uint32_t name_hash;
50 name_hash = isl_hash_string(isl_hash_init(), name);
51 entry = isl_hash_table_find(ctx, &ctx->name_hash, name_hash,
52 isl_name_has_name, name, 1);
53 if (!entry)
54 return NULL;
55 if (entry->data)
56 return isl_name_copy(ctx, entry->data);
57 entry->data = isl_name_alloc(ctx, name);
58 if (!entry->data)
59 ctx->name_hash.n--;
60 return entry->data;
63 struct isl_name *isl_name_copy(struct isl_ctx *ctx, struct isl_name *name)
65 if (!name)
66 return NULL;
68 name->ref++;
69 return name;
72 static int isl_name_eq(const void *entry, const void *name)
74 return entry == name;
77 uint32_t isl_hash_name(uint32_t hash, struct isl_name *name)
79 if (name)
80 isl_hash_hash(hash, name->hash);
82 return hash;
85 void isl_name_free(struct isl_ctx *ctx, struct isl_name *name)
87 uint32_t name_hash;
88 struct isl_hash_table_entry *entry;
90 if (!name)
91 return;
93 if (--name->ref > 0)
94 return;
96 name_hash = isl_hash_string(isl_hash_init(), name->name);
97 entry = isl_hash_table_find(ctx, &ctx->name_hash, name_hash,
98 isl_name_eq, name, 0);
99 isl_assert(ctx, entry, return);
100 isl_hash_table_remove(ctx, &ctx->name_hash, entry);
102 free((char *)name->name);
103 free(name);