summaryrefslogtreecommitdiffstats
path: root/awkreg.awk
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2014-03-17 13:50:16 -0700
committerKaz Kylheku <kaz@kylheku.com>2014-03-17 13:50:16 -0700
commit958fdaa0731b22ac051caae2c9730b1d660149c7 (patch)
tree1fbddb02f2ef41d397e89e3f62601f4d3c6c3a8e /awkreg.awk
parent8b107355e96eff715e4453728687a74011d3fb9c (diff)
downloadunix-cruft-958fdaa0731b22ac051caae2c9730b1d660149c7.tar.gz
unix-cruft-958fdaa0731b22ac051caae2c9730b1d660149c7.tar.bz2
unix-cruft-958fdaa0731b22ac051caae2c9730b1d660149c7.zip
Reject reversed {m,n} repeats where m > n.
Diffstat (limited to 'awkreg.awk')
-rw-r--r--awkreg.awk35
1 files changed, 28 insertions, 7 deletions
diff --git a/awkreg.awk b/awkreg.awk
index 088b53f..52c8353 100644
--- a/awkreg.awk
+++ b/awkreg.awk
@@ -38,6 +38,22 @@ function match_and_eat_else(s, pfx, e)
return e
}
+function eat_digits(s)
+{
+ match(s, /^[0-9]+/)
+ if (RLENGTH > 0)
+ return eat_chars(s, RLENGTH)
+ return s
+}
+
+function extract_digits(s)
+{
+ match(s, /^[0-9]+/)
+ if (RLENGTH > 0)
+ return substr(s, 1, RLENGTH)
+ return ""
+}
+
function eat_rchar(c)
{
if (c ~ /^\\./)
@@ -117,16 +133,17 @@ function eat_bracket_exp(e,
function eat_rep_notation(n,
# local
- o)
+ o, x, y)
{
o = n
n = eat_char(n)
- if (n !~ /^[0-9]/)
+ x = extract_digits(n)
+
+ if (empty(x))
return o
- while (n ~ /^[0-9]/)
- n = eat_char(n)
+ n = eat_digits(n)
if (matches(n, "}"))
return eat_char(n)
@@ -139,11 +156,15 @@ function eat_rep_notation(n,
if (matches(n, "}"))
return eat_char(n)
- if (n !~ /^[0-9]/)
+ y = extract_digits(n)
+
+ if (empty(y))
+ return o
+
+ if (x + 0 > y)
return o
- while (n ~ /^[0-9]/)
- n = eat_char(n)
+ n = eat_digits(n)
return match_and_eat_else(n, "}", o)
}