Changeset 263 for libyaml/trunk/src/writer.c
- Timestamp:
- 12/27/07 07:05:17 (5 years ago)
- File:
-
- 1 edited
-
libyaml/trunk/src/writer.c (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libyaml/trunk/src/writer.c
r239 r263 6 6 */ 7 7 8 static int9 yaml_emitter_set_writer_error(yaml_emitter_t *emitter, const char *problem);10 11 8 YAML_DECLARE(int) 12 9 yaml_emitter_flush(yaml_emitter_t *emitter); 13 14 /*15 * Set the writer error and return 0.16 */17 18 static int19 yaml_emitter_set_writer_error(yaml_emitter_t *emitter, const char *problem)20 {21 emitter->error = YAML_WRITER_ERROR;22 emitter->problem = problem;23 24 return 0;25 }26 10 27 11 /* … … 35 19 36 20 assert(emitter); /* Non-NULL emitter object is expected. */ 37 assert(emitter->write _handler);/* Write handler must be set. */21 assert(emitter->writer); /* Write handler must be set. */ 38 22 assert(emitter->encoding); /* Output encoding must be set. */ 39 40 emitter->buffer.last = emitter->buffer.pointer;41 emitter->buffer.pointer = emitter->buffer.start;42 23 43 24 /* Check if the buffer is empty. */ 44 25 45 if ( emitter->buffer.start == emitter->buffer.last) {26 if (!emitter->output.pointer) { 46 27 return 1; 47 28 } 29 30 /* Switch the pointer to the beginning of the buffer. */ 31 32 emitter->output.capacity = emitter->output.pointer; 33 emitter->output.pointer = 0; 48 34 49 35 /* If the output encoding is UTF-8, we don't need to recode the buffer. */ … … 51 37 if (emitter->encoding == YAML_UTF8_ENCODING) 52 38 { 53 if (emitter->write_handler(emitter->write_handler_data, 54 emitter->buffer.start, 55 emitter->buffer.last - emitter->buffer.start)) { 56 emitter->buffer.last = emitter->buffer.start; 57 emitter->buffer.pointer = emitter->buffer.start; 39 if (emitter->writer(emitter->writer_data, 40 emitter->output.buffer, emitter->output.capacity)) { 41 emitter->offset += emitter->output.capacity; 42 emitter->output.capacity = OUTPUT_BUFFER_CAPACITY; 58 43 return 1; 59 44 } 60 45 else { 61 return yaml_emitter_set_writer_error(emitter, "Write error");46 return WRITER_ERROR_INIT(emitter, "Write error", emitter->offset); 62 47 } 63 48 } … … 68 53 high = (emitter->encoding == YAML_UTF16LE_ENCODING ? 1 : 0); 69 54 70 while (emitter-> buffer.pointer != emitter->buffer.last)55 while (emitter->output.pointer != emitter->output.capacity) 71 56 { 72 57 unsigned char octet; 73 58 unsigned int width; 74 59 unsigned int value; 75 size_t k;60 size_t idx; 76 61 77 62 /* … … 82 67 /* Read the next UTF-8 character. */ 83 68 84 octet = emitter->buffer.pointer[0];69 octet = OCTET(emitter->output); 85 70 86 71 width = (octet & 0x80) == 0x00 ? 1 : … … 94 79 (octet & 0xF8) == 0xF0 ? octet & 0x07 : 0; 95 80 96 for ( k = 1; k < width; k++) {97 octet = emitter->buffer.pointer[k];81 for (idx = 1; idx < width; idx ++) { 82 octet = OCTET_AT(emitter->output, idx); 98 83 value = (value << 6) + (octet & 0x3F); 99 84 } 100 85 101 emitter-> buffer.pointer += width;86 emitter->output.pointer += width; 102 87 103 88 /* Write the character. */ … … 105 90 if (value < 0x10000) 106 91 { 107 emitter->raw_buffer.last[high]= value >> 8;108 emitter->raw_buffer.last[low]= value & 0xFF;92 OCTET_AT(emitter->raw_output, high) = value >> 8; 93 OCTET_AT(emitter->raw_output, low) = value & 0xFF; 109 94 110 emitter->raw_ buffer.last+= 2;95 emitter->raw_output.pointer += 2; 111 96 } 112 97 else … … 115 100 116 101 value -= 0x10000; 117 emitter->raw_buffer.last[high]= 0xD8 + (value >> 18);118 emitter->raw_buffer.last[low]= (value >> 10) & 0xFF;119 emitter->raw_buffer.last[high+2]= 0xDC + ((value >> 8) & 0xFF);120 emitter->raw_buffer.last[low+2]= value & 0xFF;102 OCTET_AT(emitter->raw_output, high) = 0xD8 + (value >> 18); 103 OCTET_AT(emitter->raw_output, low) = (value >> 10) & 0xFF; 104 OCTET_AT(emitter->raw_output, high+2) = 0xDC + ((value >> 8) & 0xFF); 105 OCTET_AT(emitter->raw_output, low+2) = value & 0xFF; 121 106 122 emitter->raw_ buffer.last+= 4;107 emitter->raw_output.pointer += 4; 123 108 } 124 109 } … … 126 111 /* Write the raw buffer. */ 127 112 128 if (emitter->write_handler(emitter->write_handler_data, 129 emitter->raw_buffer.start, 130 emitter->raw_buffer.last - emitter->raw_buffer.start)) { 131 emitter->buffer.last = emitter->buffer.start; 132 emitter->buffer.pointer = emitter->buffer.start; 133 emitter->raw_buffer.last = emitter->raw_buffer.start; 134 emitter->raw_buffer.pointer = emitter->raw_buffer.start; 113 if (emitter->writer(emitter->writer_data, 114 emitter->raw_output.buffer, emitter->raw_output.pointer)) { 115 emitter->output.pointer = 0; 116 emitter->output.capacity = OUTPUT_BUFFER_CAPACITY; 117 emitter->offset += emitter->raw_output.pointer; 118 emitter->raw_output.pointer = 0; 135 119 return 1; 136 120 } 137 121 else { 138 return yaml_emitter_set_writer_error(emitter, "Write error");122 return WRITER_ERROR_INIT(emitter, "Write error", emitter->offset); 139 123 } 140 124 }
Note: See TracChangeset
for help on using the changeset viewer.
