github.com/Cloud-Foundations/Dominator@v0.3.4/lib/uncommenter/impl.go (about) 1 package uncommenter 2 3 import ( 4 "bufio" 5 "io" 6 ) 7 8 func newUncommenter(reader io.Reader, commentTypes uint64) io.Reader { 9 if commentTypes == 0 { 10 return reader 11 } 12 if bReader, ok := reader.(bufferedReader); ok { 13 return &uncommenter{ 14 commentTypes: commentTypes, 15 reader: bReader, 16 } 17 } 18 return &uncommenter{ 19 commentTypes: commentTypes, 20 reader: bufio.NewReader(reader), 21 } 22 } 23 24 func readUntilNewline(reader bufferedReader) error { 25 for { 26 b, err := reader.ReadByte() 27 if err != nil { 28 return err 29 } 30 if b == '\n' { 31 return nil 32 } 33 } 34 } 35 36 func (u *uncommenter) read(p []byte) (int, error) { 37 if len(p) < 1 { 38 return 0, u.error 39 } 40 if len(p) < 2 { 41 return u.reader.Read(p) 42 } 43 for { 44 if n, err := u.readOnce(p); n > 0 || err != nil { 45 return n, err 46 } 47 } 48 } 49 50 func (u *uncommenter) readOnce(p []byte) (int, error) { 51 if u.error != nil { 52 return 0, u.error 53 } 54 if u.waitingForNewline { 55 for count := range p { 56 b, err := u.reader.ReadByte() 57 if err != nil { 58 u.error = err 59 return count, err 60 } 61 p[count] = b 62 if b == '\n' { 63 u.waitingForNewline = false 64 return count + 1, nil 65 } 66 u.waitingForNewline = true 67 } 68 return len(p), nil 69 } 70 // Start of file/line: read until first non-whitespace. 71 var nRead int 72 for nRead < len(p) { 73 p[nRead], u.error = u.reader.ReadByte() 74 if u.error != nil { 75 return nRead, u.error 76 } 77 nRead++ 78 if p[nRead-1] == ' ' { 79 continue 80 } 81 if p[nRead-1] == '\t' { 82 continue 83 } 84 break 85 } 86 if p[nRead-1] == '#' && u.commentTypes&CommentTypeHash != 0 { 87 u.error = readUntilNewline(u.reader) 88 return 0, u.error 89 } 90 if p[nRead-1] == '/' && u.commentTypes&CommentTypeSlashSlash != 0 && 91 nRead < len(p) { 92 p[nRead], u.error = u.reader.ReadByte() 93 if u.error != nil { 94 return nRead - 1, u.error 95 } 96 nRead++ 97 if p[nRead-1] == '/' { 98 u.error = readUntilNewline(u.reader) 99 return 0, u.error 100 } 101 } 102 if p[nRead-1] == '!' && u.commentTypes&CommentTypeBang != 0 { 103 u.error = readUntilNewline(u.reader) 104 return 0, u.error 105 } 106 u.waitingForNewline = true 107 return nRead, nil 108 }