github.com/go-xe2/third@v1.0.3/gopkg.in/yaml.v2/readerc.go (about) 1 package yaml 2 3 import ( 4 "io" 5 ) 6 7 // Set the reader error and return 0. 8 func yaml_parser_set_reader_error(parser *yaml_parser_t, problem string, offset int, value int) bool { 9 parser.error = yaml_READER_ERROR 10 parser.problem = problem 11 parser.problem_offset = offset 12 parser.problem_value = value 13 return false 14 } 15 16 // Byte order marks. 17 const ( 18 bom_UTF8 = "\xef\xbb\xbf" 19 bom_UTF16LE = "\xff\xfe" 20 bom_UTF16BE = "\xfe\xff" 21 ) 22 23 // Determine the input stream encoding by checking the BOM symbol. If no BOM is 24 // found, the UTF-8 encoding is assumed. Return 1 on success, 0 on failure. 25 func yaml_parser_determine_encoding(parser *yaml_parser_t) bool { 26 // Ensure that we had enough bytes in the raw buffer. 27 for !parser.eof && len(parser.raw_buffer)-parser.raw_buffer_pos < 3 { 28 if !yaml_parser_update_raw_buffer(parser) { 29 return false 30 } 31 } 32 33 // Determine the encoding. 34 buf := parser.raw_buffer 35 pos := parser.raw_buffer_pos 36 avail := len(buf) - pos 37 if avail >= 2 && buf[pos] == bom_UTF16LE[0] && buf[pos+1] == bom_UTF16LE[1] { 38 parser.encoding = yaml_UTF16LE_ENCODING 39 parser.raw_buffer_pos += 2 40 parser.offset += 2 41 } else if avail >= 2 && buf[pos] == bom_UTF16BE[0] && buf[pos+1] == bom_UTF16BE[1] { 42 parser.encoding = yaml_UTF16BE_ENCODING 43 parser.raw_buffer_pos += 2 44 parser.offset += 2 45 } else if avail >= 3 && buf[pos] == bom_UTF8[0] && buf[pos+1] == bom_UTF8[1] && buf[pos+2] == bom_UTF8[2] { 46 parser.encoding = yaml_UTF8_ENCODING 47 parser.raw_buffer_pos += 3 48 parser.offset += 3 49 } else { 50 parser.encoding = yaml_UTF8_ENCODING 51 } 52 return true 53 } 54 55 // Update the raw buffer. 56 func yaml_parser_update_raw_buffer(parser *yaml_parser_t) bool { 57 size_read := 0 58 59 // Return if the raw buffer is full. 60 if parser.raw_buffer_pos == 0 && len(parser.raw_buffer) == cap(parser.raw_buffer) { 61 return true 62 } 63 64 // Return on EOF. 65 if parser.eof { 66 return true 67 } 68 69 // Move the remaining bytes in the raw buffer to the beginning. 70 if parser.raw_buffer_pos > 0 && parser.raw_buffer_pos < len(parser.raw_buffer) { 71 copy(parser.raw_buffer, parser.raw_buffer[parser.raw_buffer_pos:]) 72 } 73 parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)-parser.raw_buffer_pos] 74 parser.raw_buffer_pos = 0 75 76 // Call the read handler to fill the buffer. 77 size_read, err := parser.read_handler(parser, parser.raw_buffer[len(parser.raw_buffer):cap(parser.raw_buffer)]) 78 parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)+size_read] 79 if err == io.EOF { 80 parser.eof = true 81 } else if err != nil { 82 return yaml_parser_set_reader_error(parser, "input error: "+err.Error(), parser.offset, -1) 83 } 84 return true 85 } 86 87 // Ensure that the buffer contains at least `length` characters. 88 // Return true on success, false on failure. 89 // 90 // The length is supposed to be significantly less that the buffer size. 91 func yaml_parser_update_buffer(parser *yaml_parser_t, length int) bool { 92 if parser.read_handler == nil { 93 panic("read handler must be set") 94 } 95 96 // If the EOF flag is set and the raw buffer is empty, do nothing. 97 if parser.eof && parser.raw_buffer_pos == len(parser.raw_buffer) { 98 return true 99 } 100 101 // Return if the buffer contains enough characters. 102 if parser.unread >= length { 103 return true 104 } 105 106 // Determine the input encoding if it is not known yet. 107 if parser.encoding == yaml_ANY_ENCODING { 108 if !yaml_parser_determine_encoding(parser) { 109 return false 110 } 111 } 112 113 // Move the unread characters to the beginning of the buffer. 114 buffer_len := len(parser.buffer) 115 if parser.buffer_pos > 0 && parser.buffer_pos < buffer_len { 116 copy(parser.buffer, parser.buffer[parser.buffer_pos:]) 117 buffer_len -= parser.buffer_pos 118 parser.buffer_pos = 0 119 } else if parser.buffer_pos == buffer_len { 120 buffer_len = 0 121 parser.buffer_pos = 0 122 } 123 124 // Open the whole buffer for writing, and cut it before returning. 125 parser.buffer = parser.buffer[:cap(parser.buffer)] 126 127 // Fill the buffer until it has enough characters. 128 first := true 129 for parser.unread < length { 130 131 // Fill the raw buffer if necessary. 132 if !first || parser.raw_buffer_pos == len(parser.raw_buffer) { 133 if !yaml_parser_update_raw_buffer(parser) { 134 parser.buffer = parser.buffer[:buffer_len] 135 return false 136 } 137 } 138 first = false 139 140 // Decode the raw buffer. 141 inner: 142 for parser.raw_buffer_pos != len(parser.raw_buffer) { 143 var value rune 144 var width int 145 146 raw_unread := len(parser.raw_buffer) - parser.raw_buffer_pos 147 148 // Decode the next character. 149 switch parser.encoding { 150 case yaml_UTF8_ENCODING: 151 // Decode a UTF-8 character. Check RFC 3629 152 // (http://www.ietf.org/rfc/rfc3629.txt) for more details. 153 // 154 // The following table (taken from the RFC) is used for 155 // decoding. 156 // 157 // Char. number range | UTF-8 octet sequence 158 // (hexadecimal) | (binary) 159 // --------------------+------------------------------------ 160 // 0000 0000-0000 007F | 0xxxxxxx 161 // 0000 0080-0000 07FF | 110xxxxx 10xxxxxx 162 // 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx 163 // 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 164 // 165 // Additionally, the characters in the range 0xD800-0xDFFF 166 // are prohibited as they are reserved for use with UTF-16 167 // surrogate pairs. 168 169 // Determine the length of the UTF-8 sequence. 170 octet := parser.raw_buffer[parser.raw_buffer_pos] 171 switch { 172 case octet&0x80 == 0x00: 173 width = 1 174 case octet&0xE0 == 0xC0: 175 width = 2 176 case octet&0xF0 == 0xE0: 177 width = 3 178 case octet&0xF8 == 0xF0: 179 width = 4 180 default: 181 // The leading octet is invalid. 182 return yaml_parser_set_reader_error(parser, 183 "invalid leading UTF-8 octet", 184 parser.offset, int(octet)) 185 } 186 187 // Check if the raw buffer contains an incomplete character. 188 if width > raw_unread { 189 if parser.eof { 190 return yaml_parser_set_reader_error(parser, 191 "incomplete UTF-8 octet sequence", 192 parser.offset, -1) 193 } 194 break inner 195 } 196 197 // Decode the leading octet. 198 switch { 199 case octet&0x80 == 0x00: 200 value = rune(octet & 0x7F) 201 case octet&0xE0 == 0xC0: 202 value = rune(octet & 0x1F) 203 case octet&0xF0 == 0xE0: 204 value = rune(octet & 0x0F) 205 case octet&0xF8 == 0xF0: 206 value = rune(octet & 0x07) 207 default: 208 value = 0 209 } 210 211 // Check and decode the trailing octets. 212 for k := 1; k < width; k++ { 213 octet = parser.raw_buffer[parser.raw_buffer_pos+k] 214 215 // Check if the octet is valid. 216 if (octet & 0xC0) != 0x80 { 217 return yaml_parser_set_reader_error(parser, 218 "invalid trailing UTF-8 octet", 219 parser.offset+k, int(octet)) 220 } 221 222 // Decode the octet. 223 value = (value << 6) + rune(octet&0x3F) 224 } 225 226 // Check the length of the sequence against the value. 227 switch { 228 case width == 1: 229 case width == 2 && value >= 0x80: 230 case width == 3 && value >= 0x800: 231 case width == 4 && value >= 0x10000: 232 default: 233 return yaml_parser_set_reader_error(parser, 234 "invalid length of a UTF-8 sequence", 235 parser.offset, -1) 236 } 237 238 // Check the range of the value. 239 if value >= 0xD800 && value <= 0xDFFF || value > 0x10FFFF { 240 return yaml_parser_set_reader_error(parser, 241 "invalid Unicode character", 242 parser.offset, int(value)) 243 } 244 245 case yaml_UTF16LE_ENCODING, yaml_UTF16BE_ENCODING: 246 var low, high int 247 if parser.encoding == yaml_UTF16LE_ENCODING { 248 low, high = 0, 1 249 } else { 250 low, high = 1, 0 251 } 252 253 // The UTF-16 encoding is not as simple as one might 254 // naively think. Check RFC 2781 255 // (http://www.ietf.org/rfc/rfc2781.txt). 256 // 257 // Normally, two subsequent bytes describe a Unicode 258 // character. However a special technique (called a 259 // surrogate pair) is used for specifying character 260 // values larger than 0xFFFF. 261 // 262 // A surrogate pair consists of two pseudo-characters: 263 // high surrogate area (0xD800-0xDBFF) 264 // low surrogate area (0xDC00-0xDFFF) 265 // 266 // The following formulas are used for decoding 267 // and encoding characters using surrogate pairs: 268 // 269 // U = U' + 0x10000 (0x01 00 00 <= U <= 0x10 FF FF) 270 // U' = yyyyyyyyyyxxxxxxxxxx (0 <= U' <= 0x0F FF FF) 271 // W1 = 110110yyyyyyyyyy 272 // W2 = 110111xxxxxxxxxx 273 // 274 // where U is the character value, W1 is the high surrogate 275 // area, W2 is the low surrogate area. 276 277 // Check for incomplete UTF-16 character. 278 if raw_unread < 2 { 279 if parser.eof { 280 return yaml_parser_set_reader_error(parser, 281 "incomplete UTF-16 character", 282 parser.offset, -1) 283 } 284 break inner 285 } 286 287 // Get the character. 288 value = rune(parser.raw_buffer[parser.raw_buffer_pos+low]) + 289 (rune(parser.raw_buffer[parser.raw_buffer_pos+high]) << 8) 290 291 // Check for unexpected low surrogate area. 292 if value&0xFC00 == 0xDC00 { 293 return yaml_parser_set_reader_error(parser, 294 "unexpected low surrogate area", 295 parser.offset, int(value)) 296 } 297 298 // Check for a high surrogate area. 299 if value&0xFC00 == 0xD800 { 300 width = 4 301 302 // Check for incomplete surrogate pair. 303 if raw_unread < 4 { 304 if parser.eof { 305 return yaml_parser_set_reader_error(parser, 306 "incomplete UTF-16 surrogate pair", 307 parser.offset, -1) 308 } 309 break inner 310 } 311 312 // Get the next character. 313 value2 := rune(parser.raw_buffer[parser.raw_buffer_pos+low+2]) + 314 (rune(parser.raw_buffer[parser.raw_buffer_pos+high+2]) << 8) 315 316 // Check for a low surrogate area. 317 if value2&0xFC00 != 0xDC00 { 318 return yaml_parser_set_reader_error(parser, 319 "expected low surrogate area", 320 parser.offset+2, int(value2)) 321 } 322 323 // Generate the value of the surrogate pair. 324 value = 0x10000 + ((value & 0x3FF) << 10) + (value2 & 0x3FF) 325 } else { 326 width = 2 327 } 328 329 default: 330 panic("impossible") 331 } 332 333 // Check if the character is in the allowed range: 334 // #x9 | #xA | #xD | [#x20-#x7E] (8 bit) 335 // | #x85 | [#xA0-#xD7FF] | [#xE000-#xFFFD] (16 bit) 336 // | [#x10000-#x10FFFF] (32 bit) 337 switch { 338 case value == 0x09: 339 case value == 0x0A: 340 case value == 0x0D: 341 case value >= 0x20 && value <= 0x7E: 342 case value == 0x85: 343 case value >= 0xA0 && value <= 0xD7FF: 344 case value >= 0xE000 && value <= 0xFFFD: 345 case value >= 0x10000 && value <= 0x10FFFF: 346 default: 347 return yaml_parser_set_reader_error(parser, 348 "control characters are not allowed", 349 parser.offset, int(value)) 350 } 351 352 // Move the raw pointers. 353 parser.raw_buffer_pos += width 354 parser.offset += width 355 356 // Finally put the character into the buffer. 357 if value <= 0x7F { 358 // 0000 0000-0000 007F . 0xxxxxxx 359 parser.buffer[buffer_len+0] = byte(value) 360 buffer_len += 1 361 } else if value <= 0x7FF { 362 // 0000 0080-0000 07FF . 110xxxxx 10xxxxxx 363 parser.buffer[buffer_len+0] = byte(0xC0 + (value >> 6)) 364 parser.buffer[buffer_len+1] = byte(0x80 + (value & 0x3F)) 365 buffer_len += 2 366 } else if value <= 0xFFFF { 367 // 0000 0800-0000 FFFF . 1110xxxx 10xxxxxx 10xxxxxx 368 parser.buffer[buffer_len+0] = byte(0xE0 + (value >> 12)) 369 parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 6) & 0x3F)) 370 parser.buffer[buffer_len+2] = byte(0x80 + (value & 0x3F)) 371 buffer_len += 3 372 } else { 373 // 0001 0000-0010 FFFF . 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 374 parser.buffer[buffer_len+0] = byte(0xF0 + (value >> 18)) 375 parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 12) & 0x3F)) 376 parser.buffer[buffer_len+2] = byte(0x80 + ((value >> 6) & 0x3F)) 377 parser.buffer[buffer_len+3] = byte(0x80 + (value & 0x3F)) 378 buffer_len += 4 379 } 380 381 parser.unread++ 382 } 383 384 // On EOF, put NUL into the buffer and return. 385 if parser.eof { 386 parser.buffer[buffer_len] = 0 387 buffer_len++ 388 parser.unread++ 389 break 390 } 391 } 392 parser.buffer = parser.buffer[:buffer_len] 393 return true 394 }