aboutsummaryrefslogtreecommitdiff
path: root/jim.c
diff options
context:
space:
mode:
Diffstat (limited to 'jim.c')
-rw-r--r--jim.c39
1 files changed, 29 insertions, 10 deletions
diff --git a/jim.c b/jim.c
index 04eedc6..443da61 100644
--- a/jim.c
+++ b/jim.c
@@ -14365,6 +14365,9 @@ int Jim_DictInfo(Jim_Interp *interp, Jim_Obj *objPtr)
{
Jim_HashTable *ht;
unsigned int i;
+ char buffer[100];
+ int sum = 0;
+ int nonzero_count = 0;
if (SetDictFromAny(interp, objPtr) != JIM_OK) {
return JIM_ERR;
@@ -14373,21 +14376,37 @@ int Jim_DictInfo(Jim_Interp *interp, Jim_Obj *objPtr)
ht = (Jim_HashTable *)objPtr->internalRep.ptr;
/* Note that this uses internal knowledge of the hash table */
- printf("%d entries in table, %d buckets\n", ht->used, ht->size);
+ snprintf(buffer, sizeof(buffer), "%d entries in table, %d buckets\n", ht->used, ht->size);
+ Jim_Obj *output = Jim_NewStringObj(interp, buffer, -1);
+ int bucket_counts[11] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
for (i = 0; i < ht->size; i++) {
Jim_HashEntry *he = ht->table[i];
-
- if (he) {
- printf("%d: ", i);
-
- while (he) {
- printf(" %s", Jim_String(he->key));
- he = he->next;
- }
- printf("\n");
+ int entries = 0;
+ while (he) {
+ entries++;
+ he = he->next;
}
+ if (entries > 9) {
+ bucket_counts[10]++;
+ }
+ else {
+ bucket_counts[entries]++;
+ }
+ if (entries) {
+ sum += entries;
+ nonzero_count++;
+ }
+ }
+ for (i = 0; i < 10; i++) {
+ snprintf(buffer, sizeof(buffer), "number of buckets with %d entries: %d\n", i, bucket_counts[i]);
+ Jim_AppendString(interp, output, buffer, -1);
}
+ snprintf(buffer, sizeof(buffer), "number of buckets with 10 or more entries: %d\n", bucket_counts[10]);
+ Jim_AppendString(interp, output, buffer, -1);
+ snprintf(buffer, sizeof(buffer), "average search distance for entry: %.1f", nonzero_count ? (double)sum / nonzero_count : 0.0);
+ Jim_AppendString(interp, output, buffer, -1);
+ Jim_SetResult(interp, output);
return JIM_OK;
}