]> git.cameronkatri.com Git - mandoc.git/blobdiff - mandoc-db.c
Add configurations (`Cd') to mandoc-db mining.
[mandoc.git] / mandoc-db.c
index d3e28ed45e2caf4cd6983519fe948d87548a55c7..85d5036e380c6c06bc0d671a14be643dd624ed92 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mandoc-db.c,v 1.12 2011/04/12 14:48:42 kristaps Exp $ */
+/*     $Id: mandoc-db.c,v 1.18 2011/05/04 08:21:17 kristaps Exp $ */
 /*
  * Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  *
 /*
  * Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -48,7 +48,10 @@ enum type {
        MANDOC_FUNCTION,
        MANDOC_UTILITY,
        MANDOC_INCLUDES,
        MANDOC_FUNCTION,
        MANDOC_UTILITY,
        MANDOC_INCLUDES,
-       MANDOC_VARIABLE
+       MANDOC_VARIABLE,
+       MANDOC_STANDARD,
+       MANDOC_AUTHOR,
+       MANDOC_CONFIG
 };
 
 #define        MAN_ARGS          DB *db, \
 };
 
 #define        MAN_ARGS          DB *db, \
@@ -76,12 +79,15 @@ static      int               pman_node(MAN_ARGS);
 static void              pmdoc(DB *, const char *, DBT *, size_t *, 
                                DBT *, DBT *, size_t *, struct mdoc *);
 static void              pmdoc_node(MDOC_ARGS);
 static void              pmdoc(DB *, const char *, DBT *, size_t *, 
                                DBT *, DBT *, size_t *, struct mdoc *);
 static void              pmdoc_node(MDOC_ARGS);
+static void              pmdoc_An(MDOC_ARGS);
+static void              pmdoc_Cd(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_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_St(MDOC_ARGS);
 static void              pmdoc_Vt(MDOC_ARGS);
 
 typedef        void            (*pmdoc_nf)(MDOC_ARGS);
 static void              pmdoc_Vt(MDOC_ARGS);
 
 typedef        void            (*pmdoc_nf)(MDOC_ARGS);
@@ -104,9 +110,9 @@ static      const pmdoc_nf    mdocs[MDOC_MAX] = {
        NULL, /* El */
        NULL, /* It */
        NULL, /* Ad */ 
        NULL, /* El */
        NULL, /* It */
        NULL, /* Ad */ 
-       NULL, /* An */ 
+       pmdoc_An, /* An */ 
        NULL, /* Ar */
        NULL, /* Ar */
-       NULL, /* Cd */ 
+       pmdoc_Cd, /* Cd */ 
        NULL, /* Cm */
        NULL, /* Dv */ 
        NULL, /* Er */ 
        NULL, /* Cm */
        NULL, /* Dv */ 
        NULL, /* Er */ 
@@ -126,7 +132,7 @@ static      const pmdoc_nf    mdocs[MDOC_MAX] = {
        NULL, /* Ot */
        NULL, /* Pa */
        NULL, /* Rv */
        NULL, /* Ot */
        NULL, /* Pa */
        NULL, /* Rv */
-       NULL, /* St */ 
+       pmdoc_St, /* St */ 
        pmdoc_Vt, /* Va */
        pmdoc_Vt, /* Vt */ 
        NULL, /* Xr */ 
        pmdoc_Vt, /* Va */
        pmdoc_Vt, /* Vt */ 
        NULL, /* Xr */ 
@@ -221,6 +227,7 @@ main(int argc, char *argv[])
        struct man      *man; /* resulting man */
        char            *fn; /* current file being parsed */
        const char      *msec, /* manual section */
        struct man      *man; /* resulting man */
        char            *fn; /* current file being parsed */
        const char      *msec, /* manual section */
+                       *mtitle, /* manual title */
                        *dir; /* result dir (default: cwd) */
        char             ibuf[MAXPATHLEN], /* index fname */
                         ibbuf[MAXPATHLEN], /* index backup fname */
                        *dir; /* result dir (default: cwd) */
        char             ibuf[MAXPATHLEN], /* index fname */
                         ibbuf[MAXPATHLEN], /* index backup fname */
@@ -354,8 +361,12 @@ main(int argc, char *argv[])
                msec = NULL != mdoc ? 
                        mdoc_meta(mdoc)->msec :
                        man_meta(man)->msec;
                msec = NULL != mdoc ? 
                        mdoc_meta(mdoc)->msec :
                        man_meta(man)->msec;
+               mtitle = NULL != mdoc ? 
+                       mdoc_meta(mdoc)->title :
+                       man_meta(man)->title;
 
                assert(msec);
 
                assert(msec);
+               assert(mtitle);
 
                /* 
                 * The index record value consists of a nil-terminated
 
                /* 
                 * The index record value consists of a nil-terminated
@@ -368,6 +379,7 @@ main(int argc, char *argv[])
                dbt_init(&rval, &rsz);
                dbt_appendb(&rval, &rsz, fn, strlen(fn) + 1);
                dbt_appendb(&rval, &rsz, msec, strlen(msec) + 1);
                dbt_init(&rval, &rsz);
                dbt_appendb(&rval, &rsz, fn, strlen(fn) + 1);
                dbt_appendb(&rval, &rsz, msec, strlen(msec) + 1);
+               dbt_appendb(&rval, &rsz, mtitle, strlen(mtitle) + 1);
                sv = rval.size;
 
                /* Fix the record number in the btree value. */
                sv = rval.size;
 
                /* Fix the record number in the btree value. */
@@ -451,6 +463,48 @@ dbt_appendb(DBT *key, size_t *ksz, const void *cp, size_t sz)
                key->data = mandoc_realloc(key->data, *ksz);
        }
 
                key->data = mandoc_realloc(key->data, *ksz);
        }
 
+#if 0
+       dstp = key->data + (int)key->size;
+
+       while (NULL != (endp = memchr(cp, '\\', sz))) {
+               ssz = endp - cp;
+               memcpy(dstp, cp, ssz);
+
+               dstp += ssz;
+               key->size += ssz;
+               sz -= ssz;
+
+               cp = endp++;
+               /* FIXME: expects nil-terminated string! */
+               esc = mandoc_escape((const char **)&endp, NULL, NULL);
+
+               switch (esc) {
+               case (ESCAPE_ERROR):
+                       /* Nil-terminate this point. */
+                       memcpy(dstp, "", 1);
+                       key->size++;
+                       return;
+               case (ESCAPE_PREDEF):
+                       /* FALLTHROUGH */
+               case (ESCAPE_SPECIAL):
+                       break;
+               default:
+                       sz -= endp - cp;
+                       cp = endp;
+                       continue;
+               }
+
+               ssz = endp - cp;
+               memcpy(dstp, cp, ssz);
+
+               dstp += ssz;
+               key->size += ssz;
+               sz -= ssz;
+
+               cp = endp;
+       }
+#endif
+
        memcpy(key->data + (int)key->size, cp, sz);
        key->size += sz;
 }
        memcpy(key->data + (int)key->size, cp, sz);
        key->size += sz;
 }
@@ -476,6 +530,23 @@ dbt_append(DBT *key, size_t *ksz, const char *cp)
        dbt_appendb(key, ksz, cp, sz + 1);
 }
 
        dbt_appendb(key, ksz, cp, sz + 1);
 }
 
+/* ARGSUSED */
+static void
+pmdoc_An(MDOC_ARGS)
+{
+       uint32_t         fl;
+       
+       if (SEC_AUTHORS != n->sec)
+               return;
+
+       for (n = n->child; n; n = n->next)
+               if (MDOC_TEXT == n->type)
+                       dbt_append(key, ksz, n->string);
+
+       fl = MANDOC_AUTHOR;
+       memcpy(val->data, &fl, 4);
+}
+
 /* ARGSUSED */
 static void
 pmdoc_Fd(MDOC_ARGS)
 /* ARGSUSED */
 static void
 pmdoc_Fd(MDOC_ARGS)
@@ -483,7 +554,6 @@ pmdoc_Fd(MDOC_ARGS)
        uint32_t         fl;
        const char      *start, *end;
        size_t           sz;
        uint32_t         fl;
        const char      *start, *end;
        size_t           sz;
-       const char       nil = '\0';
        
        if (SEC_SYNOPSIS != n->sec)
                return;
        
        if (SEC_SYNOPSIS != n->sec)
                return;
@@ -517,12 +587,29 @@ pmdoc_Fd(MDOC_ARGS)
                end--;
 
        dbt_appendb(key, ksz, start, end - start + 1);
                end--;
 
        dbt_appendb(key, ksz, start, end - start + 1);
-       dbt_appendb(key, ksz, &nil, 1);
+       dbt_appendb(key, ksz, "", 1);
 
        fl = MANDOC_INCLUDES;
        memcpy(val->data, &fl, 4);
 }
 
 
        fl = MANDOC_INCLUDES;
        memcpy(val->data, &fl, 4);
 }
 
+/* ARGSUSED */
+static void
+pmdoc_Cd(MDOC_ARGS)
+{
+       uint32_t         fl;
+       
+       if (SEC_SYNOPSIS != n->sec)
+               return;
+
+       for (n = n->child; n; n = n->next)
+               if (MDOC_TEXT == n->type)
+                       dbt_append(key, ksz, n->string);
+
+       fl = MANDOC_CONFIG;
+       memcpy(val->data, &fl, 4);
+}
+
 /* ARGSUSED */
 static void
 pmdoc_In(MDOC_ARGS)
 /* ARGSUSED */
 static void
 pmdoc_In(MDOC_ARGS)
@@ -567,14 +654,29 @@ pmdoc_Fn(MDOC_ARGS)
        memcpy(val->data, &fl, 4);
 }
 
        memcpy(val->data, &fl, 4);
 }
 
+/* ARGSUSED */
+static void
+pmdoc_St(MDOC_ARGS)
+{
+       uint32_t         fl;
+       
+       if (SEC_STANDARDS != n->sec)
+               return;
+       if (NULL == n->child || MDOC_TEXT != n->child->type)
+               return;
+
+       dbt_append(key, ksz, n->child->string);
+       fl = MANDOC_STANDARD;
+       memcpy(val->data, &fl, 4);
+}
+
 /* ARGSUSED */
 static void
 pmdoc_Vt(MDOC_ARGS)
 {
        uint32_t         fl;
 /* ARGSUSED */
 static void
 pmdoc_Vt(MDOC_ARGS)
 {
        uint32_t         fl;
-       const char      *start, *end;
+       const char      *start;
        size_t           sz;
        size_t           sz;
-       const char       nil = '\0';
        
        if (SEC_SYNOPSIS != n->sec)
                return;
        
        if (SEC_SYNOPSIS != n->sec)
                return;
@@ -595,15 +697,15 @@ pmdoc_Vt(MDOC_ARGS)
        if (0 == (sz = strlen(start)))
                return;
 
        if (0 == (sz = strlen(start)))
                return;
 
-       end = &start[sz - 1];
-       while (end > start && ';' == *end)
-               end--;
+       if (';' == start[sz - 1])
+               sz--;
 
 
-       if (end == start)
+       if (0 == sz)
                return;
 
                return;
 
-       dbt_appendb(key, ksz, start, end - start + 1);
-       dbt_appendb(key, ksz, &nil, 1);
+       dbt_appendb(key, ksz, start, sz);
+       dbt_appendb(key, ksz, "", 1);
+
        fl = MANDOC_VARIABLE;
        memcpy(val->data, &fl, 4);
 }
        fl = MANDOC_VARIABLE;
        memcpy(val->data, &fl, 4);
 }
@@ -638,7 +740,6 @@ pmdoc_Nd(MDOC_ARGS)
                        dbt_appendb(rval, rsz, n->string, strlen(n->string) + 1);
                else
                        dbt_append(rval, rsz, n->string);
                        dbt_appendb(rval, rsz, n->string, strlen(n->string) + 1);
                else
                        dbt_append(rval, rsz, n->string);
-
                first = 0;
        }
 }
                first = 0;
        }
 }
@@ -715,8 +816,8 @@ pmdoc_node(MDOC_ARGS)
                        break;
 
                dbt_init(key, ksz);
                        break;
 
                dbt_init(key, ksz);
-               (*mdocs[n->tok])(db, dbn, key, ksz, val, rval, rsz, n);
 
 
+               (*mdocs[n->tok])(db, dbn, key, ksz, val, rval, rsz, n);
                dbt_put(db, dbn, key, val);
                break;
        default:
                dbt_put(db, dbn, key, val);
                break;
        default:
@@ -732,7 +833,6 @@ pman_node(MAN_ARGS)
 {
        const struct man_node *head, *body;
        const char      *start, *sv;
 {
        const struct man_node *head, *body;
        const char      *start, *sv;
-       const char       nil = '\0';
        size_t           sz;
        uint32_t         fl;
 
        size_t           sz;
        uint32_t         fl;
 
@@ -779,7 +879,7 @@ pman_node(MAN_ARGS)
 
                                dbt_init(key, ksz);
                                dbt_appendb(key, ksz, start, sz);
 
                                dbt_init(key, ksz);
                                dbt_appendb(key, ksz, start, sz);
-                               dbt_appendb(key, ksz, &nil, 1);
+                               dbt_appendb(key, ksz, "", 1);
 
                                dbt_put(db, dbn, key, val);
 
 
                                dbt_put(db, dbn, key, val);