#define _GNU_SOURCE
#include <string.h>
#include <assert.h>
+#include <wchar.h>
#include "edit.h"
}
unsigned buf_getcol(Buf* buf, unsigned pos) {
- return (pos - buf_bol(buf, pos));
+ unsigned curr = buf_bol(buf, pos);
+ unsigned col = 0;
+ for (; curr < pos; curr = buf_byrune(buf, curr, 1))
+ col += runewidth(col, buf_get(buf, curr));
+ return col;
}
unsigned buf_setcol(Buf* buf, unsigned pos, unsigned col) {
- unsigned bol = buf_bol(buf, pos);
- unsigned len = buf_eol(buf, pos) - bol;
- return buf_byrune(buf, bol, (len > col ? col : len));
+ unsigned bol = buf_bol(buf, pos);
+ unsigned curr = bol;
+ unsigned len = 0;
+ unsigned i = 0;
+ /* determine the length of the line in columns */
+ for (; buf_get(buf, curr) != '\n'; curr = buf_byrune(buf, curr, 1))
+ len += runewidth(len, buf_get(buf, curr));
+ /* iterate over the runes until we reach the target column */
+ curr = bol, i = 0;
+ while (i < col && i < len) {
+ int width = runewidth(i, buf_get(buf, curr));
+ curr = buf_byrune(buf, curr, 1);
+ if (col >= i && col < (i+width))
+ break;
+ i += width;
+ }
+ return curr;
}
bool utf8decode(Rune* rune, size_t* length, int byte);
Rune fgetrune(FILE* f);
void fputrune(Rune rune, FILE* f);
+int runewidth(unsigned col, Rune r);
/* Buffer management functions
*****************************************************************************/
#include "edit.h"
-#include <wchar.h>
static unsigned NumRows = 0;
static unsigned NumCols = 0;
scrrow->len = 0;
}
-static int runewidth(unsigned col, Rune r) {
- if (r == '\t') return (TabWidth - (col % TabWidth));
- int width = wcwidth(r);
- if (width < 0) width = 1;
- return width;
-}
-
unsigned screen_setcell(unsigned row, unsigned col, Rune r) {
if (row >= NumRows || col >= NumCols) return 0;
Row* scrrow = screen_getrow(row);
fputrune(buf_get(buf, i), file);
}
+int runewidth(unsigned col, Rune r) {
+ if (r == '\t') return (TabWidth - (col % TabWidth));
+ int width = wcwidth(r);
+ if (width < 0) width = 1;
+ return width;
+}
+