Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/external/bsd/mdocml/dist - remove the expand inline function...



details:   https://anonhg.NetBSD.org/src/rev/2dd2e1b489e7
branches:  trunk
changeset: 785846:2dd2e1b489e7
user:      christos <christos%NetBSD.org@localhost>
date:      Wed Apr 03 00:58:48 2013 +0000

description:
- remove the expand inline function, we don't need it.
- make allow = 1, deny = 0 to avoid confusion
- use memset properly
- merge ctl duplicated code
- add numeric conditional evaluator for unary and binary
- fix parsing of numeric registers to stop on non alnum

With those fixes, the man page for top(1) works.

diffstat:

 external/bsd/mdocml/dist/roff.c |  163 +++++++++++++++++++++++++--------------
 1 files changed, 103 insertions(+), 60 deletions(-)

diffs (239 lines):

diff -r 2bc27728949d -r 2dd2e1b489e7 external/bsd/mdocml/dist/roff.c
--- a/external/bsd/mdocml/dist/roff.c   Wed Apr 03 00:55:32 2013 +0000
+++ b/external/bsd/mdocml/dist/roff.c   Wed Apr 03 00:58:48 2013 +0000
@@ -72,8 +72,8 @@
 };
 
 enum   roffrule {
-       ROFFRULE_ALLOW,
-       ROFFRULE_DENY
+       ROFFRULE_DENY,
+       ROFFRULE_ALLOW
 };
 
 /*
@@ -177,8 +177,6 @@
 static enum rofferr     roff_cond_text(ROFF_ARGS);
 static enum rofferr     roff_cond_sub(ROFF_ARGS);
 static enum rofferr     roff_ds(ROFF_ARGS);
-static  void            roff_expand_nr_inplace(struct roff *, char **, int *,
-                               size_t *);
 static enum roffrule    roff_evalcond(const char *, int *);
 static void             roff_free1(struct roff *);
 static void             roff_freestr(struct roffkv *);
@@ -397,7 +395,8 @@
 
        roff_free1(r);
 
-       memset(&r->regs, 0, sizeof(struct reg) * REG__MAX);
+       memset(&r->regs, 0, sizeof(r->regs));
+       memset(&r->nr, 0, sizeof(r->nr));
 
        for (i = 0; i < PREDEFS_MAX; i++) 
                roff_setstr(r, predefs[i].name, predefs[i].str, 0);
@@ -626,20 +625,16 @@
         * no matter our state.
         */
 
-       if (r->last && ! ctl) {
-               t = r->last->tok;
-               assert(roffs[t].text);
-               e = (*roffs[t].text)
-                       (r, t, bufp, szp, ln, pos, pos, offs);
-               assert(ROFF_IGN == e || ROFF_CONT == e);
-               if (ROFF_CONT != e)
-                       return(e);
-               if (r->eqn)
-                       return(eqn_read(&r->eqn, ln, *bufp, pos, offs));
-               if (r->tbl)
-                       return(tbl_read(r->tbl, ln, *bufp, pos));
-               return(roff_parsetext(*bufp + pos));
-       } else if ( ! ctl) {
+       if (!ctl) {
+               if (r->last) {
+                       t = r->last->tok;
+                       assert(roffs[t].text);
+                       e = (*roffs[t].text)
+                           (r, t, bufp, szp, ln, pos, pos, offs);
+                       assert(ROFF_IGN == e || ROFF_CONT == e);
+                       if (ROFF_CONT != e)
+                               return(e);
+               }
                if (r->eqn)
                        return(eqn_read(&r->eqn, ln, *bufp, pos, offs));
                if (r->tbl)
@@ -1055,12 +1050,6 @@
        ep = &(*bufp)[pos];
        for ( ; NULL != (ep = strchr(ep, '\\')); ep++) {
                ep++;
-               if (*ep == 'n') {
-                       int i = ep - *bufp - 1;
-                       roff_expand_nr_inplace(r, bufp, &i, szp);
-                       ep = *bufp + i;
-                       continue;
-               }
                if ('}' != *ep)
                        continue;
                *ep = '&';
@@ -1070,10 +1059,59 @@
        return(ROFFRULE_DENY == rr ? ROFF_IGN : ROFF_CONT);
 }
 
+static int
+roff_getnum(const char *v, int *pos, int *res)
+{
+       int p, n;
+
+       if ((n = (v[*pos] == '-')) != 0)
+               (*pos)++;
+
+       p = *pos;
+       for (*res = 0; isdigit((unsigned char)v[p]); p++)
+               *res += 10 * *res + v[p] - '0';
+       if (p == *pos)
+               return 0;
+
+       if (n)
+               *res = -*res;
+
+       *pos = p;
+       return 1;
+}
+
+static int
+roff_getop(const char *v, int *pos)
+{
+       int c;
+       switch (c = v[*pos]) {
+       case '=':
+       case '!':
+       case '>':
+       case '<':
+               (*pos)++;
+               if (v[*pos] == '=')  {
+                       (*pos)++;
+                       return c;
+               }
+               switch (c) {
+               case '>':
+                       return 'g';
+               case '<':
+                       return 'l';
+               default:
+                       return -1;
+               }
+       default:
+               return -1;
+       }
+}
+                       
 static enum roffrule
 roff_evalcond(const char *v, int *pos)
 {
-
+       int not = 0;
+       int lh, rh, op;
        switch (v[*pos]) {
        case ('n'):
                (*pos)++;
@@ -1085,13 +1123,46 @@
        case ('t'):
                (*pos)++;
                return(ROFFRULE_DENY);
+       case ('!'):
+               not++;
+               (*pos)++;
+               break;
        default:
                break;
        }
-
-       while (v[*pos] && ' ' != v[*pos])
-               (*pos)++;
-       return(ROFFRULE_DENY);
+       if (!roff_getnum(v, pos, &lh))
+               return ROFFRULE_DENY;
+       if ((op = roff_getop(v, pos)) == -1)
+               goto out;
+       if (!roff_getnum(v, pos, &rh))
+               return ROFFRULE_DENY;
+       switch (op) {
+       case '>':
+               lh = lh >= rh;
+               break;
+       case '<':
+               lh = lh <= rh;
+               break;
+       case '=':
+               lh = lh == rh;
+               break;
+       case '!':
+               lh = lh != rh;
+               break;
+       case 'g':
+               lh = lh > rh;
+               break;
+       case 'l':
+               lh = lh < rh;
+               break;
+       default:
+               return ROFFRULE_DENY;
+       }
+out:
+       if (not)
+               lh = !lh;
+       fprintf(stderr, "res=[%d]\n", lh);
+       return lh ? ROFFRULE_ALLOW : ROFFRULE_DENY;
 }
 
 /* ARGSUSED */
@@ -1334,12 +1405,12 @@
        } else
                e = '\0';
 
-       for (l = s; l < (int)slen; l++) {
+       for (l = s; src[l] && l < (int)slen; l++) {
                if (e) {
                        if (src[l] == e)
                                break;
                } else {
-                       if (isspace((unsigned char)src[l]))
+                       if (!isalnum((unsigned char)src[l]))
                                break;
                }
        }
@@ -1360,34 +1431,6 @@
        *dp += snprintf(*dst + *dp, *dlenp - *dp, "%jd", h->val);
 }
 
-static void
-roff_expand_nr_inplace(struct roff *r, char **src, int *sp, size_t *slenp)
-{
-       int j, i, k;
-       size_t dlen;
-       char *dst;
-
-       k = i = *sp;
-
-       dst = NULL;
-       j = 0;
-       dlen = 0;
-
-       roff_expand_nr(r, *src, &i, *slenp, &dst, &j, &dlen);
-
-       if (j) {
-               int l = j - (i - k);
-               if (l > 0) {
-                       *slenp += l;
-                       *src = mandoc_realloc(*src, *slenp);
-               }
-               memmove(*src + j + k, *src + i, *slenp - i);
-               memcpy(*src + k, dst, j);
-               free(dst);
-       }
-       *sp = k + j;
-}
-
 /* ARGSUSED */
 static enum rofferr
 roff_rm(ROFF_ARGS)



Home | Main Index | Thread Index | Old Index