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