+/*----- Other simple node types -------------------------------------------*/
+
+enum { LESS = -1, EQUAL = 0, GREATER = 1 };
+
+typedef struct node_numeric {
+ node n;
+ int dir;
+ int i;
+} node_numeric;
+
+static void parse_numeric(const char *p, int *dir, int *i)
+{
+ long l;
+ const char *pp = p;
+ char *q;
+
+ switch (*pp) {
+ case '-': *dir = LESS; pp++; break;
+ case '+': *dir = GREATER; pp++; break;
+ default: *dir = EQUAL; break;
+ }
+ errno = 0;
+ l = strtol(pp, &q, 0);
+ if (*q || errno || l < INT_MIN || l > INT_MAX)
+ die("bad numeric parameter `%s'", p);
+ *i = l;
+}
+
+static node *make_numeric(const char *const *av,
+ int (*func)(struct node *, const char *, size_t))
+{
+ node_numeric *n = xmalloc(sizeof(*n));
+ parse_numeric(av[0], &n->dir, &n->i);
+ n->n.func = func;
+ return (&n->n);
+}
+
+static int cmp_numeric(int x, int dir, int n)
+{
+ switch (dir) {
+ case LESS: return (x <= n);
+ case EQUAL: return (x == n);
+ case GREATER: return (x >= n);
+ }
+ abort();
+}
+
+static int n_length(node *nn, const char *p, size_t sz)
+{
+ node_numeric *n = (node_numeric *)nn;
+ return (cmp_numeric(sz, n->dir, n->i));
+}
+