[BACK]Return to mandocdb.c CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / mandoc

Diff for /mandoc/mandocdb.c between version 1.116 and 1.122

version 1.116, 2014/03/19 21:51:20 version 1.122, 2014/03/23 12:44:56
Line 46 
Line 46 
 #include "mdoc.h"  #include "mdoc.h"
 #include "man.h"  #include "man.h"
 #include "mandoc.h"  #include "mandoc.h"
   #include "mandoc_aux.h"
 #include "manpath.h"  #include "manpath.h"
 #include "mansearch.h"  #include "mansearch.h"
   
Line 99  struct inodev {
Line 100  struct inodev {
   
 struct  mpage {  struct  mpage {
         struct inodev    inodev;  /* used for hashing routine */          struct inodev    inodev;  /* used for hashing routine */
           int64_t          recno;   /* id in mpages SQL table */
         enum form        form;    /* format from file content */          enum form        form;    /* format from file content */
         char            *sec;     /* section from file content */          char            *sec;     /* section from file content */
         char            *arch;    /* architecture from file content */          char            *arch;    /* architecture from file content */
Line 116  struct mlink {
Line 118  struct mlink {
         char            *name;    /* name from file name (not empty) */          char            *name;    /* name from file name (not empty) */
         char            *fsec;    /* section from file name suffix */          char            *fsec;    /* section from file name suffix */
         struct mlink    *next;    /* singly linked list */          struct mlink    *next;    /* singly linked list */
           struct mpage    *mpage;   /* parent */
 };  };
   
 enum    stmt {  enum    stmt {
Line 134  struct mdoc_handler {
Line 137  struct mdoc_handler {
 };  };
   
 static  void     dbclose(int);  static  void     dbclose(int);
 static  void     dbadd(const struct mpage *, struct mchars *);  static  void     dbadd(struct mpage *, struct mchars *);
   static  void     dbadd_mlink(const struct mlink *mlink);
 static  int      dbopen(int);  static  int      dbopen(int);
 static  void     dbprune(void);  static  void     dbprune(void);
 static  void     filescan(const char *);  static  void     filescan(const char *);
Line 351  main(int argc, char *argv[])
Line 355  main(int argc, char *argv[])
   
         path_arg = NULL;          path_arg = NULL;
         op = OP_DEFAULT;          op = OP_DEFAULT;
         mparse_options = MPARSE_SO;  
   
         while (-1 != (ch = getopt(argc, argv, "aC:d:nQT:tu:vW")))          while (-1 != (ch = getopt(argc, argv, "aC:d:nQT:tu:vW")))
                 switch (ch) {                  switch (ch) {
Line 818  mlink_add(struct mlink *mlink, const struct stat *st)
Line 821  mlink_add(struct mlink *mlink, const struct stat *st)
         } else          } else
                 mlink->next = mpage->mlinks;                  mlink->next = mpage->mlinks;
         mpage->mlinks = mlink;          mpage->mlinks = mlink;
           mlink->mpage = mpage;
 }  }
   
 static void  static void
Line 960  mpages_merge(struct mchars *mc, struct mparse *mp)
Line 964  mpages_merge(struct mchars *mc, struct mparse *mp)
 {  {
         char                     any[] = "any";          char                     any[] = "any";
         struct ohash_info        str_info;          struct ohash_info        str_info;
         struct mpage            *mpage;          struct mpage            *mpage, *mpage_dest;
         struct mlink            *mlink;          struct mlink            *mlink, *mlink_dest;
         struct mdoc             *mdoc;          struct mdoc             *mdoc;
         struct man              *man;          struct man              *man;
           char                    *sodest;
         char                    *cp;          char                    *cp;
         int                      match;          int                      match;
         unsigned int             pslot;          unsigned int             pslot;
Line 999  mpages_merge(struct mchars *mc, struct mparse *mp)
Line 1004  mpages_merge(struct mchars *mc, struct mparse *mp)
                     FORM_CAT != mpage->mlinks->fform) {                      FORM_CAT != mpage->mlinks->fform) {
                         lvl = mparse_readfd(mp, -1, mpage->mlinks->file);                          lvl = mparse_readfd(mp, -1, mpage->mlinks->file);
                         if (lvl < MANDOCLEVEL_FATAL)                          if (lvl < MANDOCLEVEL_FATAL)
                                 mparse_result(mp, &mdoc, &man);                                  mparse_result(mp, &mdoc, &man, &sodest);
                 }                  }
   
                 if (NULL != mdoc) {                  if (NULL != sodest) {
                           mlink_dest = ohash_find(&mlinks,
                               ohash_qlookup(&mlinks, sodest));
                           if (NULL != mlink_dest) {
   
                                   /* The .so target exists. */
   
                                   mpage_dest = mlink_dest->mpage;
                                   mlink = mpage->mlinks;
                                   while (1) {
                                           mlink->mpage = mpage_dest;
   
                                           /*
                                            * If the target was already
                                            * processed, add the links
                                            * to the database now.
                                            * Otherwise, this will
                                            * happen when we come
                                            * to the target.
                                            */
   
                                           if (mpage_dest->recno)
                                                   dbadd_mlink(mlink);
   
                                           if (NULL == mlink->next)
                                                   break;
                                           mlink = mlink->next;
                                   }
   
                                   /* Move all links to the target. */
   
                                   mlink->next = mlink_dest->next;
                                   mlink_dest->next = mpage->mlinks;
                                   mpage->mlinks = NULL;
                           }
                           ohash_delete(&strings);
                           mpage = ohash_next(&mpages, &pslot);
                           continue;
                   } else if (NULL != mdoc) {
                         mpage->form = FORM_SRC;                          mpage->form = FORM_SRC;
                         mpage->sec =                          mpage->sec =
                             mandoc_strdup(mdoc_meta(mdoc)->msec);                              mandoc_strdup(mdoc_meta(mdoc)->msec);
Line 1220  static void
Line 1263  static void
 parse_man(struct mpage *mpage, const struct man_node *n)  parse_man(struct mpage *mpage, const struct man_node *n)
 {  {
         const struct man_node *head, *body;          const struct man_node *head, *body;
         char            *start, *sv, *title;          char            *start, *title;
         char             byte;          char             byte;
         size_t           sz, titlesz;          size_t           sz;
   
         if (NULL == n)          if (NULL == n)
                 return;                  return;
Line 1242  parse_man(struct mpage *mpage, const struct man_node *
Line 1285  parse_man(struct mpage *mpage, const struct man_node *
                                 NULL != (head = (head->child)) &&                                  NULL != (head = (head->child)) &&
                                 MAN_TEXT == head->type &&                                  MAN_TEXT == head->type &&
                                 0 == strcmp(head->string, "NAME") &&                                  0 == strcmp(head->string, "NAME") &&
                                 NULL != (body = body->child) &&                                  NULL != body->child) {
                                 MAN_TEXT == body->type) {  
   
                         title = NULL;  
                         titlesz = 0;  
   
                         /*                          /*
                          * Suck the entire NAME section into memory.                           * Suck the entire NAME section into memory.
                          * Yes, we might run away.                           * Yes, we might run away.
Line 1255  parse_man(struct mpage *mpage, const struct man_node *
Line 1294  parse_man(struct mpage *mpage, const struct man_node *
                          * NAME sections over many lines.                           * NAME sections over many lines.
                          */                           */
   
                         for ( ; NULL != body; body = body->next) {                          title = NULL;
                                 if (MAN_TEXT != body->type)                          man_deroff(&title, body);
                                         break;  
                                 if (0 == (sz = strlen(body->string)))  
                                         continue;  
                                 title = mandoc_realloc  
                                         (title, titlesz + sz + 1);  
                                 memcpy(title + titlesz, body->string, sz);  
                                 titlesz += sz + 1;  
                                 title[titlesz - 1] = ' ';  
                         }  
                         if (NULL == title)                          if (NULL == title)
                                 return;                                  return;
   
                         title = mandoc_realloc(title, titlesz + 1);  
                         title[titlesz] = '\0';  
   
                         /* Skip leading space.  */  
   
                         sv = title;  
                         while (isspace((unsigned char)*sv))  
                                 sv++;  
   
                         if (0 == (sz = strlen(sv))) {  
                                 free(title);  
                                 return;  
                         }  
   
                         /* Erase trailing space. */  
   
                         start = &sv[sz - 1];  
                         while (start > sv && isspace((unsigned char)*start))  
                                 *start-- = '\0';  
   
                         if (start == sv) {  
                                 free(title);  
                                 return;  
                         }  
   
                         start = sv;  
   
                         /*                          /*
                          * Go through a special heuristic dance here.                           * Go through a special heuristic dance here.
                          * Conventionally, one or more manual names are                           * Conventionally, one or more manual names are
Line 1304  parse_man(struct mpage *mpage, const struct man_node *
Line 1307  parse_man(struct mpage *mpage, const struct man_node *
                          * the name parts here.                           * the name parts here.
                          */                           */
   
                           start = title;
                         for ( ;; ) {                          for ( ;; ) {
                                 sz = strcspn(start, " ,");                                  sz = strcspn(start, " ,");
                                 if ('\0' == start[sz])                                  if ('\0' == start[sz])
Line 1334  parse_man(struct mpage *mpage, const struct man_node *
Line 1338  parse_man(struct mpage *mpage, const struct man_node *
                                         start++;                                          start++;
                         }                          }
   
                         if (sv == start) {                          if (start == title) {
                                 putkey(mpage, start, TYPE_Nm);                                  putkey(mpage, start, TYPE_Nm);
                                 free(title);                                  free(title);
                                 return;                                  return;
Line 1493  parse_mdoc_Xr(struct mpage *mpage, const struct mdoc_n
Line 1497  parse_mdoc_Xr(struct mpage *mpage, const struct mdoc_n
                 return(0);                  return(0);
         }          }
   
         if (-1 == asprintf(&cp, "%s(%s)", n->string, n->next->string)) {          mandoc_asprintf(&cp, "%s(%s)", n->string, n->next->string);
                 perror(NULL);  
                 exit((int)MANDOCLEVEL_SYSERR);  
         }  
         putkey(mpage, cp, TYPE_Xr);          putkey(mpage, cp, TYPE_Xr);
         free(cp);          free(cp);
         return(0);          return(0);
Line 1505  parse_mdoc_Xr(struct mpage *mpage, const struct mdoc_n
Line 1506  parse_mdoc_Xr(struct mpage *mpage, const struct mdoc_n
 static int  static int
 parse_mdoc_Nd(struct mpage *mpage, const struct mdoc_node *n)  parse_mdoc_Nd(struct mpage *mpage, const struct mdoc_node *n)
 {  {
         size_t           sz;  
   
         if (MDOC_BODY != n->type)          if (MDOC_BODY == n->type)
                 return(0);                  mdoc_deroff(&mpage->desc, n);
           return(0);
         /*  
          * Special-case the `Nd' because we need to put the description  
          * into the document table.  
          */  
   
         for (n = n->child; NULL != n; n = n->next) {  
                 if (MDOC_TEXT == n->type) {  
                         if (NULL != mpage->desc) {  
                                 sz = strlen(mpage->desc) +  
                                      strlen(n->string) + 2;  
                                 mpage->desc = mandoc_realloc(  
                                     mpage->desc, sz);  
                                 strlcat(mpage->desc, " ", sz);  
                                 strlcat(mpage->desc, n->string, sz);  
                         } else  
                                 mpage->desc = mandoc_strdup(n->string);  
                 }  
                 if (NULL != n->child)  
                         parse_mdoc_Nd(mpage, n);  
         }  
         return(1);  
 }  }
   
 static int  static int
Line 1779  render_key(struct mchars *mc, struct str *key)
Line 1758  render_key(struct mchars *mc, struct str *key)
         key->rendered = buf;          key->rendered = buf;
 }  }
   
   static void
   dbadd_mlink(const struct mlink *mlink)
   {
           size_t           i;
   
           i = 1;
           SQL_BIND_TEXT(stmts[STMT_INSERT_LINK], i, mlink->dsec);
           SQL_BIND_TEXT(stmts[STMT_INSERT_LINK], i, mlink->arch);
           SQL_BIND_TEXT(stmts[STMT_INSERT_LINK], i, mlink->name);
           SQL_BIND_INT64(stmts[STMT_INSERT_LINK], i, mlink->mpage->recno);
           SQL_STEP(stmts[STMT_INSERT_LINK]);
           sqlite3_reset(stmts[STMT_INSERT_LINK]);
   }
   
 /*  /*
  * Flush the current page's terms (and their bits) into the database.   * Flush the current page's terms (and their bits) into the database.
  * Wrap the entire set of additions in a transaction to make sqlite be a   * Wrap the entire set of additions in a transaction to make sqlite be a
Line 1786  render_key(struct mchars *mc, struct str *key)
Line 1779  render_key(struct mchars *mc, struct str *key)
  * Also, handle escape sequences at the last possible moment.   * Also, handle escape sequences at the last possible moment.
  */   */
 static void  static void
 dbadd(const struct mpage *mpage, struct mchars *mc)  dbadd(struct mpage *mpage, struct mchars *mc)
 {  {
         struct mlink    *mlink;          struct mlink    *mlink;
         struct str      *key;          struct str      *key;
         int64_t          recno;  
         size_t           i;          size_t           i;
         unsigned int     slot;          unsigned int     slot;
   
Line 1803  dbadd(const struct mpage *mpage, struct mchars *mc)
Line 1795  dbadd(const struct mpage *mpage, struct mchars *mc)
         i = 1;          i = 1;
         SQL_BIND_INT(stmts[STMT_INSERT_PAGE], i, FORM_SRC == mpage->form);          SQL_BIND_INT(stmts[STMT_INSERT_PAGE], i, FORM_SRC == mpage->form);
         SQL_STEP(stmts[STMT_INSERT_PAGE]);          SQL_STEP(stmts[STMT_INSERT_PAGE]);
         recno = sqlite3_last_insert_rowid(db);          mpage->recno = sqlite3_last_insert_rowid(db);
         sqlite3_reset(stmts[STMT_INSERT_PAGE]);          sqlite3_reset(stmts[STMT_INSERT_PAGE]);
   
         for (mlink = mpage->mlinks; mlink; mlink = mlink->next) {          for (mlink = mpage->mlinks; mlink; mlink = mlink->next)
                 i = 1;                  dbadd_mlink(mlink);
                 SQL_BIND_TEXT(stmts[STMT_INSERT_LINK], i, mlink->dsec);  
                 SQL_BIND_TEXT(stmts[STMT_INSERT_LINK], i, mlink->arch);  
                 SQL_BIND_TEXT(stmts[STMT_INSERT_LINK], i, mlink->name);  
                 SQL_BIND_INT64(stmts[STMT_INSERT_LINK], i, recno);  
                 SQL_STEP(stmts[STMT_INSERT_LINK]);  
                 sqlite3_reset(stmts[STMT_INSERT_LINK]);  
         }  
   
         for (key = ohash_first(&strings, &slot); NULL != key;          for (key = ohash_first(&strings, &slot); NULL != key;
              key = ohash_next(&strings, &slot)) {               key = ohash_next(&strings, &slot)) {
Line 1824  dbadd(const struct mpage *mpage, struct mchars *mc)
Line 1809  dbadd(const struct mpage *mpage, struct mchars *mc)
                 i = 1;                  i = 1;
                 SQL_BIND_INT64(stmts[STMT_INSERT_KEY], i, key->mask);                  SQL_BIND_INT64(stmts[STMT_INSERT_KEY], i, key->mask);
                 SQL_BIND_TEXT(stmts[STMT_INSERT_KEY], i, key->rendered);                  SQL_BIND_TEXT(stmts[STMT_INSERT_KEY], i, key->rendered);
                 SQL_BIND_INT64(stmts[STMT_INSERT_KEY], i, recno);                  SQL_BIND_INT64(stmts[STMT_INSERT_KEY], i, mpage->recno);
                 SQL_STEP(stmts[STMT_INSERT_KEY]);                  SQL_STEP(stmts[STMT_INSERT_KEY]);
                 sqlite3_reset(stmts[STMT_INSERT_KEY]);                  sqlite3_reset(stmts[STMT_INSERT_KEY]);
                 if (key->rendered != key->key)                  if (key->rendered != key->key)

Legend:
Removed from v.1.116  
changed lines
  Added in v.1.122

CVSweb