vis
a vi-like editor based on Plan 9's structural regular expressions
git clone https://9o.is/git/vis.git
commit aede888e3937c693c59a571ada0d85c7e6d4176f parent c1fb1856befadc8cb8c9028958af43465f1d7802 Author: Marc André Tanner <mat@brain-dump.org> Date: Thu, 17 Sep 2020 14:14:54 +0200 vis: provide reverse mapping function for register names Diffstat:
| M | vis-registers.c | | | 23 | ++++++++++++++++++++--- |
| M | vis.h | | | 3 | ++- |
2 files changed, 22 insertions(+), 4 deletions(-)
diff --git a/vis-registers.c b/vis-registers.c @@ -197,14 +197,15 @@ bool register_resize(Register *reg, size_t count) { } enum VisRegister vis_register_from(Vis *vis, char reg) { - switch (reg) { - case '@': return VIS_MACRO_LAST_RECORDED; - } + + if (reg == '@') + return VIS_MACRO_LAST_RECORDED; if ('a' <= reg && reg <= 'z') return VIS_REG_a + reg - 'a'; if ('A' <= reg && reg <= 'Z') return VIS_REG_A + reg - 'A'; + for (size_t i = 0; i < LENGTH(vis_registers); i++) { if (vis_registers[i].name == reg) return i; @@ -212,6 +213,22 @@ enum VisRegister vis_register_from(Vis *vis, char reg) { return VIS_REG_INVALID; } +char vis_register_to(Vis *vis, enum VisRegister reg) { + + if (reg == VIS_MACRO_LAST_RECORDED) + return '@'; + + if (VIS_REG_a <= reg && reg <= VIS_REG_z) + return 'a' + reg - VIS_REG_a; + if (VIS_REG_A <= reg && reg <= VIS_REG_Z) + return 'A' + reg - VIS_REG_A; + + if (reg < LENGTH(vis_registers)) + return vis_registers[reg].name; + + return '\0'; +} + void vis_register(Vis *vis, enum VisRegister reg) { if (VIS_REG_A <= reg && reg <= VIS_REG_Z) { vis->action.reg = &vis->registers[VIS_REG_a + reg - VIS_REG_A]; diff --git a/vis.h b/vis.h @@ -757,8 +757,9 @@ enum VisRegister { * @defgroup vis_registers * @{ */ -/** Translate single character register name to corresponding constant. */ +/** Translate between single character register name and corresponding constant. */ enum VisRegister vis_register_from(Vis*, char reg); +char vis_register_to(Vis*, enum VisRegister); /** * Specify register to use. * @rst