-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlinip.go
120 lines (108 loc) · 2.72 KB
/
linip.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
package linip
import (
"bufio"
"log"
"os"
"strings"
"time"
)
type inifile struct {
path string
data map[string]string
}
// if measuretime is true, parsing time will be printed
func (ini *inifile) parse(measuretime bool) {
if measuretime {
defer timeTrack(time.Now())
}
fileInfo, err := os.Stat(ini.path)
if err != nil {
if os.IsNotExist(err) {
log.Fatal("File does not exist.")
} else {
log.Fatal("File cannot be opened: ")
log.Println(fileInfo)
}
} else {
file, err := os.Open(ini.path)
scanner := bufio.NewScanner(file)
scanner.Split(bufio.ScanLines)
eof := false
var currentContainer string
ini.data = make(map[string]string)
for !eof {
success := scanner.Scan()
if success == false {
//False: error or EOF
err = scanner.Err()
if err == nil {
eof = true
} else {
log.Fatal(err)
}
} else {
//PARSING
currentLine := scanner.Text()
currentLine = strings.TrimSpace(currentLine)
if strings.HasPrefix(currentLine, "[") {
//Container
currentContainer = currentLine[1:(len(currentLine) - 1)]
} else if strings.HasPrefix(currentLine, ";") {
//Comment
} else if currentLine == "" {
//Empty line
} else {
index := strings.IndexByte(currentLine, '=')
varname := currentLine[:index]
varname = strings.TrimSpace(varname)
varvalue := currentLine[(index + 1):]
commentIndex := strings.IndexByte(varvalue, ';')
if commentIndex != -1 {
varvalue = varvalue[:commentIndex] //Strip comment
}
varvalue = strings.TrimSpace(varvalue)
ini.data[currentContainer+"."+varname] = varvalue
}
}
}
}
}
func (ini *inifile) getvalue(containername string, varname string) string {
return ini.getvaluesh(containername + "." + varname)
}
//Stands for getvalue Shortened
func (ini *inifile) getvaluesh(fullname string) string {
return ini.data[fullname]
}
//Is the value set
func (ini *inifile) isvalue(containername string, varname string) bool {
return ini.isvaluesh(containername + "." + varname)
}
func (ini *inifile) isvaluesh(fullname string) bool {
return (ini.data[fullname] != "")
}
func (ini *inifile) getcontainer(containername string) map[string]string {
returnMap := make(map[string]string)
for key := range ini.data {
if strings.HasPrefix(key, containername+".") {
returnMap[key] = ini.data[key]
}
}
return returnMap
}
func (ini *inifile) iscontainer(containername string) bool {
for key := range ini.data {
if strings.HasPrefix(key, containername+".") {
return true
}
}
return false
}
func (ini *inifile) getmap() map[string]string {
return ini.data
}
//From Coderwall
func timeTrack(start time.Time) {
elapsed := time.Since(start)
log.Printf("Parsing took %s", elapsed)
}