| package yaml | 
 |  | 
 | // Set the writer error and return false. | 
 | func yaml_emitter_set_writer_error(emitter *yaml_emitter_t, problem string) bool { | 
 | 	emitter.error = yaml_WRITER_ERROR | 
 | 	emitter.problem = problem | 
 | 	return false | 
 | } | 
 |  | 
 | // Flush the output buffer. | 
 | func yaml_emitter_flush(emitter *yaml_emitter_t) bool { | 
 | 	if emitter.write_handler == nil { | 
 | 		panic("write handler not set") | 
 | 	} | 
 |  | 
 | 	// Check if the buffer is empty. | 
 | 	if emitter.buffer_pos == 0 { | 
 | 		return true | 
 | 	} | 
 |  | 
 | 	// If the output encoding is UTF-8, we don't need to recode the buffer. | 
 | 	if emitter.encoding == yaml_UTF8_ENCODING { | 
 | 		if err := emitter.write_handler(emitter, emitter.buffer[:emitter.buffer_pos]); err != nil { | 
 | 			return yaml_emitter_set_writer_error(emitter, "write error: "+err.Error()) | 
 | 		} | 
 | 		emitter.buffer_pos = 0 | 
 | 		return true | 
 | 	} | 
 |  | 
 | 	// Recode the buffer into the raw buffer. | 
 | 	var low, high int | 
 | 	if emitter.encoding == yaml_UTF16LE_ENCODING { | 
 | 		low, high = 0, 1 | 
 | 	} else { | 
 | 		high, low = 1, 0 | 
 | 	} | 
 |  | 
 | 	pos := 0 | 
 | 	for pos < emitter.buffer_pos { | 
 | 		// See the "reader.c" code for more details on UTF-8 encoding.  Note | 
 | 		// that we assume that the buffer contains a valid UTF-8 sequence. | 
 |  | 
 | 		// Read the next UTF-8 character. | 
 | 		octet := emitter.buffer[pos] | 
 |  | 
 | 		var w int | 
 | 		var value rune | 
 | 		switch { | 
 | 		case octet&0x80 == 0x00: | 
 | 			w, value = 1, rune(octet&0x7F) | 
 | 		case octet&0xE0 == 0xC0: | 
 | 			w, value = 2, rune(octet&0x1F) | 
 | 		case octet&0xF0 == 0xE0: | 
 | 			w, value = 3, rune(octet&0x0F) | 
 | 		case octet&0xF8 == 0xF0: | 
 | 			w, value = 4, rune(octet&0x07) | 
 | 		} | 
 | 		for k := 1; k < w; k++ { | 
 | 			octet = emitter.buffer[pos+k] | 
 | 			value = (value << 6) + (rune(octet) & 0x3F) | 
 | 		} | 
 | 		pos += w | 
 |  | 
 | 		// Write the character. | 
 | 		if value < 0x10000 { | 
 | 			var b [2]byte | 
 | 			b[high] = byte(value >> 8) | 
 | 			b[low] = byte(value & 0xFF) | 
 | 			emitter.raw_buffer = append(emitter.raw_buffer, b[0], b[1]) | 
 | 		} else { | 
 | 			// Write the character using a surrogate pair (check "reader.c"). | 
 | 			var b [4]byte | 
 | 			value -= 0x10000 | 
 | 			b[high] = byte(0xD8 + (value >> 18)) | 
 | 			b[low] = byte((value >> 10) & 0xFF) | 
 | 			b[high+2] = byte(0xDC + ((value >> 8) & 0xFF)) | 
 | 			b[low+2] = byte(value & 0xFF) | 
 | 			emitter.raw_buffer = append(emitter.raw_buffer, b[0], b[1], b[2], b[3]) | 
 | 		} | 
 | 	} | 
 |  | 
 | 	// Write the raw buffer. | 
 | 	if err := emitter.write_handler(emitter, emitter.raw_buffer); err != nil { | 
 | 		return yaml_emitter_set_writer_error(emitter, "write error: "+err.Error()) | 
 | 	} | 
 | 	emitter.buffer_pos = 0 | 
 | 	emitter.raw_buffer = emitter.raw_buffer[:0] | 
 | 	return true | 
 | } |