Solves memory issues when copying a range

This commit is contained in:
sloumdrone 2020-01-07 20:23:20 -08:00
parent 30e62ff94c
commit 8ad8f21c74
1 changed files with 19 additions and 18 deletions

View File

@ -938,30 +938,29 @@ void editorEndOfWord() {
} }
void editorCopyRange(int sx, int sy, int ex, int ey) { void editorCopyRange(int sx, int sy, int ex, int ey) {
// TODO fix this function. Keeps freezing up. Not sure why.
int swap; int swap;
if (ey < sy || (sy == ey && ex < sx)) { if (ey < sy || (sy == ey && ex < sx)) {
swap = sy; swap = sy; sy = ey; ey = swap;
sy = ey; swap = sx; sx = ex; ex = swap;
ey = swap;
swap = sx;
sx = ex;
ex = swap;
} }
if (sy < 0 || ey > E.numRows) return; if (sy < 0 || ey > E.numRows) return;
int totlen; int totlen = 0;
for (int y = sy; y <= ey; y++) { char *buf;
totlen += E.row[y].size;
if (y == sy) totlen -= sx;
if (y == ey) totlen -= (E.row[y].size - ex);
}
totlen += ey - sy;
char *buf = malloc(totlen);
if (ey - sy == 0) { if (ey - sy == 0) {
totlen = ex - sx + 1;
buf = malloc(totlen);
memcpy(buf, &E.row[sy].chars[sx], totlen); memcpy(buf, &E.row[sy].chars[sx], totlen);
} else { } else {
for (int y = sy; y <= ey; y++) {
totlen += E.row[y].size + 1;
}
totlen -= sx;
totlen -= (E.row[ey].size - ex);
totlen++;
buf = malloc(totlen);
char *p = buf; char *p = buf;
for (int row = sy; row <= ey; row++) { for (int row = sy; row <= ey; row++) {
if (row == sy) { if (row == sy) {
@ -970,7 +969,9 @@ void editorCopyRange(int sx, int sy, int ex, int ey) {
*p = '\r'; *p = '\r';
p++; p++;
} else if (row == ey) { } else if (row == ey) {
memcpy(p, &E.row[row].chars, E.row[row].size - ex); memcpy(p, E.row[row].chars, ex + 1);
p += ex + 1;
*p = '\r';
} else { } else {
memcpy(p, E.row[row].chars, E.row[row].size); memcpy(p, E.row[row].chars, E.row[row].size);
p += E.row[row].size; p += E.row[row].size;
@ -1340,7 +1341,7 @@ void editorCommandKp(int c) {
{ {
char open = c == 'p' ? 'o' : 'O'; char open = c == 'p' ? 'o' : 'O';
int startx = E.cx; int startx = E.cx;
int multiline = 1; int multiline = 0;
if (E.paste && E.paste[E.pastelen-1] == '\r') multiline = 1; if (E.paste && E.paste[E.pastelen-1] == '\r') multiline = 1;
if (multiline) { if (multiline) {
editorCommandKp(open); editorCommandKp(open);