Changeset 262
- Timestamp:
- 12/26/07 08:46:43 (5 years ago)
- Location:
- libyaml/trunk/src
- Files:
-
- 2 edited
-
reader.c (modified) (24 diffs)
-
yaml_private.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libyaml/trunk/src/reader.c
r239 r262 7 7 8 8 static int 9 yaml_parser_set_reader_error(yaml_parser_t *parser, const char *problem,10 size_t offset, int value);11 12 static int13 9 yaml_parser_update_raw_buffer(yaml_parser_t *parser); 14 10 … … 18 14 YAML_DECLARE(int) 19 15 yaml_parser_update_buffer(yaml_parser_t *parser, size_t length); 20 21 /*22 * Set the reader error and return 0.23 */24 25 static int26 yaml_parser_set_reader_error(yaml_parser_t *parser, const char *problem,27 size_t offset, int value)28 {29 parser->error = YAML_READER_ERROR;30 parser->problem = problem;31 parser->problem_offset = offset;32 parser->problem_value = value;33 34 return 0;35 }36 16 37 17 /* … … 46 26 * Determine the input stream encoding by checking the BOM symbol. If no BOM is 47 27 * found, the UTF-8 encoding is assumed. Return 1 on success, 0 on failure. 28 * 29 * This function is called at the beginning of the processing, so we could 30 * safely assume that the current offset value is 0. 48 31 */ 49 32 … … 53 36 /* Ensure that we had enough bytes in the raw buffer. */ 54 37 55 while (!parser->eof 56 && parser->raw_buffer.last - parser->raw_buffer.pointer < 3) { 38 while (!parser->is_eof && parser->raw_input.length < 3) { 57 39 if (!yaml_parser_update_raw_buffer(parser)) { 58 40 return 0; … … 62 44 /* Determine the encoding. */ 63 45 64 if (parser->raw_ buffer.last - parser->raw_buffer.pointer>= 265 && !memcmp(parser->raw_ buffer.pointer, BOM_UTF16LE, 2)) {46 if (parser->raw_input.length >= 2 47 && !memcmp(parser->raw_input.buffer, BOM_UTF16LE, 2)) { 66 48 parser->encoding = YAML_UTF16LE_ENCODING; 67 parser->raw_ buffer.pointer += 2;68 parser->offset += 2;69 } 70 else if (parser->raw_ buffer.last - parser->raw_buffer.pointer>= 271 && !memcmp(parser->raw_ buffer.pointer, BOM_UTF16BE, 2)) {49 parser->raw_input.pointer = 2; 50 parser->offset = 2; 51 } 52 else if (parser->raw_input.length >= 2 53 && !memcmp(parser->raw_input.buffer, BOM_UTF16BE, 2)) { 72 54 parser->encoding = YAML_UTF16BE_ENCODING; 73 parser->raw_ buffer.pointer += 2;74 parser->offset += 2;75 } 76 else if (parser->raw_ buffer.last - parser->raw_buffer.pointer>= 377 && !memcmp(parser->raw_ buffer.pointer, BOM_UTF8, 3)) {55 parser->raw_input.pointer = 2; 56 parser->offset = 2; 57 } 58 else if (parser->raw_input.length >= 3 59 && !memcmp(parser->raw_input.buffer, BOM_UTF8, 3)) { 78 60 parser->encoding = YAML_UTF8_ENCODING; 79 parser->raw_ buffer.pointer += 3;80 parser->offset += 3;61 parser->raw_input.pointer = 3; 62 parser->offset = 3; 81 63 } 82 64 else { … … 94 76 yaml_parser_update_raw_buffer(yaml_parser_t *parser) 95 77 { 96 size_t size_read= 0;78 size_t length = 0; 97 79 98 80 /* Return if the raw buffer is full. */ 99 81 100 if (parser->raw_ buffer.start == parser->raw_buffer.pointer101 && parser->raw_buffer.last == parser->raw_buffer.end)82 if (parser->raw_input.pointer == 0 && 83 parser->raw_input.length == parser->raw_input.capacity) 102 84 return 1; 103 85 104 86 /* Return on EOF. */ 105 87 106 if (parser->eof) return 1; 88 if (parser->is_eof) 89 return 1; 107 90 108 91 /* Move the remaining bytes in the raw buffer to the beginning. */ 109 92 110 if (parser->raw_buffer.start < parser->raw_buffer.pointer 111 && parser->raw_buffer.pointer < parser->raw_buffer.last) { 112 memmove(parser->raw_buffer.start, parser->raw_buffer.pointer, 113 parser->raw_buffer.last - parser->raw_buffer.pointer); 114 } 115 parser->raw_buffer.last -= 116 parser->raw_buffer.pointer - parser->raw_buffer.start; 117 parser->raw_buffer.pointer = parser->raw_buffer.start; 93 if (parser->raw_input.pointer > 0 && 94 parser->raw_input.pointer < parser->raw_input.length) { 95 memmove(parser->raw_input.buffer, 96 parser->raw_input.buffer + parser->raw_input.pointer, 97 parser->raw_input.length - parser->raw_input.pointer); 98 } 99 parser->raw_input.pointer = 0; 118 100 119 101 /* Call the read handler to fill the buffer. */ 120 102 121 if (!parser->read_handler(parser->read_handler_data, parser->raw_buffer.last, 122 parser->raw_buffer.end - parser->raw_buffer.last, &size_read)) { 123 return yaml_parser_set_reader_error(parser, "Input error", 124 parser->offset, -1); 125 } 126 parser->raw_buffer.last += size_read; 127 if (!size_read) { 128 parser->eof = 1; 103 if (!parser->reader(parser->reader_data, 104 parser->raw_input.buffer + parser->raw_input.length, 105 parser->raw_input.capacity - parser->raw_input.length, 106 &length)) { 107 return READER_ERROR_INIT(parser, "Input error", parser->offset); 108 } 109 parser->raw_input.length += length; 110 if (!length) { 111 parser->is_eof = 1; 129 112 } 130 113 … … 142 125 yaml_parser_update_buffer(yaml_parser_t *parser, size_t length) 143 126 { 144 assert(parser->read _handler);/* Read handler must be set. */127 assert(parser->reader); /* Read handler must be set. */ 145 128 146 129 /* If the EOF flag is set and the raw buffer is empty, do nothing. */ 147 130 148 if (parser-> eof && parser->raw_buffer.pointer == parser->raw_buffer.last)131 if (parser->is_eof && parser->raw_input.pointer == parser->raw_input.length) 149 132 return 1; 150 133 … … 163 146 /* Move the unread characters to the beginning of the buffer. */ 164 147 165 if (parser-> buffer.start < parser->buffer.pointer166 && parser->buffer.pointer < parser->buffer.last) {167 size_t size = parser->buffer.last - parser->buffer.pointer;168 memmove(parser->buffer.start, parser->buffer.pointer, size);169 parser->buffer.pointer = parser->buffer.start;170 parser-> buffer.last = parser->buffer.start + size;171 }172 else if (parser->buffer.pointer == parser->buffer.last) {173 parser->buffer.pointer = parser->buffer.start;174 parser-> buffer.last = parser->buffer.start;148 if (parser->input.pointer > 0 && 149 parser->input.pointer < parser->input.length) { 150 memmove(parser->input.buffer, 151 parser->input.buffer + parser->input.pointer, 152 parser->input.length - parser->input.pointer); 153 parser->input.length -= parser->input.pointer; 154 parser->input.pointer = 0; 155 } 156 else if (parser->input.pointer == parser->input.length) { 157 parser->input.pointer = parser->input.length = 0; 175 158 } 176 159 … … 185 168 /* Decode the raw buffer. */ 186 169 187 while (parser->raw_ buffer.pointer != parser->raw_buffer.last)170 while (parser->raw_input.pointer != parser->raw_input.length) 188 171 { 172 unsigned char *raw_buffer = 173 parser->raw_input.buffer + parser->raw_input.pointer; 174 size_t raw_unread = 175 parser->raw_input.length - parser->raw_input.pointer; 189 176 unsigned int value = 0, value2 = 0; 190 int i ncomplete = 0;177 int is_incomplete = 0; 191 178 unsigned char octet; 192 179 unsigned int width = 0; 193 180 int low, high; 194 181 size_t k; 195 size_t raw_unread = parser->raw_buffer.last - parser->raw_buffer.pointer;196 182 197 183 /* Decode the next character. */ … … 223 209 /* Determine the length of the UTF-8 sequence. */ 224 210 225 octet = parser->raw_buffer.pointer[0];211 octet = *raw_buffer; 226 212 width = (octet & 0x80) == 0x00 ? 1 : 227 213 (octet & 0xE0) == 0xC0 ? 2 : … … 232 218 233 219 if (!width) 234 return yaml_parser_set_reader_error(parser,220 return DECODER_ERROR_INIT(parser, 235 221 "Invalid leading UTF-8 octet", 236 222 parser->offset, octet); … … 239 225 240 226 if (width > raw_unread) { 241 if (parser-> eof) {242 return yaml_parser_set_reader_error(parser,227 if (parser->is_eof) { 228 return DECODER_ERROR_INIT(parser, 243 229 "Incomplete UTF-8 octet sequence", 244 230 parser->offset, -1); 245 231 } 246 i ncomplete = 1;232 is_incomplete = 1; 247 233 break; 248 234 } … … 259 245 for (k = 1; k < width; k ++) 260 246 { 261 octet = parser->raw_buffer.pointer[k];247 octet = raw_buffer[k]; 262 248 263 249 /* Check if the octet is valid. */ 264 250 265 251 if ((octet & 0xC0) != 0x80) 266 return yaml_parser_set_reader_error(parser,252 return DECODER_ERROR_INIT(parser, 267 253 "Invalid trailing UTF-8 octet", 268 254 parser->offset+k, octet); … … 279 265 (width == 3 && value >= 0x800) || 280 266 (width == 4 && value >= 0x10000))) 281 return yaml_parser_set_reader_error(parser,267 return DECODER_ERROR_INIT(parser, 282 268 "Invalid length of a UTF-8 sequence", 283 269 parser->offset, -1); … … 286 272 287 273 if ((value >= 0xD800 && value <= 0xDFFF) || value > 0x10FFFF) 288 return yaml_parser_set_reader_error(parser,274 return DECODER_ERROR_INIT(parser, 289 275 "Invalid Unicode character", 290 276 parser->offset, value); … … 327 313 328 314 if (raw_unread < 2) { 329 if (parser-> eof) {330 return yaml_parser_set_reader_error(parser,315 if (parser->is_eof) { 316 return DECODER_ERROR_INIT(parser, 331 317 "Incomplete UTF-16 character", 332 318 parser->offset, -1); 333 319 } 334 i ncomplete = 1;320 is_incomplete = 1; 335 321 break; 336 322 } … … 338 324 /* Get the character. */ 339 325 340 value = parser->raw_buffer.pointer[low] 341 + (parser->raw_buffer.pointer[high] << 8); 326 value = raw_buffer[low] + (raw_buffer[high] << 8); 342 327 343 328 /* Check for unexpected low surrogate area. */ 344 329 345 330 if ((value & 0xFC00) == 0xDC00) 346 return yaml_parser_set_reader_error(parser,331 return DECODER_ERROR_INIT(parser, 347 332 "Unexpected low surrogate area", 348 333 parser->offset, value); … … 357 342 358 343 if (raw_unread < 4) { 359 if (parser-> eof) {360 return yaml_parser_set_reader_error(parser,344 if (parser->is_eof) { 345 return DECODER_ERROR_INIT(parser, 361 346 "Incomplete UTF-16 surrogate pair", 362 347 parser->offset, -1); 363 348 } 364 i ncomplete = 1;349 is_incomplete = 1; 365 350 break; 366 351 } … … 368 353 /* Get the next character. */ 369 354 370 value2 = parser->raw_buffer.pointer[low+2] 371 + (parser->raw_buffer.pointer[high+2] << 8); 355 value2 = raw_buffer[low+2] + (raw_buffer[high+2] << 8); 372 356 373 357 /* Check for a low surrogate area. */ 374 358 375 359 if ((value2 & 0xFC00) != 0xDC00) 376 return yaml_parser_set_reader_error(parser,360 return DECODER_ERROR_INIT(parser, 377 361 "Expected low surrogate area", 378 362 parser->offset+2, value2); … … 395 379 /* Check if the raw buffer contains enough bytes to form a character. */ 396 380 397 if (incomplete) break; 381 if (is_incomplete) 382 break; 398 383 399 384 /* … … 409 394 || (value >= 0xE000 && value <= 0xFFFD) 410 395 || (value >= 0x10000 && value <= 0x10FFFF))) 411 return yaml_parser_set_reader_error(parser,396 return DECODER_ERROR_INIT(parser, 412 397 "Control characters are not allowed", 413 398 parser->offset, value); … … 415 400 /* Move the raw pointers. */ 416 401 417 parser->raw_ buffer.pointer += width;402 parser->raw_input.pointer += width; 418 403 parser->offset += width; 419 404 … … 422 407 /* 0000 0000-0000 007F -> 0xxxxxxx */ 423 408 if (value <= 0x7F) { 424 *(parser->buffer.last++)= value;409 parser->input.buffer[parser->input.length++] = value; 425 410 } 426 411 /* 0000 0080-0000 07FF -> 110xxxxx 10xxxxxx */ 427 412 else if (value <= 0x7FF) { 428 *(parser->buffer.last++)= 0xC0 + (value >> 6);429 *(parser->buffer.last++)= 0x80 + (value & 0x3F);413 parser->input.buffer[parser->input.length++] = 0xC0 + (value >> 6); 414 parser->input.buffer[parser->input.length++] = 0x80 + (value & 0x3F); 430 415 } 431 416 /* 0000 0800-0000 FFFF -> 1110xxxx 10xxxxxx 10xxxxxx */ 432 417 else if (value <= 0xFFFF) { 433 *(parser->buffer.last++)= 0xE0 + (value >> 12);434 *(parser->buffer.last++)= 0x80 + ((value >> 6) & 0x3F);435 *(parser->buffer.last++)= 0x80 + (value & 0x3F);418 parser->input.buffer[parser->input.length++] = 0xE0 + (value >> 12); 419 parser->input.buffer[parser->input.length++] = 0x80 + ((value >> 6) & 0x3F); 420 parser->input.buffer[parser->input.length++] = 0x80 + (value & 0x3F); 436 421 } 437 422 /* 0001 0000-0010 FFFF -> 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ 438 423 else { 439 *(parser->buffer.last++)= 0xF0 + (value >> 18);440 *(parser->buffer.last++)= 0x80 + ((value >> 12) & 0x3F);441 *(parser->buffer.last++)= 0x80 + ((value >> 6) & 0x3F);442 *(parser->buffer.last++)= 0x80 + (value & 0x3F);424 parser->input.buffer[parser->input.length++] = 0xF0 + (value >> 18); 425 parser->input.buffer[parser->input.length++] = 0x80 + ((value >> 12) & 0x3F); 426 parser->input.buffer[parser->input.length++] = 0x80 + ((value >> 6) & 0x3F); 427 parser->input.buffer[parser->input.length++] = 0x80 + (value & 0x3F); 443 428 } 444 429 … … 448 433 /* On EOF, put NUL into the buffer and return. */ 449 434 450 if (parser-> eof) {451 *(parser->buffer.last++)= '\0';435 if (parser->is_eof) { 436 parser->input.buffer[parser->input.length++] = '\0'; 452 437 parser->unread ++; 453 438 return 1; -
libyaml/trunk/src/yaml_private.h
r261 r262 29 29 */ 30 30 31 #define MEMORY_ERROR_INIT(error)\31 #define ERROR_INIT(error,error_type) \ 32 32 (memset(&(error), 0, sizeof(error)), \ 33 (error).type = YAML_MEMORY_ERROR,\33 (error).type = (error_type), \ 34 34 0) 35 35 … … 75 75 0) 76 76 77 #define READER_ERROR_INIT(error,problem,offset) \ 78 READING_ERROR_INIT(error,YAML_READER_ERROR,problem,offset,-1) 79 80 #define DECODER_ERROR_INIT(error,problem,offset,value) \ 81 READING_ERROR_INIT(error,YAML_DECODER_ERROR,problem,offset,value) 82 83 #define SCANNER_ERROR_INIT(error,problem,problem_mark) \ 84 LOADING_ERROR_INIT(error,YAML_SCANNER_ERROR,problem,problem_mark) 85 86 #define SCANNER_ERROR_WITH_CONTEXT_INIT(error,context,context_mark,problem,problem_mark) \ 87 LOADING_ERROR_WITH_CONTEXT_INIT(error,YAML_SCANNER_ERROR,context,context_mark,problem,problem_mark) 88 89 #define PARSER_ERROR_INIT(error,problem,problem_mark) \ 90 LOADING_ERROR_INIT(error,YAML_PARSER_ERROR,problem,problem_mark) 91 92 #define PARSER_ERROR_WITH_CONTEXT_INIT(error,context,context_mark,problem,problem_mark) \ 93 LOADING_ERROR_WITH_CONTEXT_INIT(error,YAML_PARSER_ERROR,context,context_mark,problem,problem_mark) 94 95 #define COMPOSER_ERROR_INIT(error,problem,problem_mark) \ 96 LOADING_ERROR_INIT(error,YAML_COMPOSER_ERROR,problem,problem_mark) 97 98 #define COMPOSER_ERROR_WITH_CONTEXT_INIT(error,context,context_mark,problem,problem_mark) \ 99 LOADING_ERROR_WITH_CONTEXT_INIT(error,YAML_COMPOSER_ERROR,context,context_mark,problem,problem_mark) 100 101 #define WRITER_ERROR_INIT(error,problem,offset) \ 102 WRITING_ERROR_INIT(error,YAML_WRITER_ERROR,problem,offset) 103 104 #define EMITTER_ERROR_INIT(error,context,problem) \ 105 DUMPING_ERROR_INIT(error,YAML_EMITTER_ERROR,problem) 106 107 #define SERIALIZER_ERROR_INIT(error,context) \ 108 DUMPING_ERROR_INIT(error,YAML_SERIALIZER_ERROR,problem) 77 #define MEMORY_ERROR_INIT(self) \ 78 ERROR_INIT((self)->error,YAML_MEMORY_ERROR) 79 80 #define READER_ERROR_INIT(self,problem,offset) \ 81 READING_ERROR_INIT((self)->error,YAML_READER_ERROR,problem,offset,-1) 82 83 #define DECODER_ERROR_INIT(self,problem,offset,value) \ 84 READING_ERROR_INIT((self)->error,YAML_DECODER_ERROR,problem,offset,value) 85 86 #define SCANNER_ERROR_INIT(self,problem,problem_mark) \ 87 LOADING_ERROR_INIT((self)->error,YAML_SCANNER_ERROR,problem,problem_mark) 88 89 #define SCANNER_ERROR_WITH_CONTEXT_INIT(self,context,context_mark,problem,problem_mark) \ 90 LOADING_ERROR_WITH_CONTEXT_INIT((self)->error,YAML_SCANNER_ERROR,context,context_mark,problem,problem_mark) 91 92 #define PARSER_ERROR_INIT(self,problem,problem_mark) \ 93 LOADING_ERROR_INIT((self)->error,YAML_PARSER_ERROR,problem,problem_mark) 94 95 #define PARSER_ERROR_WITH_CONTEXT_INIT(self,context,context_mark,problem,problem_mark) \ 96 LOADING_ERROR_WITH_CONTEXT_INIT((self)->error,YAML_PARSER_ERROR,context,context_mark,problem,problem_mark) 97 98 #define COMPOSER_ERROR_INIT(self,problem,problem_mark) \ 99 LOADING_ERROR_INIT((self)->error,YAML_COMPOSER_ERROR,problem,problem_mark) 100 101 #define COMPOSER_ERROR_WITH_CONTEXT_INIT(self,context,context_mark,problem,problem_mark) \ 102 LOADING_ERROR_WITH_CONTEXT_INIT((self)->error,YAML_COMPOSER_ERROR,context,context_mark,problem,problem_mark) 103 104 #define WRITER_ERROR_INIT(self,problem,offset) \ 105 WRITING_ERROR_INIT((self)->error,YAML_WRITER_ERROR,problem,offset) 106 107 #define EMITTER_ERROR_INIT(self,context,problem) \ 108 DUMPING_ERROR_INIT((self)->error,YAML_EMITTER_ERROR,problem) 109 110 #define SERIALIZER_ERROR_INIT(self,context) \ 111 DUMPING_ERROR_INIT((self)->error,YAML_SERIALIZER_ERROR,problem) 109 112 110 113 /*
Note: See TracChangeset
for help on using the changeset viewer.
