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 }