aboutsummaryrefslogtreecommitdiff
path: root/treetree.js
diff options
context:
space:
mode:
Diffstat (limited to 'treetree.js')
-rwxr-xr-xtreetree.js31
1 files changed, 27 insertions, 4 deletions
diff --git a/treetree.js b/treetree.js
index 1c0e0ff..f32bfdd 100755
--- a/treetree.js
+++ b/treetree.js
@@ -233,9 +233,32 @@ function runCmds(cmds,TR){
TR[1]=objcpy(TR[2]);
TR[2]=temp;
break;
- case "POP":break;
- case "DUP":break;
- case "GRB":break;
+ case "POP":
+ if(TR==false)throw new TTerror("Cannot POP a non-existant root node!");
+ TR=TR[1];
+ break;
+ case "DUP":
+ var newroot;
+ newroot=[TR[0],TR,objcpy(TR[2])];
+ TR=newroot;
+ break;
+ case "GRB": //TODO CHECK WHETHER THIS SHIT WORKS
+ var inserted_tree,end_tree,rest_tree,i,n;
+ if(TR==false)throw new TTerror("Cannot GRB from a non-existant root node!");
+ n=TR[0];
+ if(typeof n!="number")throw new TTerror("Integer expected (in GRB), got '"+n.toString()+"'!")
+ TR=TR[1];
+ if(n==0)break;
+ inserted_tree=objcpy(TR[1]);
+ if(inserted_tree==false)throw new TTerror("No primary child of root node to GRB!");
+ end_tree=inserted_tree;
+ for(i=0;i<n-1&&end_tree!=false;i++)end_tree=end_tree[1];
+ rest_tree=objcpy(end_tree[1]);
+ end_tree[1]=false;
+ inserted_tree[2]=TR[2];
+ TR[2]=inserted_tree;
+ TR[1]=rest_tree;
+ break;
case "REL":break;
case "INT":break;
case "FLT":break;
@@ -273,7 +296,7 @@ function runCmds(cmds,TR){
break;
case "STK":
var str;
- str=util.inspect(TR,{"depth":null});
+ str=util.inspect(TR,{"depth":null})+runCmds_state["outterm"];
if(runCmds_state["out"]==undefined)process.stdout.write(str);
else fs.writeSync(runCmds_state["out"],new Buffer(str),0,str.length,null);
break;