static void text_chunk_append(TEXT_BUFFER_REC *buffer, const unsigned char *data, int len) { TEXT_CHUNK_REC *chunk; int left; if (len == 0) return; chunk = buffer->cur_text; while (chunk->pos + len >= TEXT_CHUNK_USABLE_SIZE) { left = TEXT_CHUNK_USABLE_SIZE - chunk->pos; if (left > 0 && data[left-1] == 0) left--; /* don't split the commands */ memcpy(chunk->buffer + chunk->pos, data, left); chunk->pos += left; chunk = text_chunk_create(buffer); chunk->refcount++; len -= left; data += left; } memcpy(chunk->buffer + chunk->pos, data, len); chunk->pos += len; mark_temp_eol(chunk); }
static LINE_REC *textbuffer_line_create(TEXT_BUFFER_REC *buffer) { LINE_REC *rec; if (buffer->cur_text == NULL) text_chunk_create(buffer); rec = g_slice_new(LINE_REC); rec->text = buffer->cur_text->buffer + buffer->cur_text->pos; buffer->cur_text->refcount++; return rec; }
static void text_chunk_append(TEXT_BUFFER_REC *buffer, const unsigned char *data, int len) { TEXT_CHUNK_REC *chunk; int left; int i; if (len == 0) return; chunk = buffer->cur_text; while (chunk->pos + len >= TEXT_CHUNK_USABLE_SIZE) { left = TEXT_CHUNK_USABLE_SIZE - chunk->pos; /* don't split utf-8 character. (assume we can split non-utf8 anywhere.) */ if (left < len && !is_utf8_leading(data[left])) { int i; for (i = 1; i < 4 && left >= i; i++) if (is_utf8_leading(data[left - i])) { left -= i; break; } } for (i = 5; i > 0; --i) { if (left >= i && data[left-i] == 0) { left -= i; /* don't split the commands */ break; } } memcpy(chunk->buffer + chunk->pos, data, left); chunk->pos += left; chunk = text_chunk_create(buffer); chunk->refcount++; len -= left; data += left; } memcpy(chunk->buffer + chunk->pos, data, len); chunk->pos += len; mark_temp_eol(chunk); }