Skip to content

Commit 1ecc9cc

Browse files
debugging for table insert and get functions
1 parent ea91e85 commit 1ecc9cc

File tree

2 files changed

+25
-16
lines changed

2 files changed

+25
-16
lines changed

cogni.c

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ cog_object* cog_hash(cog_object* obj) {
410410
return cog_expect_type_fatal(cog_pop(), &cog_ot_int);
411411
}
412412

413-
static cog_object* _mktable(cog_object* key, cog_object* val, cog_object* left, cog_object* right) {
413+
static cog_object* _treenode(cog_object* key, cog_object* val, cog_object* left, cog_object* right) {
414414
cog_object* a = cog_make_obj(&cog_ot_list);
415415
cog_object* b = cog_make_obj(&cog_ot_list);
416416
cog_object* c = cog_make_obj(&cog_ot_list);
@@ -437,16 +437,20 @@ static cog_object* _wraptab(cog_object* tree) {
437437
static cog_object* _iou_helper(cog_object* tree, cog_object* key, cog_object* val, int64_t hash) {
438438
if (!tree) {
439439
// we got to the end without finding a existing node, so add a new one
440-
return _mktable(key, val, NULL, NULL);
440+
cog_printf("DEBUG: New node with %O: %O\n", key, val);
441+
return _treenode(key, val, NULL, NULL);
441442
}
442443
bool is_left = hash & 1;
443444
int64_t rest_hash = hash >> 1;
444445
if (cog_equal(tree->TKEY, key)) {
445446
// update this node
446-
return _mktable(tree->TKEY, val, tree->TRIGHT, tree->TLEFT);
447+
cog_printf("DEBUG: Update node with %O: %O\n", key, val);
448+
return _treenode(tree->TKEY, val, tree->TRIGHT, tree->TLEFT);
447449
}
448450
// need to recurse
449-
cog_object* newnode = _mktable(tree->TKEY, tree->TVAL, tree->TRIGHT, tree->TLEFT);
451+
printf("->%s", is_left ? "left" : "right");
452+
fflush(stdout);
453+
cog_object* newnode = _treenode(tree->TKEY, tree->TVAL, tree->TRIGHT, tree->TLEFT);
450454
if (is_left) newnode->TLEFT = _iou_helper(newnode->TLEFT, key, val, rest_hash);
451455
else newnode->TRIGHT = _iou_helper(newnode->TRIGHT, key, val, rest_hash);
452456
return newnode;
@@ -456,27 +460,29 @@ static cog_object* _rem_helper(cog_object* tree, cog_object* key, int64_t hash)
456460
if (!tree) return NULL;
457461
bool is_left = hash & 1;
458462
int64_t rest_hash = hash >> 1;
459-
cog_object* newtab;
463+
cog_object* newtree;
460464

461465
if (cog_equal(key, tree->TKEY)) {
462466
// this node is what needs to be deleted
463-
if (!tree->TLEFT && !tree->TRIGHT) newtab = NULL; // leaf node gets deleted
467+
if (!tree->TLEFT && !tree->TRIGHT) newtree = NULL; // leaf node gets deleted
464468
// else just pick which side to delete. I chose right first else left
465-
else if (tree->TRIGHT) newtab = _mktable(tree->TRIGHT->TKEY, tree->TRIGHT->TVAL, tree->TLEFT, tree->TRIGHT->TRIGHT);
466-
else newtab = _mktable(tree->TLEFT->TKEY, tree->TLEFT->TVAL, tree->TLEFT->TLEFT, tree->TRIGHT);
469+
else if (tree->TRIGHT) newtree = _treenode(tree->TRIGHT->TKEY, tree->TRIGHT->TVAL, tree->TLEFT, tree->TRIGHT->TRIGHT);
470+
else newtree = _treenode(tree->TLEFT->TKEY, tree->TLEFT->TVAL, tree->TLEFT->TLEFT, tree->TRIGHT);
467471
} else {
468472
// it's another node that needs to be deleted
469-
if (is_left) newtab = _mktable(tree->TKEY, tree->TVAL, _rem_helper(tree->TLEFT, key, rest_hash), tree->TRIGHT);
470-
else newtab = _mktable(tree->TKEY, tree->TVAL, tree->TLEFT, _rem_helper(tree->TRIGHT, key, rest_hash));
473+
if (is_left) newtree = _treenode(tree->TKEY, tree->TVAL, _rem_helper(tree->TLEFT, key, rest_hash), tree->TRIGHT);
474+
else newtree = _treenode(tree->TKEY, tree->TVAL, tree->TLEFT, _rem_helper(tree->TRIGHT, key, rest_hash));
471475
}
472-
return newtab;
476+
return newtree;
473477
}
474478

475479
cog_object* cog_table_get(cog_object* tab, cog_object* key, bool* found) {
476480
assert(tab && tab->type == &cog_ot_table);
477481
cog_object* tree = tab->next; // get the internal tree
478482
int64_t hash = cog_hash(key)->as_int;
483+
cog_printf("DEBUG: getting with hash %llX, tree is: %O\n", hash, tree);
479484
while (tree) {
485+
cog_printf("DEBUG: looking at key %O\n", tree->TKEY);
480486
if (cog_equal(tree->TKEY, key)) {
481487
*found = true;
482488
return tree->TVAL;
@@ -485,13 +491,16 @@ cog_object* cog_table_get(cog_object* tab, cog_object* key, bool* found) {
485491
hash = hash >> 1;
486492
if (is_left) tree = tree->TLEFT;
487493
else tree = tree->TRIGHT;
494+
printf("%s->", is_left ? "left" : "right");
495+
fflush(stdout);
488496
}
489497
*found = false;
490498
return NULL;
491499
}
492500

493501
cog_object* cog_table_insert_or_update(cog_object* tab, cog_object* key, cog_object* val) {
494502
assert(tab && tab->type == &cog_ot_table);
503+
cog_printf("DEBUG: adding key %O to table\n", key);
495504
return _wraptab(_iou_helper(tab->next, key, val, cog_hash(key)->as_int));
496505
}
497506

@@ -797,7 +806,7 @@ cog_object* float_printself() {
797806
cog_object* num = cog_pop();
798807
cog_pop(); // ignore cookie
799808
char buffer[32];
800-
snprintf(buffer, sizeof(buffer), "%lg", num->as_float);
809+
snprintf(buffer, sizeof(buffer), "%lg%s", num->as_float, floor(num->as_float) == num->as_float ? ".0" : "");
801810
cog_push(cog_string(buffer));
802811
return NULL;
803812
}
@@ -808,7 +817,7 @@ static cog_object* m_float_hash() {
808817
cog_object* num = cog_pop();
809818
double val = num->as_float;
810819
// floats hash to their int value if it's an int, otherwise the reinterpret_cast of their bits
811-
int64_t hash = val == ((double)((int64_t)val)) ? (int64_t)val : *(int64_t*)&val;
820+
int64_t hash = val == floor(val) ? (int64_t)val : *(int64_t*)&val;
812821
cog_push(cog_box_int(hash));
813822
return NULL;
814823
}

test.cog

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
Let X be Box 0;
2-
Let Y be Box 0;
3-
Print == X Y;
1+
Let T be Table (For num in Reverse Range 1 to 20 do (^ Swap 2 Twin));
2+
Print T;
3+
Print Show . / 1 4 T;

0 commit comments

Comments
 (0)