From 4b4498fe402dde49acda7949e8ceec67023f87f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Wed, 12 Apr 2017 18:30:50 +0200 Subject: sam: support %n count specifier matching every n-th selection --- sam.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'sam.c') 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; } -- cgit v1.2.3