-
Notifications
You must be signed in to change notification settings - Fork 0
/
parser.go
86 lines (76 loc) · 1.7 KB
/
parser.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
package main
import (
"bufio"
"io"
"log"
"os"
"sync"
)
func readAllComponents(in io.ReadCloser, out chan component, wait *sync.WaitGroup) {
scanner := bufio.NewScanner(bufio.NewReader(in))
var lines []string
var componenetFound bool
var inComponent bool
for scanner.Scan() {
line := scanner.Text()
if line[0] == 'C' {
lines = make([]string, 0, 10)
componenetFound = true
lines = append(lines, line)
} else if componenetFound {
if line[0] == '{' {
inComponent = true
} else if !inComponent {
log.Printf("Found component without attributes. Skipping. (%s)", lines[0])
inComponent = false
componenetFound = false
} else if line[0] == '}' {
inComponent = false
componenetFound = false
comp := NewComponent(lines)
out <- comp
} else {
lines = append(lines, line)
}
}
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
in.Close()
wait.Done()
}
func startParserOnIOReaders(in []io.ReadCloser) chan component {
wait := new(sync.WaitGroup)
out := make(chan component)
for _, i := range in {
wait.Add(1)
go readAllComponents(i, out, wait)
}
go func() {
wait.Wait()
close(out)
}()
return out
}
func ParseFiles(inFileNames []string) componentArray {
inReaders := make([]io.ReadCloser, 0, len(inFileNames))
if len(inFileNames) == 0 {
inReaders = append(inReaders, os.Stdin)
} else {
for _, fileName := range inFileNames {
inFile, err := os.Open(fileName)
if err != nil {
log.Fatal(err)
} else {
inReaders = append(inReaders, inFile)
}
}
}
outChan := startParserOnIOReaders(inReaders)
components := NewComponentArray(100)
for c := range outChan {
components = append(components, c)
}
return components
}