Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ If no file is given, the editor opens an empty, unnamed buffer.
| Ctrl-Q | Quit (press again to discard unsaved changes) |
| Ctrl-F | Find (Enter confirms, Ctrl-F finds next, Esc cancels) |
| Ctrl-G | Jump to a line number (Enter jumps, Esc cancels) |
| Ctrl-Z / Ctrl-Y | Undo / redo |
| Backspace / Delete | Delete a character or the selection |
| Esc | Clear the selection |

Expand Down
57 changes: 57 additions & 0 deletions src/buffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -277,3 +277,60 @@ void buffer_join_lines(buffer_t *buf, size_t row)
buf->num_lines -= 1;
buf->dirty = 1;
}

char *buffer_extract_text(const buffer_t *buf, size_t r1, size_t c1, size_t r2, size_t c2,
size_t *out_len)
{
if (r1 == r2) {
const line_t *line = &buf->lines[r1];
size_t len = c2 - c1;
char *text = xmalloc(len > 0 ? len : 1);
memcpy(text, line->chars + c1, len);
*out_len = len;
return text;
}

size_t total = (buf->lines[r1].len - c1) + 1;
for (size_t row = r1 + 1; row < r2; row++) {
total += buf->lines[row].len + 1;
}
total += c2;

char *text = xmalloc(total > 0 ? total : 1);
size_t pos = 0;

memcpy(text + pos, buf->lines[r1].chars + c1, buf->lines[r1].len - c1);
pos += buf->lines[r1].len - c1;
text[pos++] = '\n';

for (size_t row = r1 + 1; row < r2; row++) {
memcpy(text + pos, buf->lines[row].chars, buf->lines[row].len);
pos += buf->lines[row].len;
text[pos++] = '\n';
}

memcpy(text + pos, buf->lines[r2].chars, c2);
pos += c2;

*out_len = pos;
return text;
}

void buffer_insert_text(buffer_t *buf, size_t row, size_t col, const char *text, size_t len)
{
size_t start = 0;
for (size_t i = 0; i < len; i++) {
if (text[i] != '\n') {
continue;
}
buffer_insert_bytes(buf, row, col, text + start, i - start);
col += i - start;
buffer_split_line(buf, row, col);
row += 1;
col = 0;
start = i + 1;
}
if (start < len) {
buffer_insert_bytes(buf, row, col, text + start, len - start);
}
}
5 changes: 5 additions & 0 deletions src/buffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,9 @@ void buffer_delete_range(buffer_t *buf, size_t r1, size_t c1, size_t r2, size_t
void buffer_split_line(buffer_t *buf, size_t row, size_t col);
void buffer_join_lines(buffer_t *buf, size_t row);

char *buffer_extract_text(const buffer_t *buf, size_t r1, size_t c1, size_t r2, size_t c2,
size_t *out_len);

void buffer_insert_text(buffer_t *buf, size_t row, size_t col, const char *text, size_t len);

#endif /* DAF_BUFFER_H */
Loading
Loading