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  }