diff options
author | Evan Hunter <evan@ozhiker.com> | 2016-10-06 22:19:26 +0100 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2016-10-12 09:26:58 +1000 |
commit | 80032e22c35eb24d2df11843a723caa7c7160d29 (patch) | |
tree | f813e53f67fb094ae43b8be64331e9a35ed523a0 /jim.c | |
parent | 73176c908b681a9500af84abfa2f7f6234f3f913 (diff) | |
download | jimtcl-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.c | 39 |
1 files changed, 29 insertions, 10 deletions
@@ -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; } |