aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFangrui Song <maskray@google.com>2021-10-19 09:36:43 -0700
committerFangrui Song <maskray@google.com>2021-10-19 09:36:43 -0700
commit53d19edf7b7ab506b510c9c879a575c8484d075f (patch)
treef164ce4e04ecf2ab8542cbcde8753dd317496aef
parent2ec99d8c42b2ff1a1231e4df462a0910a9b7fdef (diff)
downloadglibc-53d19edf7b7ab506b510c9c879a575c8484d075f.zip
glibc-53d19edf7b7ab506b510c9c879a575c8484d075f.tar.gz
glibc-53d19edf7b7ab506b510c9c879a575c8484d075f.tar.bz2
nss: Unnest nested function add_key
This makes makedb.c compilable with Clang which does not support nested functions. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
-rw-r--r--nss/makedb.c82
1 files changed, 41 insertions, 41 deletions
diff --git a/nss/makedb.c b/nss/makedb.c
index 30c3d04..b0d2166 100644
--- a/nss/makedb.c
+++ b/nss/makedb.c
@@ -618,6 +618,45 @@ next_prime (size_t seed)
return seed;
}
+static size_t max_chainlength;
+static char *wp;
+static size_t nhashentries;
+static bool copy_string;
+
+void add_key(const void *nodep, VISIT which, void *arg)
+{
+ if (which != leaf && which != postorder)
+ return;
+
+ const struct database *db = (const struct database *) arg;
+ const struct dbentry *dbe = *(const struct dbentry **) nodep;
+
+ ptrdiff_t stridx;
+ if (copy_string)
+ {
+ stridx = wp - db->keystrtab;
+ wp = stpcpy (wp, dbe->str) + 1;
+ }
+ else
+ stridx = 0;
+
+ size_t hidx = dbe->hashval % nhashentries;
+ size_t hval2 = 1 + dbe->hashval % (nhashentries - 2);
+ size_t chainlength = 0;
+
+ while (db->hashtable[hidx] != ~((stridx_t) 0))
+ {
+ ++chainlength;
+ if ((hidx += hval2) >= nhashentries)
+ hidx -= nhashentries;
+ }
+
+ db->hashtable[hidx] = ((db->extra_string ? valstrlen : 0)
+ + dbe->validx);
+ db->keyidxtab[hidx] = stridx;
+
+ max_chainlength = MAX (max_chainlength, chainlength);
+}
static void
compute_tables (void)
@@ -649,45 +688,6 @@ compute_tables (void)
db->keyidxtab = db->hashtable + nhashentries_max;
db->keystrtab = (char *) (db->keyidxtab + nhashentries_max);
- static size_t max_chainlength;
- static char *wp;
- static size_t nhashentries;
- static bool copy_string;
-
- void add_key(const void *nodep, const VISIT which, const int depth)
- {
- if (which != leaf && which != postorder)
- return;
-
- const struct dbentry *dbe = *(const struct dbentry **) nodep;
-
- ptrdiff_t stridx;
- if (copy_string)
- {
- stridx = wp - db->keystrtab;
- wp = stpcpy (wp, dbe->str) + 1;
- }
- else
- stridx = 0;
-
- size_t hidx = dbe->hashval % nhashentries;
- size_t hval2 = 1 + dbe->hashval % (nhashentries - 2);
- size_t chainlength = 0;
-
- while (db->hashtable[hidx] != ~((stridx_t) 0))
- {
- ++chainlength;
- if ((hidx += hval2) >= nhashentries)
- hidx -= nhashentries;
- }
-
- db->hashtable[hidx] = ((db->extra_string ? valstrlen : 0)
- + dbe->validx);
- db->keyidxtab[hidx] = stridx;
-
- max_chainlength = MAX (max_chainlength, chainlength);
- }
-
copy_string = false;
nhashentries = nhashentries_min;
for (size_t cnt = 0; cnt < TEST_RANGE; ++cnt)
@@ -697,7 +697,7 @@ compute_tables (void)
max_chainlength = 0;
wp = db->keystrtab;
- twalk (db->entries, add_key);
+ twalk_r (db->entries, add_key, db);
if (max_chainlength == 0)
{
@@ -724,7 +724,7 @@ compute_tables (void)
copy_string = true;
wp = db->keystrtab;
- twalk (db->entries, add_key);
+ twalk_r (db->entries, add_key, db);
db->nhashentries = nhashentries_best;
nhashentries_total += nhashentries_best;