aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2017-07-11 11:17:28 +0200
committerMarc André Tanner <mat@brain-dump.org>2017-07-11 11:55:09 +0200
commitebee314027fb8ba47052dc016bc44758fa58f5fc (patch)
treebb2871ce163083222c0879000292204c9fa7bfc4
parent4b0f94e0aa74bb0ef4374da1d24c7bfffc889ca8 (diff)
downloadvis-ebee314027fb8ba47052dc016bc44758fa58f5fc.tar.gz
vis-ebee314027fb8ba47052dc016bc44758fa58f5fc.tar.xz
vis-lua: represent marks as array of ranges
-rw-r--r--vis-lua.c55
1 files changed, 34 insertions, 21 deletions
diff --git a/vis-lua.c b/vis-lua.c
index be14b18..8371348 100644
--- a/vis-lua.c
+++ b/vis-lua.c
@@ -667,12 +667,12 @@ static int files_iter(lua_State *L) {
* @function mark_names
* @return the new iterator
* @usage
- * local marks = vis.win.file.marks;
- * for mark in vis:mark_names() do
- * local pos = marks[mark]
- * if pos then
- * -- do something with mark pos
- * end
+ * local marks = vis.win.file.marks
+ * for name in vis:mark_names() do
+ * local mark = marks[name]
+ * for i = 1, #mark do
+ * -- do somthing with: name, mark[i].start, mark[i].finish
+ * end
* end
*/
static int mark_names_iter(lua_State *L);
@@ -2245,22 +2245,26 @@ static const struct luaL_Reg file_lines_funcs[] = {
};
static int file_marks_index(lua_State *L) {
- Filerange *range = NULL;
+ lua_newtable(L);
Vis *vis = lua_touserdata(L, lua_upvalueindex(1));
File *file = obj_ref_check_containerof(L, 1, VIS_LUA_TYPE_MARKS, offsetof(File, marks));
if (!file)
- goto err;
+ return 1;
const char *symbol = luaL_checkstring(L, 2);
if (strlen(symbol) != 1)
- goto err;
+ return 1;
enum VisMark mark = vis_mark_from(vis, symbol[0]);
if (mark == VIS_MARK_INVALID)
- goto err;
+ return 1;
+
Array arr = vis_mark_get(vis, mark);
- range = array_get(&arr, 0);
+ for (size_t i = 0, len = array_length(&arr); i < len; i++) {
+ Filerange *range = array_get(&arr, i);
+ lua_pushunsigned(L, i+1);
+ pushrange(L, range);
+ lua_settable(L, -3);
+ }
array_release(&arr);
-err:
- pushrange(L, range);
return 1;
}
@@ -2273,15 +2277,24 @@ static int file_marks_newindex(lua_State *L) {
if (strlen(symbol) != 1)
return 0;
enum VisMark mark = vis_mark_from(vis, symbol[0]);
- size_t pos = luaL_checkunsigned(L, 3);
- if (mark < LENGTH(file->marks)) {
- Array arr;
- array_init_sized(&arr, sizeof(Filerange));
- Filerange range = text_range_new(pos, pos);
- array_add(&arr, &range);
- vis_mark_set(vis, mark, &arr);
- array_release(&arr);
+ if (mark >= LENGTH(file->marks))
+ return 0;
+
+ Array ranges;
+ array_init_sized(&ranges, sizeof(Filerange));
+
+ if (lua_istable(L, 3)) {
+ lua_pushnil(L);
+ while (lua_next(L, 3)) {
+ Filerange range = getrange(L, -1);
+ if (text_range_valid(&range))
+ array_add(&ranges, &range);
+ lua_pop(L, 1);
+ }
}
+
+ vis_mark_set(vis, mark, &ranges);
+ array_release(&ranges);
return 0;
}