aboutsummaryrefslogtreecommitdiff
path: root/sam.c
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2017-04-12 18:30:50 +0200
committerMarc André Tanner <mat@brain-dump.org>2017-04-12 18:38:10 +0200
commit4b4498fe402dde49acda7949e8ceec67023f87f1 (patch)
tree3668ffdbbc73c4b48de1cd5c3e5ae01179612bc4 /sam.c
parent632a3cf4ddba6fd843633a8f7fe49d27a19f488c (diff)
downloadvis-4b4498fe402dde49acda7949e8ceec67023f87f1.tar.gz
vis-4b4498fe402dde49acda7949e8ceec67023f87f1.tar.xz
sam: support %n count specifier matching every n-th selection
Diffstat (limited to 'sam.c')
-rw-r--r--sam.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/sam.c b/sam.c
index b0e1ac6..0ade73a 100644
--- a/sam.c
+++ b/sam.c
@@ -62,6 +62,7 @@ struct Address {
typedef struct {
int start, end; /* interval [n,m] */
+ bool mod; /* % every n-th match, implies n == m */
} Count;
struct Command {
@@ -649,6 +650,18 @@ static int parse_number(const char **s) {
}
static enum SamError parse_count(const char **s, Count *count) {
+ count->mod = **s == '%';
+
+ if (count->mod) {
+ (*s)++;
+ int n = parse_number(s);
+ if (!n)
+ return SAM_ERR_COUNT;
+ count->start = n;
+ count->end = n;
+ return SAM_ERR_OK;
+ }
+
const char *before = *s;
if (!(count->start = parse_number(s)) && *s != before)
return SAM_ERR_COUNT;
@@ -1066,6 +1079,8 @@ static Filerange address_evaluate(Address *addr, File *file, Filerange *range, i
static bool count_evaluate(Command *cmd) {
Count *count = &cmd->count;
+ if (count->mod)
+ return count->start ? cmd->iteration % count->start == 0 : true;
return count->start <= cmd->iteration && cmd->iteration <= count->end;
}