From 8d42c1658d943d3281378206c4a830a1112071ce Mon Sep 17 00:00:00 2001 From: Albert Graef Date: Thu, 30 Aug 2018 14:46:35 +0200 Subject: [PATCH] Add a syntax for enumerations in value lists. --- readconfig.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/readconfig.c b/readconfig.c index a8312a2..e654a98 100644 --- a/readconfig.c +++ b/readconfig.c @@ -901,7 +901,7 @@ re_press_temp_modifiers(void) note ::= ( "a" | ... | "g" ) [ "#" | "b" ] other ::= "ch" | "pb" | "pc" | "cc" | "cp" | "kp:" note steps ::= "[" number "]" | "{" list "}" | "[" number "]" "{" list "}" - list ::= number { "," number | ":" number } + list ::= number { "," number | ":" number | "-" number } flag ::= "-" | "+" | "=" | "<" | ">" | "~" | "'" Case is insignificant. Numbers are always in decimal. The meaning of @@ -969,7 +969,7 @@ static char *parse_steps(char *tok, char *p, int n_st = 1; static int st[MAXSTEPS]; st[0] = l; - while (*p == ',' || *p == ':') { + while (*p == ',' || *p == ':' || *p == '-') { char c = *p++; if (sscanf(p, "%d%n", &l, &n) == 1) { p += n; @@ -990,6 +990,28 @@ static char *parse_steps(char *tok, char *p, } } } + } else if (c == '-') { + // '-l' denotes an enumeration starting at the last value + if (n_st <= 0) return 0; + int last = st[n_st-1]; + if (l >= last) { + for (int i = last+1; i <= l; i++) { + st[n_st++] = i; + if (n_st == MAXSTEPS) { + fprintf(stderr, "warning: too many steps: %s\n", tok); + break; + } + } + } else { + for (int i = last-1; i >= l; i--) { + st[n_st++] = i; + if (n_st == MAXSTEPS) { + fprintf(stderr, "warning: too many steps: %s\n", tok); + break; + } + } + } + if (st[n_st-1] != l) break; } else if (n_st < MAXSTEPS) { st[n_st++] = l; if (n_st == MAXSTEPS)