github.com/keysonZZZ/kmg@v0.0.0-20151121023212-05317bfd7d39/encoding/kmgYaml/emitterc.go (about)

     1  package kmgYaml
     2  
     3  // Flush the buffer if needed.
     4  func flush(emitter *yaml_emitter_t) bool {
     5  	if emitter.buffer_pos+5 >= len(emitter.buffer) {
     6  		return yaml_emitter_flush(emitter)
     7  	}
     8  	return true
     9  }
    10  
    11  // Put a character to the output buffer.
    12  func put(emitter *yaml_emitter_t, value byte) bool {
    13  	if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) {
    14  		return false
    15  	}
    16  	emitter.buffer[emitter.buffer_pos] = value
    17  	emitter.buffer_pos++
    18  	emitter.column++
    19  	return true
    20  }
    21  
    22  // Put a line break to the output buffer.
    23  func put_break(emitter *yaml_emitter_t) bool {
    24  	if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) {
    25  		return false
    26  	}
    27  	switch emitter.line_break {
    28  	case yaml_CR_BREAK:
    29  		emitter.buffer[emitter.buffer_pos] = '\r'
    30  		emitter.buffer_pos += 1
    31  	case yaml_LN_BREAK:
    32  		emitter.buffer[emitter.buffer_pos] = '\n'
    33  		emitter.buffer_pos += 1
    34  	case yaml_CRLN_BREAK:
    35  		emitter.buffer[emitter.buffer_pos+0] = '\r'
    36  		emitter.buffer[emitter.buffer_pos+1] = '\n'
    37  		emitter.buffer_pos += 2
    38  	default:
    39  		panic("unknown line break setting")
    40  	}
    41  	emitter.column = 0
    42  	emitter.line++
    43  	return true
    44  }
    45  
    46  // Copy a character from a string into buffer.
    47  func write(emitter *yaml_emitter_t, s []byte, i *int) bool {
    48  	if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) {
    49  		return false
    50  	}
    51  	p := emitter.buffer_pos
    52  	w := width(s[*i])
    53  	switch w {
    54  	case 4:
    55  		emitter.buffer[p+3] = s[*i+3]
    56  		fallthrough
    57  	case 3:
    58  		emitter.buffer[p+2] = s[*i+2]
    59  		fallthrough
    60  	case 2:
    61  		emitter.buffer[p+1] = s[*i+1]
    62  		fallthrough
    63  	case 1:
    64  		emitter.buffer[p+0] = s[*i+0]
    65  	default:
    66  		panic("unknown character width")
    67  	}
    68  	emitter.column++
    69  	emitter.buffer_pos += w
    70  	*i += w
    71  	return true
    72  }
    73  
    74  // Write a whole string into buffer.
    75  func write_all(emitter *yaml_emitter_t, s []byte) bool {
    76  	for i := 0; i < len(s); {
    77  		if !write(emitter, s, &i) {
    78  			return false
    79  		}
    80  	}
    81  	return true
    82  }
    83  
    84  // Copy a line break character from a string into buffer.
    85  func write_break(emitter *yaml_emitter_t, s []byte, i *int) bool {
    86  	if s[*i] == '\n' {
    87  		if !put_break(emitter) {
    88  			return false
    89  		}
    90  		*i++
    91  	} else {
    92  		if !write(emitter, s, i) {
    93  			return false
    94  		}
    95  		emitter.column = 0
    96  		emitter.line++
    97  	}
    98  	return true
    99  }