#include "Envs.h"
#include "BinNodes.h"
bool BinNode::isLeaf () {return left ==right;}
BinNode::BinNode () {
   left = NULL;
   right = NULL; 
}
BinNode::BinNode (Token &t, BinNode *l, BinNode *r) {
   t.copy(info);
   left = l;
   right = r;
}
Token &BinNode::val() 
{ Token *t =new Token; info.copy(*t); return *t;}
void BinNode::setLeft (BinNode *n) { left=n;}
void BinNode::setRight (BinNode *n) { right=n;}
BinNode * BinNode::getLeft () { return left;}
BinNode * BinNode::getRight () { return right;}
void BinNode::setInfo (Token n) { info=n;}
Token BinNode::getInfo () { return info;}



BinNode* bst;
void searchhelp(BinNode* bst, string  s, Token &t) { 
   entering ("searchhelp");
   if (bst == NULL) 
      return;
   else if (s == bst->val().val()) 
      bst->val().copy(t);
   else if (s < bst->val().val()) 
      searchhelp (bst->left, s, t);
   else
      searchhelp (bst->right,s,  t);
   leaving ("searchhelp");
}

void search (string s, TokenType &type) {
   Token t(type);
   searchhelp(bst, s, t);
   type=t.type(); 
}

// inserthelp -- insert t into bst
void inserthelp(BinNode* &bst, Token &t) {
   entering ("inserthelp");
   if (bst == NULL) 
      bst = new BinNode (t, NULL, NULL);
   else if (t.val() < bst->val().val()) 
      inserthelp (bst->left, t);
   else
      inserthelp (bst->right, t);
   leaving ("inserthelp");
}

// insert -- insert type,s into bst
void insert (TokenType type, string s) {
   entering("insert");
   Token t(type,s);
   inserthelp (bst,t); 
   leaving("insert");
}

int tindent=0;
void printTree (BinNode *n){
   if ( n != NULL) {
      for (int i=0; i<tindent; i++) cout << ' '; 
      n->val().displayln();
      tindent = tindent+4; 
      printTree(n->getLeft());
      printTree(n->getRight());
      tindent = tindent-4; 
   }
}


