* mandocdb: use more macros
@ 2011-11-20 15:52 Ingo Schwarze
2011-11-20 17:10 ` Ingo Schwarze
0 siblings, 1 reply; 4+ messages in thread
From: Ingo Schwarze @ 2011-11-20 15:52 UTC (permalink / raw)
To: tech
Hi,
here is a patch to use more macros for building the mandoc database.
It mostly picks the low-hanging fruit.
To be able to use most macros without writing a trivial handler
function for each macro, i did some code reorganisation:
* For each macro, teach the mdocs table which search type to use
and whether to append the text in the child nodes to the buffer.
* Return a boolean int from the pmdoc_* handlers to signal
whether anything should be added to the database.
Besides, i think we should use all macros in all sections.
Sure, macros that have a typical section are rare outside,
but finding them outside doesn't mean that the information
is necessarily irrelevant. So i removed the section check
from An, Cd, In, St, Er, Ev, and Pa. I didn't touch Fn, Vt,
Fo, and Nm yet. These can be improved, but that's another task.
OK?
Ingo
--- mandocdb.c.orig
+++ mandocdb.c
@@ -106,147 +106,150 @@
const struct of *);
static int pman_node(MAN_ARGS);
static void pmdoc_node(MDOC_ARGS);
-static void pmdoc_An(MDOC_ARGS);
-static void pmdoc_Cd(MDOC_ARGS);
-static void pmdoc_Er(MDOC_ARGS);
-static void pmdoc_Ev(MDOC_ARGS);
-static void pmdoc_Fd(MDOC_ARGS);
-static void pmdoc_In(MDOC_ARGS);
-static void pmdoc_Fn(MDOC_ARGS);
-static void pmdoc_Fo(MDOC_ARGS);
-static void pmdoc_Nd(MDOC_ARGS);
-static void pmdoc_Nm(MDOC_ARGS);
-static void pmdoc_Pa(MDOC_ARGS);
-static void pmdoc_St(MDOC_ARGS);
-static void pmdoc_Vt(MDOC_ARGS);
-static void pmdoc_Xr(MDOC_ARGS);
+static int pmdoc_Fd(MDOC_ARGS);
+static int pmdoc_In(MDOC_ARGS);
+static int pmdoc_Fn(MDOC_ARGS);
+static int pmdoc_Fo(MDOC_ARGS);
+static int pmdoc_Nd(MDOC_ARGS);
+static int pmdoc_Nm(MDOC_ARGS);
+static int pmdoc_Sh(MDOC_ARGS);
+static int pmdoc_Ss(MDOC_ARGS);
+static int pmdoc_St(MDOC_ARGS);
+static int pmdoc_Vt(MDOC_ARGS);
+static int pmdoc_Xr(MDOC_ARGS);
static void usage(void);
-typedef void (*pmdoc_nf)(MDOC_ARGS);
-
-static const pmdoc_nf mdocs[MDOC_MAX] = {
- NULL, /* Ap */
- NULL, /* Dd */
- NULL, /* Dt */
- NULL, /* Os */
- NULL, /* Sh */
- NULL, /* Ss */
- NULL, /* Pp */
- NULL, /* D1 */
- NULL, /* Dl */
- NULL, /* Bd */
- NULL, /* Ed */
- NULL, /* Bl */
- NULL, /* El */
- NULL, /* It */
- NULL, /* Ad */
- pmdoc_An, /* An */
- NULL, /* Ar */
- pmdoc_Cd, /* Cd */
- NULL, /* Cm */
- NULL, /* Dv */
- pmdoc_Er, /* Er */
- pmdoc_Ev, /* Ev */
- NULL, /* Ex */
- NULL, /* Fa */
- pmdoc_Fd, /* Fd */
- NULL, /* Fl */
- pmdoc_Fn, /* Fn */
- NULL, /* Ft */
- NULL, /* Ic */
- pmdoc_In, /* In */
- NULL, /* Li */
- pmdoc_Nd, /* Nd */
- pmdoc_Nm, /* Nm */
- NULL, /* Op */
- NULL, /* Ot */
- pmdoc_Pa, /* Pa */
- NULL, /* Rv */
- pmdoc_St, /* St */
- pmdoc_Vt, /* Va */
- pmdoc_Vt, /* Vt */
- pmdoc_Xr, /* Xr */
- NULL, /* %A */
- NULL, /* %B */
- NULL, /* %D */
- NULL, /* %I */
- NULL, /* %J */
- NULL, /* %N */
- NULL, /* %O */
- NULL, /* %P */
- NULL, /* %R */
- NULL, /* %T */
- NULL, /* %V */
- NULL, /* Ac */
- NULL, /* Ao */
- NULL, /* Aq */
- NULL, /* At */
- NULL, /* Bc */
- NULL, /* Bf */
- NULL, /* Bo */
- NULL, /* Bq */
- NULL, /* Bsx */
- NULL, /* Bx */
- NULL, /* Db */
- NULL, /* Dc */
- NULL, /* Do */
- NULL, /* Dq */
- NULL, /* Ec */
- NULL, /* Ef */
- NULL, /* Em */
- NULL, /* Eo */
- NULL, /* Fx */
- NULL, /* Ms */
- NULL, /* No */
- NULL, /* Ns */
- NULL, /* Nx */
- NULL, /* Ox */
- NULL, /* Pc */
- NULL, /* Pf */
- NULL, /* Po */
- NULL, /* Pq */
- NULL, /* Qc */
- NULL, /* Ql */
- NULL, /* Qo */
- NULL, /* Qq */
- NULL, /* Re */
- NULL, /* Rs */
- NULL, /* Sc */
- NULL, /* So */
- NULL, /* Sq */
- NULL, /* Sm */
- NULL, /* Sx */
- NULL, /* Sy */
- NULL, /* Tn */
- NULL, /* Ux */
- NULL, /* Xc */
- NULL, /* Xo */
- pmdoc_Fo, /* Fo */
- NULL, /* Fc */
- NULL, /* Oo */
- NULL, /* Oc */
- NULL, /* Bk */
- NULL, /* Ek */
- NULL, /* Bt */
- NULL, /* Hf */
- NULL, /* Fr */
- NULL, /* Ud */
- NULL, /* Lb */
- NULL, /* Lp */
- NULL, /* Lk */
- NULL, /* Mt */
- NULL, /* Brq */
- NULL, /* Bro */
- NULL, /* Brc */
- NULL, /* %C */
- NULL, /* Es */
- NULL, /* En */
- NULL, /* Dx */
- NULL, /* %Q */
- NULL, /* br */
- NULL, /* sp */
- NULL, /* %U */
- NULL, /* Ta */
+#define MDOCF_CHILD 0x01
+
+struct mdoc_handler {
+ int (*fp)(MDOC_ARGS);
+ uint64_t mask;
+ int flags;
+};
+
+static const struct mdoc_handler mdocs[MDOC_MAX] = {
+ { NULL, 0, 0 }, /* Ap */
+ { NULL, 0, 0 }, /* Dd */
+ { NULL, 0, 0 }, /* Dt */
+ { NULL, 0, 0 }, /* Os */
+ { pmdoc_Sh, TYPE_Sh, MDOCF_CHILD }, /* Sh */
+ { pmdoc_Ss, TYPE_Ss, MDOCF_CHILD }, /* Ss */
+ { NULL, 0, 0 }, /* Pp */
+ { NULL, 0, 0 }, /* D1 */
+ { NULL, 0, 0 }, /* Dl */
+ { NULL, 0, 0 }, /* Bd */
+ { NULL, 0, 0 }, /* Ed */
+ { NULL, 0, 0 }, /* Bl */
+ { NULL, 0, 0 }, /* El */
+ { NULL, 0, 0 }, /* It */
+ { NULL, 0, 0 }, /* Ad */
+ { NULL, TYPE_An, MDOCF_CHILD }, /* An */
+ { NULL, TYPE_Ar, MDOCF_CHILD }, /* Ar */
+ { NULL, TYPE_Cd, MDOCF_CHILD }, /* Cd */
+ { NULL, TYPE_Cm, MDOCF_CHILD }, /* Cm */
+ { NULL, TYPE_Dv, MDOCF_CHILD }, /* Dv */
+ { NULL, TYPE_Er, MDOCF_CHILD }, /* Er */
+ { NULL, TYPE_Ev, MDOCF_CHILD }, /* Ev */
+ { NULL, 0, 0 }, /* Ex */
+ { NULL, 0, 0 }, /* Fa */
+ { pmdoc_Fd, TYPE_In, 0 }, /* Fd */
+ { NULL, TYPE_Fl, MDOCF_CHILD }, /* Fl */
+ { pmdoc_Fn, TYPE_Fn, 0 }, /* Fn */
+ { NULL, 0, 0 }, /* Ft */
+ { NULL, TYPE_Ic, MDOCF_CHILD }, /* Ic */
+ { pmdoc_In, TYPE_In, 0 }, /* In */
+ { NULL, TYPE_Li, MDOCF_CHILD }, /* Li */
+ { pmdoc_Nd, TYPE_Nd, MDOCF_CHILD }, /* Nd */
+ { pmdoc_Nm, TYPE_Nm, MDOCF_CHILD }, /* Nm */
+ { NULL, 0, 0 }, /* Op */
+ { NULL, 0, 0 }, /* Ot */
+ { NULL, TYPE_Pa, MDOCF_CHILD }, /* Pa */
+ { NULL, 0, 0 }, /* Rv */
+ { pmdoc_St, TYPE_St, 0 }, /* St */
+ { pmdoc_Vt, TYPE_Va, 0 }, /* Va */
+ { pmdoc_Vt, TYPE_Va, 0 }, /* Vt */
+ { pmdoc_Xr, TYPE_Xr, 0 }, /* Xr */
+ { NULL, 0, 0 }, /* %A */
+ { NULL, 0, 0 }, /* %B */
+ { NULL, 0, 0 }, /* %D */
+ { NULL, 0, 0 }, /* %I */
+ { NULL, 0, 0 }, /* %J */
+ { NULL, 0, 0 }, /* %N */
+ { NULL, 0, 0 }, /* %O */
+ { NULL, 0, 0 }, /* %P */
+ { NULL, 0, 0 }, /* %R */
+ { NULL, 0, 0 }, /* %T */
+ { NULL, 0, 0 }, /* %V */
+ { NULL, 0, 0 }, /* Ac */
+ { NULL, 0, 0 }, /* Ao */
+ { NULL, 0, 0 }, /* Aq */
+ { NULL, TYPE_At, MDOCF_CHILD }, /* At */
+ { NULL, 0, 0 }, /* Bc */
+ { NULL, 0, 0 }, /* Bf */
+ { NULL, 0, 0 }, /* Bo */
+ { NULL, 0, 0 }, /* Bq */
+ { NULL, TYPE_Bsx, MDOCF_CHILD }, /* Bsx */
+ { NULL, TYPE_Bx, MDOCF_CHILD }, /* Bx */
+ { NULL, 0, 0 }, /* Db */
+ { NULL, 0, 0 }, /* Dc */
+ { NULL, 0, 0 }, /* Do */
+ { NULL, 0, 0 }, /* Dq */
+ { NULL, 0, 0 }, /* Ec */
+ { NULL, 0, 0 }, /* Ef */
+ { NULL, TYPE_Em, MDOCF_CHILD }, /* Em */
+ { NULL, 0, 0 }, /* Eo */
+ { NULL, TYPE_Fx, MDOCF_CHILD }, /* Fx */
+ { NULL, TYPE_Ms, MDOCF_CHILD }, /* Ms */
+ { NULL, 0, 0 }, /* No */
+ { NULL, 0, 0 }, /* Ns */
+ { NULL, TYPE_Nx, MDOCF_CHILD }, /* Nx */
+ { NULL, TYPE_Ox, MDOCF_CHILD }, /* Ox */
+ { NULL, 0, 0 }, /* Pc */
+ { NULL, 0, 0 }, /* Pf */
+ { NULL, 0, 0 }, /* Po */
+ { NULL, 0, 0 }, /* Pq */
+ { NULL, 0, 0 }, /* Qc */
+ { NULL, 0, 0 }, /* Ql */
+ { NULL, 0, 0 }, /* Qo */
+ { NULL, 0, 0 }, /* Qq */
+ { NULL, 0, 0 }, /* Re */
+ { NULL, 0, 0 }, /* Rs */
+ { NULL, 0, 0 }, /* Sc */
+ { NULL, 0, 0 }, /* So */
+ { NULL, 0, 0 }, /* Sq */
+ { NULL, 0, 0 }, /* Sm */
+ { NULL, 0, 0 }, /* Sx */
+ { NULL, TYPE_Sy, MDOCF_CHILD }, /* Sy */
+ { NULL, TYPE_Tn, MDOCF_CHILD }, /* Tn */
+ { NULL, 0, 0 }, /* Ux */
+ { NULL, 0, 0 }, /* Xc */
+ { NULL, 0, 0 }, /* Xo */
+ { pmdoc_Fo, TYPE_Fn, 0 }, /* Fo */
+ { NULL, 0, 0 }, /* Fc */
+ { NULL, 0, 0 }, /* Oo */
+ { NULL, 0, 0 }, /* Oc */
+ { NULL, 0, 0 }, /* Bk */
+ { NULL, 0, 0 }, /* Ek */
+ { NULL, 0, 0 }, /* Bt */
+ { NULL, 0, 0 }, /* Hf */
+ { NULL, 0, 0 }, /* Fr */
+ { NULL, 0, 0 }, /* Ud */
+ { NULL, TYPE_Lb, MDOCF_CHILD }, /* Lb */
+ { NULL, 0, 0 }, /* Lp */
+ { NULL, TYPE_Lk, MDOCF_CHILD }, /* Lk */
+ { NULL, TYPE_Mt, MDOCF_CHILD }, /* Mt */
+ { NULL, 0, 0 }, /* Brq */
+ { NULL, 0, 0 }, /* Bro */
+ { NULL, 0, 0 }, /* Brc */
+ { NULL, 0, 0 }, /* %C */
+ { NULL, 0, 0 }, /* Es */
+ { NULL, 0, 0 }, /* En */
+ { NULL, TYPE_Dx, MDOCF_CHILD }, /* Dx */
+ { NULL, 0, 0 }, /* %Q */
+ { NULL, 0, 0 }, /* br */
+ { NULL, 0, 0 }, /* sp */
+ { NULL, 0, 0 }, /* %U */
+ { NULL, 0, 0 }, /* Ta */
};
static const char *progname;
@@ -788,18 +791,6 @@ buf_appendmdoc(struct buf *buf, const struct mdoc_node *n, int f)
}
}
-/* ARGSUSED */
-static void
-pmdoc_An(MDOC_ARGS)
-{
-
- if (SEC_AUTHORS != n->sec)
- return;
-
- buf_appendmdoc(buf, n->child, 0);
- hash_put(hash, buf, TYPE_An);
-}
-
static void
hash_reset(DB **db)
{
@@ -816,26 +807,26 @@ hash_reset(DB **db)
}
/* ARGSUSED */
-static void
+static int
pmdoc_Fd(MDOC_ARGS)
{
const char *start, *end;
size_t sz;
if (SEC_SYNOPSIS != n->sec)
- return;
+ return(0);
if (NULL == (n = n->child) || MDOC_TEXT != n->type)
- return;
+ return(0);
/*
* Only consider those `Fd' macro fields that begin with an
* "inclusion" token (versus, e.g., #define).
*/
if (strcmp("#include", n->string))
- return;
+ return(0);
if (NULL == (n = n->next) || MDOC_TEXT != n->type)
- return;
+ return(0);
/*
* Strip away the enclosing angle brackets and make sure we're
@@ -847,7 +838,7 @@ pmdoc_Fd(MDOC_ARGS)
start++;
if (0 == (sz = strlen(start)))
- return;
+ return(0);
end = &start[(int)sz - 1];
if ('>' == *end || '"' == *end)
@@ -857,46 +848,31 @@ pmdoc_Fd(MDOC_ARGS)
buf_appendb(buf, start, (size_t)(end - start + 1));
buf_appendb(buf, "", 1);
-
- hash_put(hash, buf, TYPE_In);
-}
-
-/* ARGSUSED */
-static void
-pmdoc_Cd(MDOC_ARGS)
-{
-
- if (SEC_SYNOPSIS != n->sec)
- return;
-
- buf_appendmdoc(buf, n->child, 0);
- hash_put(hash, buf, TYPE_Cd);
+ return(1);
}
/* ARGSUSED */
-static void
+static int
pmdoc_In(MDOC_ARGS)
{
- if (SEC_SYNOPSIS != n->sec)
- return;
if (NULL == n->child || MDOC_TEXT != n->child->type)
- return;
+ return(0);
buf_append(buf, n->child->string);
- hash_put(hash, buf, TYPE_In);
+ return(1);
}
/* ARGSUSED */
-static void
+static int
pmdoc_Fn(MDOC_ARGS)
{
const char *cp;
if (SEC_SYNOPSIS != n->sec)
- return;
+ return(0);
if (NULL == n->child || MDOC_TEXT != n->child->type)
- return;
+ return(0);
/* .Fn "struct type *arg" "foo" */
@@ -910,30 +886,28 @@ pmdoc_Fn(MDOC_ARGS)
cp++;
buf_append(buf, cp);
- hash_put(hash, buf, TYPE_Fn);
+ return(1);
}
/* ARGSUSED */
-static void
+static int
pmdoc_St(MDOC_ARGS)
{
- if (SEC_STANDARDS != n->sec)
- return;
if (NULL == n->child || MDOC_TEXT != n->child->type)
- return;
+ return(0);
buf_append(buf, n->child->string);
- hash_put(hash, buf, TYPE_St);
+ return(1);
}
/* ARGSUSED */
-static void
+static int
pmdoc_Xr(MDOC_ARGS)
{
if (NULL == (n = n->child))
- return;
+ return(0);
buf_appendb(buf, n->string, strlen(n->string));
@@ -943,22 +917,22 @@ pmdoc_Xr(MDOC_ARGS)
} else
buf_appendb(buf, ".", 2);
- hash_put(hash, buf, TYPE_Xr);
+ return(1);
}
/* ARGSUSED */
-static void
+static int
pmdoc_Vt(MDOC_ARGS)
{
const char *start;
size_t sz;
if (SEC_SYNOPSIS != n->sec)
- return;
+ return(0);
if (MDOC_Vt == n->tok && MDOC_BODY != n->type)
- return;
+ return(0);
if (NULL == n->last || MDOC_TEXT != n->last->type)
- return;
+ return(0);
/*
* Strip away leading pointer symbol '*' and trailing ';'.
@@ -970,101 +944,76 @@ pmdoc_Vt(MDOC_ARGS)
start++;
if (0 == (sz = strlen(start)))
- return;
+ return(0);
if (';' == start[(int)sz - 1])
sz--;
if (0 == sz)
- return;
+ return(0);
buf_appendb(buf, start, sz);
buf_appendb(buf, "", 1);
- hash_put(hash, buf, TYPE_Va);
+ return(1);
}
/* ARGSUSED */
-static void
+static int
pmdoc_Fo(MDOC_ARGS)
{
if (SEC_SYNOPSIS != n->sec || MDOC_HEAD != n->type)
- return;
+ return(0);
if (NULL == n->child || MDOC_TEXT != n->child->type)
- return;
+ return(0);
buf_append(buf, n->child->string);
- hash_put(hash, buf, TYPE_Fn);
+ return(1);
}
/* ARGSUSED */
-static void
+static int
pmdoc_Nd(MDOC_ARGS)
{
if (MDOC_BODY != n->type)
- return;
+ return(0);
buf_appendmdoc(dbuf, n->child, 1);
- buf_appendmdoc(buf, n->child, 0);
-
- hash_put(hash, buf, TYPE_Nd);
+ return(1);
}
/* ARGSUSED */
-static void
-pmdoc_Er(MDOC_ARGS)
+static int
+pmdoc_Nm(MDOC_ARGS)
{
-
- if (SEC_ERRORS != n->sec)
- return;
- buf_appendmdoc(buf, n->child, 0);
- hash_put(hash, buf, TYPE_Er);
-}
+ if (SEC_NAME == n->sec)
+ return(1);
+ else if (SEC_SYNOPSIS != n->sec || MDOC_HEAD != n->type)
+ return(0);
-/* ARGSUSED */
-static void
-pmdoc_Ev(MDOC_ARGS)
-{
+ if (NULL == n->child)
+ buf_append(buf, m->name);
- if (SEC_ENVIRONMENT != n->sec)
- return;
-
- buf_appendmdoc(buf, n->child, 0);
- hash_put(hash, buf, TYPE_Ev);
+ return(1);
}
/* ARGSUSED */
-static void
-pmdoc_Pa(MDOC_ARGS)
+static int
+pmdoc_Sh(MDOC_ARGS)
{
- if (SEC_FILES != n->sec)
- return;
-
- buf_appendmdoc(buf, n->child, 0);
- hash_put(hash, buf, TYPE_Pa);
+ return(SEC_CUSTOM == n->sec && MDOC_HEAD == n->type);
}
/* ARGSUSED */
-static void
-pmdoc_Nm(MDOC_ARGS)
+static int
+pmdoc_Ss(MDOC_ARGS)
{
-
- if (SEC_NAME == n->sec) {
- buf_appendmdoc(buf, n->child, 0);
- hash_put(hash, buf, TYPE_Nm);
- return;
- } else if (SEC_SYNOPSIS != n->sec || MDOC_HEAD != n->type)
- return;
- if (NULL == n->child)
- buf_append(buf, m->name);
-
- buf_appendmdoc(buf, n->child, 0);
- hash_put(hash, buf, TYPE_Nm);
+ return(MDOC_HEAD == n->type);
}
static void
@@ -1130,11 +1079,14 @@ pmdoc_node(MDOC_ARGS)
case (MDOC_BLOCK):
/* FALLTHROUGH */
case (MDOC_ELEM):
- if (NULL == mdocs[n->tok])
- break;
-
buf->len = 0;
- (*mdocs[n->tok])(hash, buf, dbuf, n, m);
+ if (NULL != mdocs[n->tok].fp &&
+ 0 == (*mdocs[n->tok].fp)(hash, buf, dbuf, n, m))
+ break;
+ if (MDOCF_CHILD & mdocs[n->tok].flags)
+ buf_appendmdoc(buf, n->child, 0);
+ if (mdocs[n->tok].mask)
+ hash_put(hash, buf, mdocs[n->tok].mask);
break;
default:
break;
--
To unsubscribe send an email to tech+unsubscribe@mdocml.bsd.lv
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: mandocdb: use more macros
2011-11-20 15:52 mandocdb: use more macros Ingo Schwarze
@ 2011-11-20 17:10 ` Ingo Schwarze
2011-12-05 23:02 ` Ingo Schwarze
0 siblings, 1 reply; 4+ messages in thread
From: Ingo Schwarze @ 2011-11-20 17:10 UTC (permalink / raw)
To: tech
And here is another patch, improving function handling,
to be applied on top of the previous one:
--- mandocdb.c.orig
+++ mandocdb.c
@@ -106,14 +106,13 @@ static void pformatted(DB *, struct buf *, struct buf *,
const struct of *);
static int pman_node(MAN_ARGS);
static void pmdoc_node(MDOC_ARGS);
+static int pmdoc_head(MDOC_ARGS);
static int pmdoc_Fd(MDOC_ARGS);
static int pmdoc_In(MDOC_ARGS);
static int pmdoc_Fn(MDOC_ARGS);
-static int pmdoc_Fo(MDOC_ARGS);
static int pmdoc_Nd(MDOC_ARGS);
static int pmdoc_Nm(MDOC_ARGS);
static int pmdoc_Sh(MDOC_ARGS);
-static int pmdoc_Ss(MDOC_ARGS);
static int pmdoc_St(MDOC_ARGS);
static int pmdoc_Vt(MDOC_ARGS);
static int pmdoc_Xr(MDOC_ARGS);
@@ -133,7 +132,7 @@ static const struct mdoc_handler mdocs[MDOC_MAX] = {
{ NULL, 0, 0 }, /* Dt */
{ NULL, 0, 0 }, /* Os */
{ pmdoc_Sh, TYPE_Sh, MDOCF_CHILD }, /* Sh */
- { pmdoc_Ss, TYPE_Ss, MDOCF_CHILD }, /* Ss */
+ { pmdoc_head, TYPE_Ss, MDOCF_CHILD }, /* Ss */
{ NULL, 0, 0 }, /* Pp */
{ NULL, 0, 0 }, /* D1 */
{ NULL, 0, 0 }, /* Dl */
@@ -151,11 +150,11 @@ static const struct mdoc_handler mdocs[MDOC_MAX] = {
{ NULL, TYPE_Er, MDOCF_CHILD }, /* Er */
{ NULL, TYPE_Ev, MDOCF_CHILD }, /* Ev */
{ NULL, 0, 0 }, /* Ex */
- { NULL, 0, 0 }, /* Fa */
+ { NULL, TYPE_Fa, MDOCF_CHILD }, /* Fa */
{ pmdoc_Fd, TYPE_In, 0 }, /* Fd */
{ NULL, TYPE_Fl, MDOCF_CHILD }, /* Fl */
- { pmdoc_Fn, TYPE_Fn, 0 }, /* Fn */
- { NULL, 0, 0 }, /* Ft */
+ { pmdoc_Fn, 0, 0 }, /* Fn */
+ { NULL, TYPE_Ft, MDOCF_CHILD }, /* Ft */
{ NULL, TYPE_Ic, MDOCF_CHILD }, /* Ic */
{ pmdoc_In, TYPE_In, 0 }, /* In */
{ NULL, TYPE_Li, MDOCF_CHILD }, /* Li */
@@ -224,7 +223,7 @@ static const struct mdoc_handler mdocs[MDOC_MAX] = {
{ NULL, 0, 0 }, /* Ux */
{ NULL, 0, 0 }, /* Xc */
{ NULL, 0, 0 }, /* Xo */
- { pmdoc_Fo, TYPE_Fn, 0 }, /* Fo */
+ { pmdoc_head, TYPE_Fn, 0 }, /* Fo */
{ NULL, 0, 0 }, /* Fc */
{ NULL, 0, 0 }, /* Oo */
{ NULL, 0, 0 }, /* Oc */
@@ -808,6 +807,14 @@ hash_reset(DB **db)
/* ARGSUSED */
static int
+pmdoc_head(MDOC_ARGS)
+{
+
+ return(MDOC_HEAD == n->type);
+}
+
+/* ARGSUSED */
+static int
pmdoc_Fd(MDOC_ARGS)
{
const char *start, *end;
@@ -867,26 +874,50 @@ pmdoc_In(MDOC_ARGS)
static int
pmdoc_Fn(MDOC_ARGS)
{
+ struct mdoc_node *nn;
const char *cp;
-
- if (SEC_SYNOPSIS != n->sec)
- return(0);
- if (NULL == n->child || MDOC_TEXT != n->child->type)
+
+ nn = n->child;
+
+ if (NULL == nn || MDOC_TEXT != nn->type)
return(0);
- /* .Fn "struct type *arg" "foo" */
+ /* .Fn "struct type *name" "char *arg" */
- cp = strrchr(n->child->string, ' ');
+ cp = strrchr(nn->string, ' ');
if (NULL == cp)
- cp = n->child->string;
+ cp = nn->string;
/* Strip away pointer symbol. */
while ('*' == *cp)
cp++;
+ /* Store the function name. */
+
buf_append(buf, cp);
- return(1);
+ hash_put(hash, buf, TYPE_Fn);
+
+ /* Store the function type. */
+
+ if (nn->string < cp) {
+ buf->len = 0;
+ buf_appendb(buf, nn->string, cp - nn->string);
+ buf_appendb(buf, "", 1);
+ hash_put(hash, buf, TYPE_Ft);
+ }
+
+ /* Store the arguments. */
+
+ for (nn = nn->next; nn; nn = nn->next) {
+ if (MDOC_TEXT != nn->type)
+ continue;
+ buf->len = 0;
+ buf_append(buf, nn->string);
+ hash_put(hash, buf, TYPE_Fa);
+ }
+
+ return(0);
}
/* ARGSUSED */
@@ -959,21 +990,6 @@ pmdoc_Vt(MDOC_ARGS)
/* ARGSUSED */
static int
-pmdoc_Fo(MDOC_ARGS)
-{
-
- if (SEC_SYNOPSIS != n->sec || MDOC_HEAD != n->type)
- return(0);
- if (NULL == n->child || MDOC_TEXT != n->child->type)
- return(0);
-
- buf_append(buf, n->child->string);
- return(1);
-}
-
-
-/* ARGSUSED */
-static int
pmdoc_Nd(MDOC_ARGS)
{
@@ -1008,14 +1024,6 @@ pmdoc_Sh(MDOC_ARGS)
return(SEC_CUSTOM == n->sec && MDOC_HEAD == n->type);
}
-/* ARGSUSED */
-static int
-pmdoc_Ss(MDOC_ARGS)
-{
-
- return(MDOC_HEAD == n->type);
-}
-
static void
hash_put(DB *db, const struct buf *buf, uint64_t mask)
{
--
To unsubscribe send an email to tech+unsubscribe@mdocml.bsd.lv
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: mandocdb: use more macros
2011-11-20 17:10 ` Ingo Schwarze
@ 2011-12-05 23:02 ` Ingo Schwarze
2011-12-07 1:00 ` Kristaps Dzonsons
0 siblings, 1 reply; 4+ messages in thread
From: Ingo Schwarze @ 2011-12-05 23:02 UTC (permalink / raw)
To: tech
Hi,
here is a complete patch replacing the ones sent in late November
in the same thread:
* use the content of 24 new macros (Ar, At, Bsx, Bx, Cm, Dv, Dx, Em,
Fa, Fl, Ft, Fx, Ic, Lb, Lk, Li, Ms, Mt, Nx, Ox, Sh, Ss, Sy, Tn)
* by removing 4 handler functions
* and handling 7 macros generically (An, Cd, Er, Ev, Pa, Va, Vt)
* introduce MDOCF_CHILD for automatic buf_appendmdoc
* handlers return 1 for automatic hash_put or 0 to skip it
Extract more information:
* extract Ft and Fa from Fn
* Save Va and Vt completely, do not strip them
Lift restrictions:
* use Cd, Fn, Fo, In, Va, and Vt anywhere, not only in SYNOPSIS
* use Ev anywhere, not only in ENVIRONMENT
* use Pa anywhere, not only in FILES
* use Er anywhere, not only in ERRORS
* use St anywhere, not only in STANDARDS
* use An anywhere, not only in AUTHORS
Keep restrictions:
* use Nm only in NAME and SYNOPSIS
* use Fd only in SYNOPSIS; not touched that one for now
While it's easy to split .Fn into .Ft, .Fn, and multiple .Fa's -
the last word of the first argument is the .Fn - something similar
will be quite tricky for .Va and .Vt. I guess the following
algorithm would work, but i don't want to put such complicated
stuff into this reorg diff, so i'm going to do that later,
in another diff:
* When .Vt is a block, treat the last word as .Vt, the rest as .Va.
* When .Vt is an element, treat it as just .Vt.
* Treat the last word of .Va as .Va, the rest as .Vt.
Alternatively, maybe a bit safer:
* Always save all of .Vt as .Vt.
* When .Vt is a block, additionally save the last word as .Va.
* Always save all of .Va as .Va.
* When .Va has more than one word, additionally save all but the
last word as .Vt.
Anyway, as i said, that's for a later diff.
OK for this one?
Ingo
Index: mandocdb.c
===================================================================
RCS file: /cvs/src/usr.bin/mandoc/mandocdb.c,v
retrieving revision 1.18
diff -u -p -r1.18 mandocdb.c
--- mandocdb.c 4 Dec 2011 14:11:55 -0000 1.18
+++ mandocdb.c 5 Dec 2011 22:43:27 -0000
@@ -103,147 +103,149 @@ static void pformatted(DB *, struct b
const struct of *);
static int pman_node(MAN_ARGS);
static void pmdoc_node(MDOC_ARGS);
-static void pmdoc_An(MDOC_ARGS);
-static void pmdoc_Cd(MDOC_ARGS);
-static void pmdoc_Er(MDOC_ARGS);
-static void pmdoc_Ev(MDOC_ARGS);
-static void pmdoc_Fd(MDOC_ARGS);
-static void pmdoc_In(MDOC_ARGS);
-static void pmdoc_Fn(MDOC_ARGS);
-static void pmdoc_Fo(MDOC_ARGS);
-static void pmdoc_Nd(MDOC_ARGS);
-static void pmdoc_Nm(MDOC_ARGS);
-static void pmdoc_Pa(MDOC_ARGS);
-static void pmdoc_St(MDOC_ARGS);
-static void pmdoc_Vt(MDOC_ARGS);
-static void pmdoc_Xr(MDOC_ARGS);
+static int pmdoc_head(MDOC_ARGS);
+static int pmdoc_body(MDOC_ARGS);
+static int pmdoc_Fd(MDOC_ARGS);
+static int pmdoc_In(MDOC_ARGS);
+static int pmdoc_Fn(MDOC_ARGS);
+static int pmdoc_Nd(MDOC_ARGS);
+static int pmdoc_Nm(MDOC_ARGS);
+static int pmdoc_Sh(MDOC_ARGS);
+static int pmdoc_St(MDOC_ARGS);
+static int pmdoc_Xr(MDOC_ARGS);
static void usage(void);
-typedef void (*pmdoc_nf)(MDOC_ARGS);
+#define MDOCF_CHILD 0x01
-static const pmdoc_nf mdocs[MDOC_MAX] = {
- NULL, /* Ap */
- NULL, /* Dd */
- NULL, /* Dt */
- NULL, /* Os */
- NULL, /* Sh */
- NULL, /* Ss */
- NULL, /* Pp */
- NULL, /* D1 */
- NULL, /* Dl */
- NULL, /* Bd */
- NULL, /* Ed */
- NULL, /* Bl */
- NULL, /* El */
- NULL, /* It */
- NULL, /* Ad */
- pmdoc_An, /* An */
- NULL, /* Ar */
- pmdoc_Cd, /* Cd */
- NULL, /* Cm */
- NULL, /* Dv */
- pmdoc_Er, /* Er */
- pmdoc_Ev, /* Ev */
- NULL, /* Ex */
- NULL, /* Fa */
- pmdoc_Fd, /* Fd */
- NULL, /* Fl */
- pmdoc_Fn, /* Fn */
- NULL, /* Ft */
- NULL, /* Ic */
- pmdoc_In, /* In */
- NULL, /* Li */
- pmdoc_Nd, /* Nd */
- pmdoc_Nm, /* Nm */
- NULL, /* Op */
- NULL, /* Ot */
- pmdoc_Pa, /* Pa */
- NULL, /* Rv */
- pmdoc_St, /* St */
- pmdoc_Vt, /* Va */
- pmdoc_Vt, /* Vt */
- pmdoc_Xr, /* Xr */
- NULL, /* %A */
- NULL, /* %B */
- NULL, /* %D */
- NULL, /* %I */
- NULL, /* %J */
- NULL, /* %N */
- NULL, /* %O */
- NULL, /* %P */
- NULL, /* %R */
- NULL, /* %T */
- NULL, /* %V */
- NULL, /* Ac */
- NULL, /* Ao */
- NULL, /* Aq */
- NULL, /* At */
- NULL, /* Bc */
- NULL, /* Bf */
- NULL, /* Bo */
- NULL, /* Bq */
- NULL, /* Bsx */
- NULL, /* Bx */
- NULL, /* Db */
- NULL, /* Dc */
- NULL, /* Do */
- NULL, /* Dq */
- NULL, /* Ec */
- NULL, /* Ef */
- NULL, /* Em */
- NULL, /* Eo */
- NULL, /* Fx */
- NULL, /* Ms */
- NULL, /* No */
- NULL, /* Ns */
- NULL, /* Nx */
- NULL, /* Ox */
- NULL, /* Pc */
- NULL, /* Pf */
- NULL, /* Po */
- NULL, /* Pq */
- NULL, /* Qc */
- NULL, /* Ql */
- NULL, /* Qo */
- NULL, /* Qq */
- NULL, /* Re */
- NULL, /* Rs */
- NULL, /* Sc */
- NULL, /* So */
- NULL, /* Sq */
- NULL, /* Sm */
- NULL, /* Sx */
- NULL, /* Sy */
- NULL, /* Tn */
- NULL, /* Ux */
- NULL, /* Xc */
- NULL, /* Xo */
- pmdoc_Fo, /* Fo */
- NULL, /* Fc */
- NULL, /* Oo */
- NULL, /* Oc */
- NULL, /* Bk */
- NULL, /* Ek */
- NULL, /* Bt */
- NULL, /* Hf */
- NULL, /* Fr */
- NULL, /* Ud */
- NULL, /* Lb */
- NULL, /* Lp */
- NULL, /* Lk */
- NULL, /* Mt */
- NULL, /* Brq */
- NULL, /* Bro */
- NULL, /* Brc */
- NULL, /* %C */
- NULL, /* Es */
- NULL, /* En */
- NULL, /* Dx */
- NULL, /* %Q */
- NULL, /* br */
- NULL, /* sp */
- NULL, /* %U */
- NULL, /* Ta */
+struct mdoc_handler {
+ int (*fp)(MDOC_ARGS);
+ uint64_t mask;
+ int flags;
+};
+
+static const struct mdoc_handler mdocs[MDOC_MAX] = {
+ { NULL, 0, 0 }, /* Ap */
+ { NULL, 0, 0 }, /* Dd */
+ { NULL, 0, 0 }, /* Dt */
+ { NULL, 0, 0 }, /* Os */
+ { pmdoc_Sh, TYPE_Sh, MDOCF_CHILD }, /* Sh */
+ { pmdoc_head, TYPE_Ss, MDOCF_CHILD }, /* Ss */
+ { NULL, 0, 0 }, /* Pp */
+ { NULL, 0, 0 }, /* D1 */
+ { NULL, 0, 0 }, /* Dl */
+ { NULL, 0, 0 }, /* Bd */
+ { NULL, 0, 0 }, /* Ed */
+ { NULL, 0, 0 }, /* Bl */
+ { NULL, 0, 0 }, /* El */
+ { NULL, 0, 0 }, /* It */
+ { NULL, 0, 0 }, /* Ad */
+ { NULL, TYPE_An, MDOCF_CHILD }, /* An */
+ { NULL, TYPE_Ar, MDOCF_CHILD }, /* Ar */
+ { NULL, TYPE_Cd, MDOCF_CHILD }, /* Cd */
+ { NULL, TYPE_Cm, MDOCF_CHILD }, /* Cm */
+ { NULL, TYPE_Dv, MDOCF_CHILD }, /* Dv */
+ { NULL, TYPE_Er, MDOCF_CHILD }, /* Er */
+ { NULL, TYPE_Ev, MDOCF_CHILD }, /* Ev */
+ { NULL, 0, 0 }, /* Ex */
+ { NULL, TYPE_Fa, MDOCF_CHILD }, /* Fa */
+ { pmdoc_Fd, TYPE_In, 0 }, /* Fd */
+ { NULL, TYPE_Fl, MDOCF_CHILD }, /* Fl */
+ { pmdoc_Fn, 0, 0 }, /* Fn */
+ { NULL, TYPE_Ft, MDOCF_CHILD }, /* Ft */
+ { NULL, TYPE_Ic, MDOCF_CHILD }, /* Ic */
+ { pmdoc_In, TYPE_In, 0 }, /* In */
+ { NULL, TYPE_Li, MDOCF_CHILD }, /* Li */
+ { pmdoc_Nd, TYPE_Nd, MDOCF_CHILD }, /* Nd */
+ { pmdoc_Nm, TYPE_Nm, MDOCF_CHILD }, /* Nm */
+ { NULL, 0, 0 }, /* Op */
+ { NULL, 0, 0 }, /* Ot */
+ { NULL, TYPE_Pa, MDOCF_CHILD }, /* Pa */
+ { NULL, 0, 0 }, /* Rv */
+ { pmdoc_St, TYPE_St, 0 }, /* St */
+ { NULL, TYPE_Va, MDOCF_CHILD }, /* Va */
+ { pmdoc_body, TYPE_Va, MDOCF_CHILD }, /* Vt */
+ { pmdoc_Xr, TYPE_Xr, 0 }, /* Xr */
+ { NULL, 0, 0 }, /* %A */
+ { NULL, 0, 0 }, /* %B */
+ { NULL, 0, 0 }, /* %D */
+ { NULL, 0, 0 }, /* %I */
+ { NULL, 0, 0 }, /* %J */
+ { NULL, 0, 0 }, /* %N */
+ { NULL, 0, 0 }, /* %O */
+ { NULL, 0, 0 }, /* %P */
+ { NULL, 0, 0 }, /* %R */
+ { NULL, 0, 0 }, /* %T */
+ { NULL, 0, 0 }, /* %V */
+ { NULL, 0, 0 }, /* Ac */
+ { NULL, 0, 0 }, /* Ao */
+ { NULL, 0, 0 }, /* Aq */
+ { NULL, TYPE_At, MDOCF_CHILD }, /* At */
+ { NULL, 0, 0 }, /* Bc */
+ { NULL, 0, 0 }, /* Bf */
+ { NULL, 0, 0 }, /* Bo */
+ { NULL, 0, 0 }, /* Bq */
+ { NULL, TYPE_Bsx, MDOCF_CHILD }, /* Bsx */
+ { NULL, TYPE_Bx, MDOCF_CHILD }, /* Bx */
+ { NULL, 0, 0 }, /* Db */
+ { NULL, 0, 0 }, /* Dc */
+ { NULL, 0, 0 }, /* Do */
+ { NULL, 0, 0 }, /* Dq */
+ { NULL, 0, 0 }, /* Ec */
+ { NULL, 0, 0 }, /* Ef */
+ { NULL, TYPE_Em, MDOCF_CHILD }, /* Em */
+ { NULL, 0, 0 }, /* Eo */
+ { NULL, TYPE_Fx, MDOCF_CHILD }, /* Fx */
+ { NULL, TYPE_Ms, MDOCF_CHILD }, /* Ms */
+ { NULL, 0, 0 }, /* No */
+ { NULL, 0, 0 }, /* Ns */
+ { NULL, TYPE_Nx, MDOCF_CHILD }, /* Nx */
+ { NULL, TYPE_Ox, MDOCF_CHILD }, /* Ox */
+ { NULL, 0, 0 }, /* Pc */
+ { NULL, 0, 0 }, /* Pf */
+ { NULL, 0, 0 }, /* Po */
+ { NULL, 0, 0 }, /* Pq */
+ { NULL, 0, 0 }, /* Qc */
+ { NULL, 0, 0 }, /* Ql */
+ { NULL, 0, 0 }, /* Qo */
+ { NULL, 0, 0 }, /* Qq */
+ { NULL, 0, 0 }, /* Re */
+ { NULL, 0, 0 }, /* Rs */
+ { NULL, 0, 0 }, /* Sc */
+ { NULL, 0, 0 }, /* So */
+ { NULL, 0, 0 }, /* Sq */
+ { NULL, 0, 0 }, /* Sm */
+ { NULL, 0, 0 }, /* Sx */
+ { NULL, TYPE_Sy, MDOCF_CHILD }, /* Sy */
+ { NULL, TYPE_Tn, MDOCF_CHILD }, /* Tn */
+ { NULL, 0, 0 }, /* Ux */
+ { NULL, 0, 0 }, /* Xc */
+ { NULL, 0, 0 }, /* Xo */
+ { pmdoc_head, TYPE_Fn, 0 }, /* Fo */
+ { NULL, 0, 0 }, /* Fc */
+ { NULL, 0, 0 }, /* Oo */
+ { NULL, 0, 0 }, /* Oc */
+ { NULL, 0, 0 }, /* Bk */
+ { NULL, 0, 0 }, /* Ek */
+ { NULL, 0, 0 }, /* Bt */
+ { NULL, 0, 0 }, /* Hf */
+ { NULL, 0, 0 }, /* Fr */
+ { NULL, 0, 0 }, /* Ud */
+ { NULL, TYPE_Lb, MDOCF_CHILD }, /* Lb */
+ { NULL, 0, 0 }, /* Lp */
+ { NULL, TYPE_Lk, MDOCF_CHILD }, /* Lk */
+ { NULL, TYPE_Mt, MDOCF_CHILD }, /* Mt */
+ { NULL, 0, 0 }, /* Brq */
+ { NULL, 0, 0 }, /* Bro */
+ { NULL, 0, 0 }, /* Brc */
+ { NULL, 0, 0 }, /* %C */
+ { NULL, 0, 0 }, /* Es */
+ { NULL, 0, 0 }, /* En */
+ { NULL, TYPE_Dx, MDOCF_CHILD }, /* Dx */
+ { NULL, 0, 0 }, /* %Q */
+ { NULL, 0, 0 }, /* br */
+ { NULL, 0, 0 }, /* sp */
+ { NULL, 0, 0 }, /* %U */
+ { NULL, 0, 0 }, /* Ta */
};
static const char *progname;
@@ -832,18 +834,6 @@ buf_appendmdoc(struct buf *buf, const st
}
}
-/* ARGSUSED */
-static void
-pmdoc_An(MDOC_ARGS)
-{
-
- if (SEC_AUTHORS != n->sec)
- return;
-
- buf_appendmdoc(buf, n->child, 0);
- hash_put(hash, buf, TYPE_An);
-}
-
static void
hash_reset(DB **db)
{
@@ -860,26 +850,42 @@ hash_reset(DB **db)
}
/* ARGSUSED */
-static void
+static int
+pmdoc_head(MDOC_ARGS)
+{
+
+ return(MDOC_HEAD == n->type);
+}
+
+/* ARGSUSED */
+static int
+pmdoc_body(MDOC_ARGS)
+{
+
+ return(MDOC_BODY == n->type);
+}
+
+/* ARGSUSED */
+static int
pmdoc_Fd(MDOC_ARGS)
{
const char *start, *end;
size_t sz;
if (SEC_SYNOPSIS != n->sec)
- return;
+ return(0);
if (NULL == (n = n->child) || MDOC_TEXT != n->type)
- return;
+ return(0);
/*
* Only consider those `Fd' macro fields that begin with an
* "inclusion" token (versus, e.g., #define).
*/
if (strcmp("#include", n->string))
- return;
+ return(0);
if (NULL == (n = n->next) || MDOC_TEXT != n->type)
- return;
+ return(0);
/*
* Strip away the enclosing angle brackets and make sure we're
@@ -891,7 +897,7 @@ pmdoc_Fd(MDOC_ARGS)
start++;
if (0 == (sz = strlen(start)))
- return;
+ return(0);
end = &start[(int)sz - 1];
if ('>' == *end || '"' == *end)
@@ -901,83 +907,90 @@ pmdoc_Fd(MDOC_ARGS)
buf_appendb(buf, start, (size_t)(end - start + 1));
buf_appendb(buf, "", 1);
-
- hash_put(hash, buf, TYPE_In);
-}
-
-/* ARGSUSED */
-static void
-pmdoc_Cd(MDOC_ARGS)
-{
-
- if (SEC_SYNOPSIS != n->sec)
- return;
-
- buf_appendmdoc(buf, n->child, 0);
- hash_put(hash, buf, TYPE_Cd);
+ return(1);
}
/* ARGSUSED */
-static void
+static int
pmdoc_In(MDOC_ARGS)
{
- if (SEC_SYNOPSIS != n->sec)
- return;
if (NULL == n->child || MDOC_TEXT != n->child->type)
- return;
+ return(0);
buf_append(buf, n->child->string);
- hash_put(hash, buf, TYPE_In);
+ return(1);
}
/* ARGSUSED */
-static void
+static int
pmdoc_Fn(MDOC_ARGS)
{
+ struct mdoc_node *nn;
const char *cp;
-
- if (SEC_SYNOPSIS != n->sec)
- return;
- if (NULL == n->child || MDOC_TEXT != n->child->type)
- return;
- /* .Fn "struct type *arg" "foo" */
+ nn = n->child;
+
+ if (NULL == nn || MDOC_TEXT != nn->type)
+ return(0);
- cp = strrchr(n->child->string, ' ');
+ /* .Fn "struct type *name" "char *arg" */
+
+ cp = strrchr(nn->string, ' ');
if (NULL == cp)
- cp = n->child->string;
+ cp = nn->string;
/* Strip away pointer symbol. */
while ('*' == *cp)
cp++;
+ /* Store the function name. */
+
buf_append(buf, cp);
hash_put(hash, buf, TYPE_Fn);
+
+ /* Store the function type. */
+
+ if (nn->string < cp) {
+ buf->len = 0;
+ buf_appendb(buf, nn->string, cp - nn->string);
+ buf_appendb(buf, "", 1);
+ hash_put(hash, buf, TYPE_Ft);
+ }
+
+ /* Store the arguments. */
+
+ for (nn = nn->next; nn; nn = nn->next) {
+ if (MDOC_TEXT != nn->type)
+ continue;
+ buf->len = 0;
+ buf_append(buf, nn->string);
+ hash_put(hash, buf, TYPE_Fa);
+ }
+
+ return(0);
}
/* ARGSUSED */
-static void
+static int
pmdoc_St(MDOC_ARGS)
{
- if (SEC_STANDARDS != n->sec)
- return;
if (NULL == n->child || MDOC_TEXT != n->child->type)
- return;
+ return(0);
buf_append(buf, n->child->string);
- hash_put(hash, buf, TYPE_St);
+ return(1);
}
/* ARGSUSED */
-static void
+static int
pmdoc_Xr(MDOC_ARGS)
{
if (NULL == (n = n->child))
- return;
+ return(0);
buf_appendb(buf, n->string, strlen(n->string));
@@ -987,128 +1000,43 @@ pmdoc_Xr(MDOC_ARGS)
} else
buf_appendb(buf, ".", 2);
- hash_put(hash, buf, TYPE_Xr);
-}
-
-/* ARGSUSED */
-static void
-pmdoc_Vt(MDOC_ARGS)
-{
- const char *start;
- size_t sz;
-
- if (SEC_SYNOPSIS != n->sec)
- return;
- if (MDOC_Vt == n->tok && MDOC_BODY != n->type)
- return;
- if (NULL == n->last || MDOC_TEXT != n->last->type)
- return;
-
- /*
- * Strip away leading pointer symbol '*' and trailing ';'.
- */
-
- start = n->last->string;
-
- while ('*' == *start)
- start++;
-
- if (0 == (sz = strlen(start)))
- return;
-
- if (';' == start[(int)sz - 1])
- sz--;
-
- if (0 == sz)
- return;
-
- buf_appendb(buf, start, sz);
- buf_appendb(buf, "", 1);
- hash_put(hash, buf, TYPE_Va);
+ return(1);
}
/* ARGSUSED */
-static void
-pmdoc_Fo(MDOC_ARGS)
-{
-
- if (SEC_SYNOPSIS != n->sec || MDOC_HEAD != n->type)
- return;
- if (NULL == n->child || MDOC_TEXT != n->child->type)
- return;
-
- buf_append(buf, n->child->string);
- hash_put(hash, buf, TYPE_Fn);
-}
-
-
-/* ARGSUSED */
-static void
+static int
pmdoc_Nd(MDOC_ARGS)
{
if (MDOC_BODY != n->type)
- return;
+ return(0);
buf_appendmdoc(dbuf, n->child, 1);
- buf_appendmdoc(buf, n->child, 0);
-
- hash_put(hash, buf, TYPE_Nd);
+ return(1);
}
/* ARGSUSED */
-static void
-pmdoc_Er(MDOC_ARGS)
-{
-
- if (SEC_ERRORS != n->sec)
- return;
-
- buf_appendmdoc(buf, n->child, 0);
- hash_put(hash, buf, TYPE_Er);
-}
-
-/* ARGSUSED */
-static void
-pmdoc_Ev(MDOC_ARGS)
+static int
+pmdoc_Nm(MDOC_ARGS)
{
-
- if (SEC_ENVIRONMENT != n->sec)
- return;
- buf_appendmdoc(buf, n->child, 0);
- hash_put(hash, buf, TYPE_Ev);
-}
+ if (SEC_NAME == n->sec)
+ return(1);
+ else if (SEC_SYNOPSIS != n->sec || MDOC_HEAD != n->type)
+ return(0);
-/* ARGSUSED */
-static void
-pmdoc_Pa(MDOC_ARGS)
-{
+ if (NULL == n->child)
+ buf_append(buf, m->name);
- if (SEC_FILES != n->sec)
- return;
-
- buf_appendmdoc(buf, n->child, 0);
- hash_put(hash, buf, TYPE_Pa);
+ return(1);
}
/* ARGSUSED */
-static void
-pmdoc_Nm(MDOC_ARGS)
+static int
+pmdoc_Sh(MDOC_ARGS)
{
-
- if (SEC_NAME == n->sec) {
- buf_appendmdoc(buf, n->child, 0);
- hash_put(hash, buf, TYPE_Nm);
- return;
- } else if (SEC_SYNOPSIS != n->sec || MDOC_HEAD != n->type)
- return;
-
- if (NULL == n->child)
- buf_append(buf, m->name);
- buf_appendmdoc(buf, n->child, 0);
- hash_put(hash, buf, TYPE_Nm);
+ return(SEC_CUSTOM == n->sec && MDOC_HEAD == n->type);
}
static void
@@ -1174,11 +1102,14 @@ pmdoc_node(MDOC_ARGS)
case (MDOC_BLOCK):
/* FALLTHROUGH */
case (MDOC_ELEM):
- if (NULL == mdocs[n->tok])
- break;
-
buf->len = 0;
- (*mdocs[n->tok])(hash, buf, dbuf, n, m);
+ if (NULL != mdocs[n->tok].fp &&
+ 0 == (*mdocs[n->tok].fp)(hash, buf, dbuf, n, m))
+ break;
+ if (MDOCF_CHILD & mdocs[n->tok].flags)
+ buf_appendmdoc(buf, n->child, 0);
+ if (mdocs[n->tok].mask)
+ hash_put(hash, buf, mdocs[n->tok].mask);
break;
default:
break;
--
To unsubscribe send an email to tech+unsubscribe@mdocml.bsd.lv
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: mandocdb: use more macros
2011-12-05 23:02 ` Ingo Schwarze
@ 2011-12-07 1:00 ` Kristaps Dzonsons
0 siblings, 0 replies; 4+ messages in thread
From: Kristaps Dzonsons @ 2011-12-07 1:00 UTC (permalink / raw)
To: tech
On 06/12/2011 00:02, Ingo Schwarze wrote:
> Hi,
>
> here is a complete patch replacing the ones sent in late November
> in the same thread:
>
> * use the content of 24 new macros (Ar, At, Bsx, Bx, Cm, Dv, Dx, Em,
> Fa, Fl, Ft, Fx, Ic, Lb, Lk, Li, Ms, Mt, Nx, Ox, Sh, Ss, Sy, Tn)
> * by removing 4 handler functions
> * and handling 7 macros generically (An, Cd, Er, Ev, Pa, Va, Vt)
> * introduce MDOCF_CHILD for automatic buf_appendmdoc
> * handlers return 1 for automatic hash_put or 0 to skip it
>
> Extract more information:
> * extract Ft and Fa from Fn
> * Save Va and Vt completely, do not strip them
>
> Lift restrictions:
> * use Cd, Fn, Fo, In, Va, and Vt anywhere, not only in SYNOPSIS
> * use Ev anywhere, not only in ENVIRONMENT
> * use Pa anywhere, not only in FILES
> * use Er anywhere, not only in ERRORS
> * use St anywhere, not only in STANDARDS
> * use An anywhere, not only in AUTHORS
>
> Keep restrictions:
> * use Nm only in NAME and SYNOPSIS
> * use Fd only in SYNOPSIS; not touched that one for now
>
> While it's easy to split .Fn into .Ft, .Fn, and multiple .Fa's -
> the last word of the first argument is the .Fn - something similar
> will be quite tricky for .Va and .Vt. I guess the following
> algorithm would work, but i don't want to put such complicated
> stuff into this reorg diff, so i'm going to do that later,
> in another diff:
>
> * When .Vt is a block, treat the last word as .Vt, the rest as .Va.
> * When .Vt is an element, treat it as just .Vt.
> * Treat the last word of .Va as .Va, the rest as .Vt.
>
> Alternatively, maybe a bit safer:
>
> * Always save all of .Vt as .Vt.
> * When .Vt is a block, additionally save the last word as .Va.
> * Always save all of .Va as .Va.
> * When .Va has more than one word, additionally save all but the
> last word as .Vt.
>
> Anyway, as i said, that's for a later diff.
>
> OK for this one?
Hi Ingo,
I like this, and the code has my ok. I haven't looked it over
carefully, but am alright with the direction.
On a different note, I'm beginning to worry a little about overloading
the DB with dupes (int, const, char, etc.). In short, the btree is
growing and growing. An option is to stuff a vector of each type/recno
into the btree value instead of having a single pair and use R_DUP.
I'll run some tests and see if this makes a difference: it'll reduce the
size of the tree for sure, but popular keys might overrun the internal
page sizes and hit performance. I just don't know without measurements,
but it's something to think about.
Regarding this patch... you know what I'm going to say... More docs!
Thanks,
Kristaps
--
To unsubscribe send an email to tech+unsubscribe@mdocml.bsd.lv
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2011-12-07 1:00 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-11-20 15:52 mandocdb: use more macros Ingo Schwarze
2011-11-20 17:10 ` Ingo Schwarze
2011-12-05 23:02 ` Ingo Schwarze
2011-12-07 1:00 ` Kristaps Dzonsons
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).