Changeset 263 for libyaml/trunk/src/reader.c
- Timestamp:
- 12/27/07 07:05:17 (5 years ago)
- File:
-
- 1 edited
-
libyaml/trunk/src/reader.c (modified) (18 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libyaml/trunk/src/reader.c
r262 r263 36 36 /* Ensure that we had enough bytes in the raw buffer. */ 37 37 38 while (!parser->is_eof && parser->raw_input. length< 3) {38 while (!parser->is_eof && parser->raw_input.capacity < 3) { 39 39 if (!yaml_parser_update_raw_buffer(parser)) { 40 40 return 0; … … 44 44 /* Determine the encoding. */ 45 45 46 if (parser->raw_input. length>= 246 if (parser->raw_input.capacity >= 2 47 47 && !memcmp(parser->raw_input.buffer, BOM_UTF16LE, 2)) { 48 48 parser->encoding = YAML_UTF16LE_ENCODING; … … 50 50 parser->offset = 2; 51 51 } 52 else if (parser->raw_input. length>= 252 else if (parser->raw_input.capacity >= 2 53 53 && !memcmp(parser->raw_input.buffer, BOM_UTF16BE, 2)) { 54 54 parser->encoding = YAML_UTF16BE_ENCODING; … … 56 56 parser->offset = 2; 57 57 } 58 else if (parser->raw_input. length>= 358 else if (parser->raw_input.capacity >= 3 59 59 && !memcmp(parser->raw_input.buffer, BOM_UTF8, 3)) { 60 60 parser->encoding = YAML_UTF8_ENCODING; … … 81 81 82 82 if (parser->raw_input.pointer == 0 && 83 parser->raw_input. length == parser->raw_input.capacity)83 parser->raw_input.capacity == RAW_INPUT_BUFFER_CAPACITY) 84 84 return 1; 85 85 … … 92 92 93 93 if (parser->raw_input.pointer > 0 && 94 parser->raw_input.pointer < parser->raw_input. length) {94 parser->raw_input.pointer < parser->raw_input.capacity) { 95 95 memmove(parser->raw_input.buffer, 96 96 parser->raw_input.buffer + parser->raw_input.pointer, 97 parser->raw_input.length - parser->raw_input.pointer); 98 } 97 parser->raw_input.capacity - parser->raw_input.pointer); 98 } 99 parser->raw_input.capacity -= parser->raw_input.pointer; 99 100 parser->raw_input.pointer = 0; 100 101 … … 102 103 103 104 if (!parser->reader(parser->reader_data, 104 parser->raw_input.buffer + parser->raw_input. length,105 parser->raw_input.capacity - parser->raw_input.length,105 parser->raw_input.buffer + parser->raw_input.capacity, 106 RAW_INPUT_BUFFER_CAPACITY - parser->raw_input.capacity, 106 107 &length)) { 107 108 return READER_ERROR_INIT(parser, "Input error", parser->offset); 108 109 } 109 parser->raw_input. length+= length;110 parser->raw_input.capacity += length; 110 111 if (!length) { 111 112 parser->is_eof = 1; … … 125 126 yaml_parser_update_buffer(yaml_parser_t *parser, size_t length) 126 127 { 128 size_t old_capacity; 129 127 130 assert(parser->reader); /* Read handler must be set. */ 128 131 129 132 /* If the EOF flag is set and the raw buffer is empty, do nothing. */ 130 133 131 if (parser->is_eof && parser->raw_input.pointer == parser->raw_input. length)134 if (parser->is_eof && parser->raw_input.pointer == parser->raw_input.capacity) 132 135 return 1; 133 136 … … 147 150 148 151 if (parser->input.pointer > 0 && 149 parser->input.pointer < parser->input. length) {152 parser->input.pointer < parser->input.capacity) { 150 153 memmove(parser->input.buffer, 151 154 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; 158 } 155 parser->input.capacity - parser->input.pointer); 156 parser->input.capacity -= parser->input.pointer; 157 } 158 else if (parser->input.pointer == parser->input.capacity) { 159 parser->input.capacity = 0; 160 } 161 162 /* Set the pointer to the end of the buffer. */ 163 164 parser->input.pointer = parser->input.capacity; 159 165 160 166 /* Fill the buffer until it has enough characters. */ … … 168 174 /* Decode the raw buffer. */ 169 175 170 while (parser->raw_input.pointer != parser->raw_input. length)176 while (parser->raw_input.pointer != parser->raw_input.capacity) 171 177 { 172 unsigned char *raw_buffer =173 parser->raw_input.buffer + parser->raw_input.pointer;174 178 size_t raw_unread = 175 parser->raw_input. length- parser->raw_input.pointer;179 parser->raw_input.capacity - parser->raw_input.pointer; 176 180 unsigned int value = 0, value2 = 0; 177 181 int is_incomplete = 0; … … 179 183 unsigned int width = 0; 180 184 int low, high; 181 size_t k;185 size_t idx; 182 186 183 187 /* Decode the next character. */ … … 209 213 /* Determine the length of the UTF-8 sequence. */ 210 214 211 octet = *raw_buffer;215 octet = OCTET(parser->raw_input); 212 216 width = (octet & 0x80) == 0x00 ? 1 : 213 217 (octet & 0xE0) == 0xC0 ? 2 : … … 243 247 /* Check and decode the trailing octets. */ 244 248 245 for ( k = 1; k < width; k++)249 for (idx = 1; idx < width; idx ++) 246 250 { 247 octet = raw_buffer[k];251 octet = OCTET_AT(parser->raw_input, idx); 248 252 249 253 /* Check if the octet is valid. */ … … 252 256 return DECODER_ERROR_INIT(parser, 253 257 "Invalid trailing UTF-8 octet", 254 parser->offset+ k, octet);258 parser->offset+idx, octet); 255 259 256 260 /* Decode the octet. */ … … 324 328 /* Get the character. */ 325 329 326 value = raw_buffer[low] + (raw_buffer[high] << 8); 330 value = OCTET_AT(parser->raw_input, low) 331 + (OCTET_AT(parser->raw_input, high) << 8); 327 332 328 333 /* Check for unexpected low surrogate area. */ … … 353 358 /* Get the next character. */ 354 359 355 value2 = raw_buffer[low+2] + (raw_buffer[high+2] << 8); 360 value2 = OCTET_AT(parser->raw_input, low+2) 361 + (OCTET_AT(parser->raw_input, high+2) << 8); 356 362 357 363 /* Check for a low surrogate area. */ … … 407 413 /* 0000 0000-0000 007F -> 0xxxxxxx */ 408 414 if (value <= 0x7F) { 409 parser->input.buffer[parser->input.length++] = value;415 JOIN_OCTET(parser->input, value); 410 416 } 411 417 /* 0000 0080-0000 07FF -> 110xxxxx 10xxxxxx */ 412 418 else if (value <= 0x7FF) { 413 parser->input.buffer[parser->input.length++] = 0xC0 + (value >> 6);414 parser->input.buffer[parser->input.length++] = 0x80 + (value & 0x3F);419 JOIN_OCTET(parser->input, 0xC0 + (value >> 6)); 420 JOIN_OCTET(parser->input, 0x80 + (value & 0x3F)); 415 421 } 416 422 /* 0000 0800-0000 FFFF -> 1110xxxx 10xxxxxx 10xxxxxx */ 417 423 else if (value <= 0xFFFF) { 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);424 JOIN_OCTET(parser->input, 0xE0 + (value >> 12)); 425 JOIN_OCTET(parser->input, 0x80 + ((value >> 6) & 0x3F)); 426 JOIN_OCTET(parser->input, 0x80 + (value & 0x3F)); 421 427 } 422 428 /* 0001 0000-0010 FFFF -> 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ 423 429 else { 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);430 JOIN_OCTET(parser->input, 0xF0 + (value >> 18)); 431 JOIN_OCTET(parser->input, 0x80 + ((value >> 12) & 0x3F)); 432 JOIN_OCTET(parser->input, 0x80 + ((value >> 6) & 0x3F)); 433 JOIN_OCTET(parser->input, 0x80 + (value & 0x3F)); 428 434 } 429 435 … … 431 437 } 432 438 433 /* On EOF, put NUL into the buffer and return. */439 /* On EOF, put NUL into the buffer and stop. */ 434 440 435 441 if (parser->is_eof) { 436 parser->input.buffer[parser->input.length++] = '\0';442 JOIN_OCTET(parser->input, '\0'); 437 443 parser->unread ++; 438 return 1;444 break; 439 445 } 440 446 441 447 } 448 /* Swap the pointer with the end of the buffer. */ 449 450 old_capacity = parser->input.capacity; 451 parser->input.capacity = parser->input.pointer; 452 parser->input.pointer = old_capacity; 442 453 443 454 return 1;
Note: See TracChangeset
for help on using the changeset viewer.
