aboutsummaryrefslogtreecommitdiff
path: root/pkg/stack/stack-stack.go
diff options
context:
space:
mode:
authorJulien Dessaux2021-09-21 00:28:31 +0200
committerJulien Dessaux2021-09-21 00:28:31 +0200
commit11dac6494d90c73545f0a9e03732c6ef7bad88b7 (patch)
tree992e9d0c69c7e1cb26f85ee59c5234bba1d3e753 /pkg/stack/stack-stack.go
parentContinued implementing the Instruction Pointer (diff)
downloadgofunge98-11dac6494d90c73545f0a9e03732c6ef7bad88b7.tar.gz
gofunge98-11dac6494d90c73545f0a9e03732c6ef7bad88b7.tar.bz2
gofunge98-11dac6494d90c73545f0a9e03732c6ef7bad88b7.zip
Began implementing the stack and the stack stack
Diffstat (limited to 'pkg/stack/stack-stack.go')
-rw-r--r--pkg/stack/stack-stack.go44
1 files changed, 44 insertions, 0 deletions
diff --git a/pkg/stack/stack-stack.go b/pkg/stack/stack-stack.go
new file mode 100644
index 0000000..db5a405
--- /dev/null
+++ b/pkg/stack/stack-stack.go
@@ -0,0 +1,44 @@
+package stack
+
+import (
+ "git.adyxax.org/adyxax/gofunge/pkg/pointer"
+)
+
+type StackStack struct {
+ head *Stack
+ height int
+}
+
+func NewStackStack() *StackStack {
+ return &StackStack{
+ head: NewStack(),
+ height: 1,
+ }
+}
+
+func (ss *StackStack) Begin(p *pointer.Pointer) {
+ soss := ss.head
+ n := soss.Pop()
+ np := n
+ if np < 0 {
+ np = -np
+ }
+ toss := &Stack{
+ size: np,
+ height: np,
+ data: make([]int, np),
+ next: soss,
+ }
+ ss.head = toss
+ max := n - soss.height
+ if max < 0 {
+ max = 0
+ }
+ for i := n - 1; i >= max; i-- {
+ toss.data[i] = soss.data[soss.height-n+i]
+ }
+ x, y := p.GetStorageOffset()
+ soss.Push(x)
+ soss.Push(y)
+ p.CalculateNewStorageOffset()
+}