aboutsummaryrefslogtreecommitdiffhomepage
path: root/vendor/github.com/hashicorp/terraform/svchost/label_iter.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/hashicorp/terraform/svchost/label_iter.go')
-rw-r--r--vendor/github.com/hashicorp/terraform/svchost/label_iter.go69
1 files changed, 69 insertions, 0 deletions
diff --git a/vendor/github.com/hashicorp/terraform/svchost/label_iter.go b/vendor/github.com/hashicorp/terraform/svchost/label_iter.go
new file mode 100644
index 0000000..af8ccba
--- /dev/null
+++ b/vendor/github.com/hashicorp/terraform/svchost/label_iter.go
@@ -0,0 +1,69 @@
1package svchost
2
3import (
4 "strings"
5)
6
7// A labelIter allows iterating over domain name labels.
8//
9// This type is copied from golang.org/x/net/idna, where it is used
10// to segment hostnames into their separate labels for analysis. We use
11// it for the same purpose here, in ForComparison.
12type labelIter struct {
13 orig string
14 slice []string
15 curStart int
16 curEnd int
17 i int
18}
19
20func (l *labelIter) reset() {
21 l.curStart = 0
22 l.curEnd = 0
23 l.i = 0
24}
25
26func (l *labelIter) done() bool {
27 return l.curStart >= len(l.orig)
28}
29
30func (l *labelIter) result() string {
31 if l.slice != nil {
32 return strings.Join(l.slice, ".")
33 }
34 return l.orig
35}
36
37func (l *labelIter) label() string {
38 if l.slice != nil {
39 return l.slice[l.i]
40 }
41 p := strings.IndexByte(l.orig[l.curStart:], '.')
42 l.curEnd = l.curStart + p
43 if p == -1 {
44 l.curEnd = len(l.orig)
45 }
46 return l.orig[l.curStart:l.curEnd]
47}
48
49// next sets the value to the next label. It skips the last label if it is empty.
50func (l *labelIter) next() {
51 l.i++
52 if l.slice != nil {
53 if l.i >= len(l.slice) || l.i == len(l.slice)-1 && l.slice[l.i] == "" {
54 l.curStart = len(l.orig)
55 }
56 } else {
57 l.curStart = l.curEnd + 1
58 if l.curStart == len(l.orig)-1 && l.orig[l.curStart] == '.' {
59 l.curStart = len(l.orig)
60 }
61 }
62}
63
64func (l *labelIter) set(s string) {
65 if l.slice == nil {
66 l.slice = strings.Split(l.orig, ".")
67 }
68 l.slice[l.i] = s
69}