+static int name_cache_cmp(const void *p1, const void *p2)
+{
+ // masm ignores case, so do we
+ return stricmp(*(char * const *)p1, *(char * const *)p2);
+}
+
+static void rebuild_name_cache(void)
+{
+ size_t i, newsize;
+ void *tmp;
+
+ // build a sorted name cache
+ newsize = get_nlist_size();
+ if (newsize > name_cache_size) {
+ tmp = realloc(name_cache, newsize * sizeof(name_cache[0]));
+ if (tmp == NULL) {
+ msg("OOM for name cache\n");
+ return;
+ }
+ name_cache = (char **)tmp;
+ }
+ for (i = 0; i < name_cache_size; i++)
+ free(name_cache[i]);
+ for (i = 0; i < newsize; i++)
+ name_cache[i] = strdup(get_nlist_name(i));
+
+ name_cache_size = newsize;
+ qsort(name_cache, name_cache_size, sizeof(name_cache[0]),
+ name_cache_cmp);
+}
+
+static void my_rename(ea_t ea, char *name)
+{
+ char buf[256];
+ char *p, **pp;
+ int n = 0;
+
+ qsnprintf(buf, sizeof(buf), "%s", name);
+ do {
+ p = buf;
+ pp = (char **)bsearch(&p, name_cache, name_cache_size,
+ sizeof(name_cache[0]), name_cache_cmp);
+ if (pp == NULL)
+ break;
+
+ qsnprintf(buf, sizeof(buf), "%s_g%d", name, n);
+ n++;
+ }
+ while (n < 100);
+
+ if (n == 100)
+ msg("rename failure? '%s'\n", name);
+
+ do_name_anyway(ea, buf);
+ rebuild_name_cache();
+}
+