aboutsummaryrefslogtreecommitdiff
path: root/jim.c
diff options
context:
space:
mode:
authorEvan Hunter <evan@ozhiker.com>2016-10-06 22:19:26 +0100
committerSteve Bennett <steveb@workware.net.au>2016-10-12 09:26:58 +1000
commit80032e22c35eb24d2df11843a723caa7c7160d29 (patch)
treef813e53f67fb094ae43b8be64331e9a35ed523a0 /jim.c
parent73176c908b681a9500af84abfa2f7f6234f3f913 (diff)
downloadjimtcl-80032e22c35eb24d2df11843a723caa7c7160d29.zip
jimtcl-80032e22c35eb24d2df11843a723caa7c7160d29.tar.gz
jimtcl-80032e22c35eb24d2df11843a723caa7c7160d29.tar.bz2
Array fixes and tests
Changed 'array exists' to actually check if the variable is an array (matches tclsh) Fix Jim_DictInfo to avoid using printf() and make output match tclsh Added some more tests for array command - checked these work with tclsh
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;
}