Solves memory issues when copying a range
This commit is contained in:
parent
30e62ff94c
commit
8ad8f21c74
37
hermes.c
37
hermes.c
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue