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:
Mvis-registers.c | 23++++++++++++++++++++---
Mvis.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