buf->status = MODIFIED;
}
+static void putch(Buf* buf, char b, Sel* p_sel) {
+ if (b == '\r') return;
+ if (b == '\n' && DosLineFeed) {
+ putb(buf, '\r', p_sel);
+ putb(buf, '\n', p_sel);
+ } else {
+ putb(buf, b, p_sel);
+ }
+}
+
void buf_init(Buf* buf) {
/* cleanup old data if there is any */
if (buf->bufstart) {
int buf_getrat(Buf* buf, size_t off) {
size_t rlen = 0;
Rune rune = 0;
- while (!utf8decode(&rune, &rlen, getb(buf, off++)));
+ if (getb(buf, off) == '\r' && getb(buf, off+1) == '\n')
+ rune = '\n';
+ else
+ while (!utf8decode(&rune, &rlen, getb(buf, off++)));
return rune;
}
buf_del(buf);
size_t beg = buf_getsel(buf).beg;
if (s && *s) {
- while (*s) putb(buf, *(s++), &(buf->selection));
+ while (*s) putch(buf, *(s++), &(buf->selection));
log_add(buf, beg, buf_getsel(buf).end, NULL);
}
}
int move = (count < 0 ? -1 : 1);
count *= move; // remove the sign if there is one
for (; count > 0; count--) {
- if ((pos > 0 && move < 0) || (pos < buf_end(buf) && move > 0))
- pos += move;
+ if (pos > 0 && move < 0) {
+ if (getb(buf, pos-2) == '\r' && getb(buf, pos-1) == '\n')
+ pos -= 2;
+ else
+ pos += move;
+ } else if (pos < buf_end(buf) && move > 0) {
+ if (getb(buf, pos) == '\r' && getb(buf, pos+1) == '\n')
+ pos += 2;
+ else
+ pos += move;
+ }
}
return pos;
}
for (; count > 0; count--) {
if (move < 0) {
if (pos > buf_eol(buf, 0))
- pos = buf_bol(buf, (buf_bol(buf, pos) - 1));
+ pos = buf_byrune(buf, buf_bol(buf, pos), LEFT);
} else {
- size_t next = (buf_eol(buf, pos) + 1);
+ size_t next = buf_byrune(buf, buf_eol(buf, pos), RIGHT);
if (next <= buf_end(buf))
pos = next;
}