-
Notifications
You must be signed in to change notification settings - Fork 0
/
map.go
130 lines (111 loc) · 2.24 KB
/
map.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package main
import (
"bufio"
"fmt"
"io"
"strconv"
"strings"
)
var StandardMachine = &MachineMap{
Cols: 4,
Rows: 3,
Display: false,
NodeMap: [][]NodeType{
{T21Node, T21Node, T21Node, T21Node},
{T21Node, T21Node, T21Node, T21Node},
{T21Node, T21Node, T21Node, T21Node},
},
}
type MachineMap struct {
Cols int
Rows int
Display bool
DisplayRows int
DisplayCols int
NodeMap [][]NodeType
}
func NewMachineMap(r io.Reader) (*MachineMap, error) {
buf := bufio.NewReader(r)
m := &MachineMap{}
// Number of columns
cols, err := readInt(buf)
if err != nil {
return nil, err
}
m.Cols = cols
// Number of Rows
rows, err := readInt(buf)
if err != nil {
return nil, err
}
m.Rows = rows
// Has a display?
enabled, dr, dc, err := readDisplay(buf)
if err != nil {
return nil, err
}
m.Display = enabled
m.DisplayRows = dr
m.DisplayCols = dc
// Node types
for i := 0; i < rows; i++ {
var nodes []NodeType
for j := 0; j < cols; j++ {
t, err := readNodeType(buf)
if err != nil {
return nil, err
}
nodes = append(nodes, t)
}
m.NodeMap = append(m.NodeMap, nodes)
}
return m, nil
}
func readInt(r *bufio.Reader) (int, error) {
l, err := r.ReadString('\n')
if err != nil {
return 0, err
}
n, err := strconv.Atoi(strings.TrimSpace(l))
if err != nil {
return 0, err
}
return n, nil
}
func readDisplay(r *bufio.Reader) (bool, int, int, error) {
l, err := r.ReadString('\n')
if err != nil {
return false, 0, 0, err
}
l = strings.TrimSpace(l)
if l == "F" {
return false, 0, 0, nil
}
parts := strings.Split(l, " ")
if len(parts) != 3 {
return false, 0, 0, fmt.Errorf("Invalid display description: %s", l)
}
rows, err := strconv.Atoi(parts[1])
if err != nil {
return false, 0, 0, fmt.Errorf("Invalid row count %s", parts[1])
}
cols, err := strconv.Atoi(parts[2])
if err != nil {
return false, 0, 0, fmt.Errorf("Invalid col count %s", parts[2])
}
return true, rows, cols, nil
}
func readNodeType(r *bufio.Reader) (NodeType, error) {
l, err := r.ReadString('\n')
if err != nil {
return 0, err
}
switch strings.TrimSpace(l) {
case "T21":
return T21Node, nil
case "T30":
return T30Node, nil
default:
return 0, fmt.Errorf("Uknown node type: %s", l)
}
}