User:FireFly/argh.mrc
Jump to navigation
Jump to search
A half-complete Argh! interpreter written in mIRC scripting (old).
execargh { set %arghTimeout $calc( $ctime + 5) if (!$1-) { echo $chan Error: You must specify a file to be parsed. } set %i 0 while (%i < 40) { set %arghSource_ [ $+ [ %i ] ] $read($1, $calc(%i + 1)) inc %i } ; set default variables, unset Flow var! set %arghX 0 set %arghY 0 unset %arghFlow set %arghOut $null set %arghStack $null ; Check if file begins with a flow instruction. if ($countcs(%arghVartypeFlow,$mid(%arghSource_0,1,1)) == 0) { echo $chan Error: File did not begin with a flow control instruction. (File begun with $mid(%arghSource_0,1,1) $+ ) goto End } :CheckInstruction if ($ctime > %arghTimeout) { goto ErrOverflow } if (%charX < 0 || %charY < 0 || %charX > 80) { echo $chan Error: Could not read cell, pointer out of bounds. goto End } set %arghCurr $mid(%arghSource_ [ $+ [ %arghY ] ] ,%arghX,1) if (%arghCurr islower) { ; LOWERCASE INSTRUCTIONS ; Flow control if (%arghCurr == h) { ; Set flow to left. set %arghFlow 1 } if (%arghCurr == j) { ; Set flow to down. set %arghFlow 3 } if (%arghCurr == k) { ; Set flow to up. set %arghFlow 0 } if (%arghCurr == l) { ; Set flow to right. set %arghFlow 2 } if (%arghCurr == x) { ; if the value on top of the stack is positive, turn ; the execution direction 90 degrees to the right. if ($right(%arghStack,1) > 0) { if (%arghFlow == 0) { set %arghFlow 2 } elseif (%arghFlow == 1) { set %arghFlow 0 } elseif (%arghFlow == 2) { set %arghFlow 3 } else { set %arghFlow 1 } } } if (%arghCurr == q) { ; End program execution. goto End } ; Stack control if (%arghCurr == s) { ; Store (push) value of cell below to top of stack. set %arghStack %arghStack $+ $mid(%arghSource_ [ $+ [ $calc( %arghY + 1) ] ] ,%arghX,1) } if (%arghCurr == d) { ; Duplicate to value on top of stack. set -u0 %arghTmp $right(%arghStack,1) set %arghStack %arghStack $+ %arghTmp } if (%arghCurr == a) { ; Add value of the cell below to value on top of stack. set %arghTmp $mid(%arghSource_ [ $+ [ $calc( %arghY + 1) ] ] ,%arghX,1) ; $chr($calc($asc($right(%arghStack,1)) + $asc(%arghTmp))) ; set -u0 %arghTmp2 $calc( %arghTemp + $asc($mid(%arghSource_ [ $+ [ $calc( %arghY + 1) ] ] ,%arghX,1))) set %arghStack $right(%arghStack,-1) $+ $chr($calc($asc($right(%arghStack,1)) + $asc(%arghTmp))) } if (%arghCurr == r) { ; Reduce the value on top of stack with the value of below cell. set %arghTmp $mid(%arghSource_ [ $+ [ $calc( %arghY + 1) ] ] ,%arghX,1) ; $chr($calc($asc($right(%arghStack,1)) - $asc(%arghTmp))) ; set -u0 %arghTmp2 $calc( %arghTemp + $asc($mid(%arghSource_ [ $+ [ $calc( %arghY + 1) ] ] ,%arghX,1))) set %arghStack $right(%arghStack,-1) $+ $chr($calc($asc($right(%arghStack,1)) - $asc(%arghTmp))) } if (%arghCurr == f) { ; Fetch (pop) value from top of stack and store in cell below. set %arghSource_ [ $+ [ $calc( %arghY + 1) ] ] $left(%arghSource_ [ $+ [ $calc( %arghY + 1) ] ] , $calc( %arghX - 1)) $+ $right(%arghStack,1) $+ $right(%arghSource_ [ $+ [ $calc( %arghY + 1) ] ] , $calc( %arghX - 2 * %arghX )) set %arghStack $left(%arghStack,-1) } ; I/O if (%arghCurr == p) { ; Print character from the cell below. set %arghOut %arghOut $+ $mid(%arghSource_ [ $+ [ $calc( %arghY + 1) ] ] ,%arghX,1) if ($mid(%arghSource_ [ $+ [ $calc( %arghY + 1) ] ] ,%arghX,1) == $chr(10)) { ; Trying to print newline, echo & reset output var. echo $chan %arghOut set %arghOut $null } } if (%arghCurr == g) { ; Get one byte from stdin and store in cell below. } if (%arghCurr == e) { ; Insert value of system EOF in cell below. } } elseif (%arghCurr isupper) { ; UPPERCASE INSTRUCTIONS ; Flow control if (%arghCurr == H) { ; Set flow to left, jump left to the next char whose value matches the value of top of stack. set %arghFlow 1 } if (%arghCurr == J) { ; Set flow to down, jump down to the next char whose value matches the value of top of stack. set %arghFlow 3 } if (%arghCurr == K) { ; Set flow to up, jump up to the next char whose value matches the value of top of stack. set %arghFlow 0 } if (%arghCurr == L) { ; Set flow to right, jump right to the next char whose value matches the value of top of stack. set %arghFlow 2 } if (%arghCurr == X) { ; if the value on top of the stack is negative, turn ; the execution direction 90 degrees to the left. } ; Stack control if (%arghCurr == S) { ; Store (push) value of cell above to top of stack. set %arghStack %arghStack $+ $mid(%arghSource_ [ $+ [ $calc( %arghY - 1) ] ] ,%arghX,1) } if (%arghCurr == D) { ; Delete value on top of stack. set %arghStack $left(%arghStack,-1) } if (%arghCurr == A) { ; Add value of the cell above to value on top of stack. set %arghTmp $mid(%arghSource_ [ $+ [ $calc( %arghY - 1) ] ] ,%arghX,1) ; $chr($calc($asc($right(%arghStack,1)) + $asc(%arghTmp))) ; set -u0 %arghTmp2 $calc( %arghTemp + $asc($mid(%arghSource_ [ $+ [ $calc( %arghY + 1) ] ] ,%arghX,1))) set %arghStack $right(%arghStack,-1) $+ $chr($calc($asc($right(%arghStack,1)) + $asc(%arghTmp))) } if (%arghCurr == R) { ; Reduce the value on top of stack with the value of above cell. set %arghTmp $mid(%arghSource_ [ $+ [ $calc( %arghY - 1) ] ] ,%arghX,1) ; $chr($calc($asc($right(%arghStack,1)) - $asc(%arghTmp))) ; set -u0 %arghTmp2 $calc( %arghTemp + $asc($mid(%arghSource_ [ $+ [ $calc( %arghY + 1) ] ] ,%arghX,1))) set %arghStack $right(%arghStack,-1) $+ $chr($calc($asc($right(%arghStack,1)) - $asc(%arghTmp))) } if (%arghCurr == F) { ; Fetch (pop) value from top of stack and store in cell above. set %arghSource_ [ $+ [ $calc( %arghY - 1) ] ] $left(%arghSource_ [ $+ [ $calc( %arghY - 1) ] ] , $calc( %arghX - 1)) $+ $right(%arghStack,1) $+ $right(%arghSource_ [ $+ [ $calc( %arghY - 1) ] ] , $calc( %arghX - 2 * %arghX )) set %arghStack $left(%arghStack,-1) } ; I/O if (%arghCurr == P) { ; Print character from the cell above. set %arghOut %arghOut $+ $mid(%arghSource_ [ $+ [ $calc( %arghY - 1) ] ] ,%arghX,1) if ($mid(%arghSource_ [ $+ [ $calc( %arghY - 1) ] ] ,%arghX,1) == $chr(10)) { ; Trying to print newline; echo & reset output var. echo $chan $replace(%arghOut,$chr(32),$chr(160)) echo $chan �Debug:� Stack containts: %arghStack set %arghOut $null } } if (%arghCurr == g) { ; Get one byte from stdin and store in cell above. } if (%arghCurr == e) { ; Insert value of system EOF in cell above. } } :ReadNextChar if (%arghFlow = 0) { ; Flow is going up set %arghY $calc( %arghY - 1) } if (%arghFlow = 1) { ; Flow is going left set %arghX $calc( %arghX - 1) } if (%arghFlow = 2) { ; Flow is going right set %arghX $calc( %arghX + 1) } if (%arghFlow = 3) { ; Flow is going down set %arghY $calc( %arghY + 1) } ; echo $chan [Debug] Reading line: %arghY $+ , col: %arghX goto CheckInstruction if (1 == 2) { :End echo $chan Program has ended. /return :ErrOverflow echo $chan Error: Overflow. /return } echo $chan Error: An unknown error has occured. }