github.com/go-xe2/third@v1.0.3/gopkg.in/yaml.v2/writerc.go (about)

     1  package yaml
     2  
     3  // Set the writer error and return false.
     4  func yaml_emitter_set_writer_error(emitter *yaml_emitter_t, problem string) bool {
     5  	emitter.error = yaml_WRITER_ERROR
     6  	emitter.problem = problem
     7  	return false
     8  }
     9  
    10  // Flush the output buffer.
    11  func yaml_emitter_flush(emitter *yaml_emitter_t) bool {
    12  	if emitter.write_handler == nil {
    13  		panic("write handler not set")
    14  	}
    15  
    16  	// Check if the buffer is empty.
    17  	if emitter.buffer_pos == 0 {
    18  		return true
    19  	}
    20  
    21  	// If the output encoding is UTF-8, we don't need to recode the buffer.
    22  	if emitter.encoding == yaml_UTF8_ENCODING {
    23  		if err := emitter.write_handler(emitter, emitter.buffer[:emitter.buffer_pos]); err != nil {
    24  			return yaml_emitter_set_writer_error(emitter, "write error: "+err.Error())
    25  		}
    26  		emitter.buffer_pos = 0
    27  		return true
    28  	}
    29  
    30  	// Recode the buffer into the raw buffer.
    31  	var low, high int
    32  	if emitter.encoding == yaml_UTF16LE_ENCODING {
    33  		low, high = 0, 1
    34  	} else {
    35  		high, low = 1, 0
    36  	}
    37  
    38  	pos := 0
    39  	for pos < emitter.buffer_pos {
    40  		// See the "reader.c" code for more details on UTF-8 encoding.  Note
    41  		// that we assume that the buffer contains a valid UTF-8 sequence.
    42  
    43  		// Read the next UTF-8 character.
    44  		octet := emitter.buffer[pos]
    45  
    46  		var w int
    47  		var value rune
    48  		switch {
    49  		case octet&0x80 == 0x00:
    50  			w, value = 1, rune(octet&0x7F)
    51  		case octet&0xE0 == 0xC0:
    52  			w, value = 2, rune(octet&0x1F)
    53  		case octet&0xF0 == 0xE0:
    54  			w, value = 3, rune(octet&0x0F)
    55  		case octet&0xF8 == 0xF0:
    56  			w, value = 4, rune(octet&0x07)
    57  		}
    58  		for k := 1; k < w; k++ {
    59  			octet = emitter.buffer[pos+k]
    60  			value = (value << 6) + (rune(octet) & 0x3F)
    61  		}
    62  		pos += w
    63  
    64  		// Write the character.
    65  		if value < 0x10000 {
    66  			var b [2]byte
    67  			b[high] = byte(value >> 8)
    68  			b[low] = byte(value & 0xFF)
    69  			emitter.raw_buffer = append(emitter.raw_buffer, b[0], b[1])
    70  		} else {
    71  			// Write the character using a surrogate pair (check "reader.c").
    72  			var b [4]byte
    73  			value -= 0x10000
    74  			b[high] = byte(0xD8 + (value >> 18))
    75  			b[low] = byte((value >> 10) & 0xFF)
    76  			b[high+2] = byte(0xDC + ((value >> 8) & 0xFF))
    77  			b[low+2] = byte(value & 0xFF)
    78  			emitter.raw_buffer = append(emitter.raw_buffer, b[0], b[1], b[2], b[3])
    79  		}
    80  	}
    81  
    82  	// Write the raw buffer.
    83  	if err := emitter.write_handler(emitter, emitter.raw_buffer); err != nil {
    84  		return yaml_emitter_set_writer_error(emitter, "write error: "+err.Error())
    85  	}
    86  	emitter.buffer_pos = 0
    87  	emitter.raw_buffer = emitter.raw_buffer[:0]
    88  	return true
    89  }