diff options
Diffstat (limited to 'treetree.js')
-rwxr-xr-x | treetree.js | 31 |
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; |