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

Diff for /mandoc/mandocdb.c between version 1.161 and 1.173

version 1.161, 2014/09/03 18:09:14 version 1.173, 2014/12/04 18:31:20
Line 1 
Line 1 
 /*      $OpenBSD$ */  /*      $Id$ */
 /*  /*
  * Copyright (c) 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>   * Copyright (c) 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2011, 2012, 2013, 2014 Ingo Schwarze <schwarze@openbsd.org>   * Copyright (c) 2011, 2012, 2013, 2014 Ingo Schwarze <schwarze@openbsd.org>
Line 17 
Line 17 
  */   */
 #include "config.h"  #include "config.h"
   
 #include <sys/stat.h>  
 #include <sys/types.h>  #include <sys/types.h>
   #include <sys/stat.h>
 #include <sys/wait.h>  #include <sys/wait.h>
   
 #include <assert.h>  #include <assert.h>
Line 128  enum stmt {
Line 128  enum stmt {
         STMT__MAX          STMT__MAX
 };  };
   
 typedef int (*mdoc_fp)(struct mpage *, const struct mdoc_node *);  typedef int (*mdoc_fp)(struct mpage *, const struct mdoc_meta *,
                           const struct mdoc_node *);
   
 struct  mdoc_handler {  struct  mdoc_handler {
         mdoc_fp          fp; /* optional handler */          mdoc_fp          fp; /* optional handler */
Line 138  struct mdoc_handler {
Line 139  struct mdoc_handler {
 static  void     dbclose(int);  static  void     dbclose(int);
 static  void     dbadd(struct mpage *, struct mchars *);  static  void     dbadd(struct mpage *, struct mchars *);
 static  void     dbadd_mlink(const struct mlink *mlink);  static  void     dbadd_mlink(const struct mlink *mlink);
   static  void     dbadd_mlink_name(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 153  static void  mpages_merge(struct mchars *, struct mpar
Line 155  static void  mpages_merge(struct mchars *, struct mpar
 static  void     names_check(void);  static  void     names_check(void);
 static  void     parse_cat(struct mpage *, int);  static  void     parse_cat(struct mpage *, int);
 static  void     parse_man(struct mpage *, const struct man_node *);  static  void     parse_man(struct mpage *, const struct man_node *);
 static  void     parse_mdoc(struct mpage *, const struct mdoc_node *);  static  void     parse_mdoc(struct mpage *, const struct mdoc_meta *,
 static  int      parse_mdoc_body(struct mpage *, const struct mdoc_node *);                          const struct mdoc_node *);
 static  int      parse_mdoc_head(struct mpage *, const struct mdoc_node *);  static  int      parse_mdoc_body(struct mpage *, const struct mdoc_meta *,
 static  int      parse_mdoc_Fd(struct mpage *, const struct mdoc_node *);                          const struct mdoc_node *);
 static  int      parse_mdoc_Fn(struct mpage *, const struct mdoc_node *);  static  int      parse_mdoc_head(struct mpage *, const struct mdoc_meta *,
 static  int      parse_mdoc_Nd(struct mpage *, const struct mdoc_node *);                          const struct mdoc_node *);
 static  int      parse_mdoc_Nm(struct mpage *, const struct mdoc_node *);  static  int      parse_mdoc_Fd(struct mpage *, const struct mdoc_meta *,
 static  int      parse_mdoc_Sh(struct mpage *, const struct mdoc_node *);                          const struct mdoc_node *);
 static  int      parse_mdoc_Xr(struct mpage *, const struct mdoc_node *);  static  int      parse_mdoc_Fn(struct mpage *, const struct mdoc_meta *,
                           const struct mdoc_node *);
   static  int      parse_mdoc_Fo(struct mpage *, const struct mdoc_meta *,
                           const struct mdoc_node *);
   static  int      parse_mdoc_Nd(struct mpage *, const struct mdoc_meta *,
                           const struct mdoc_node *);
   static  int      parse_mdoc_Nm(struct mpage *, const struct mdoc_meta *,
                           const struct mdoc_node *);
   static  int      parse_mdoc_Sh(struct mpage *, const struct mdoc_meta *,
                           const struct mdoc_node *);
   static  int      parse_mdoc_Xr(struct mpage *, const struct mdoc_meta *,
                           const struct mdoc_node *);
 static  void     putkey(const struct mpage *, char *, uint64_t);  static  void     putkey(const struct mpage *, char *, uint64_t);
 static  void     putkeys(const struct mpage *,  static  void     putkeys(const struct mpage *,
                         const char *, size_t, uint64_t);                          const char *, size_t, uint64_t);
Line 169  static void  putmdockey(const struct mpage *,
Line 182  static void  putmdockey(const struct mpage *,
                         const struct mdoc_node *, uint64_t);                          const struct mdoc_node *, uint64_t);
 static  void     render_key(struct mchars *, struct str *);  static  void     render_key(struct mchars *, struct str *);
 static  void     say(const char *, const char *, ...);  static  void     say(const char *, const char *, ...);
 static  int      set_basedir(const char *);  static  int      set_basedir(const char *, int);
 static  int      treescan(void);  static  int      treescan(void);
 static  size_t   utf8(unsigned int, char [7]);  static  size_t   utf8(unsigned int, char [7]);
   
Line 289  static const struct mdoc_handler mdocs[MDOC_MAX] = {
Line 302  static const struct mdoc_handler mdocs[MDOC_MAX] = {
         { NULL, 0 },  /* Ux */          { NULL, 0 },  /* Ux */
         { NULL, 0 },  /* Xc */          { NULL, 0 },  /* Xc */
         { NULL, 0 },  /* Xo */          { NULL, 0 },  /* Xo */
         { parse_mdoc_head, 0 },  /* Fo */          { parse_mdoc_Fo, 0 },  /* Fo */
         { NULL, 0 },  /* Fc */          { NULL, 0 },  /* Fc */
         { NULL, 0 },  /* Oo */          { NULL, 0 },  /* Oo */
         { NULL, 0 },  /* Oc */          { NULL, 0 },  /* Oc */
Line 315  static const struct mdoc_handler mdocs[MDOC_MAX] = {
Line 328  static const struct mdoc_handler mdocs[MDOC_MAX] = {
         { NULL, 0 },  /* sp */          { NULL, 0 },  /* sp */
         { NULL, 0 },  /* %U */          { NULL, 0 },  /* %U */
         { NULL, 0 },  /* Ta */          { NULL, 0 },  /* Ta */
           { NULL, 0 },  /* ll */
 };  };
   
   
Line 424  main(int argc, char *argv[])
Line 438  main(int argc, char *argv[])
         }          }
   
         exitcode = (int)MANDOCLEVEL_OK;          exitcode = (int)MANDOCLEVEL_OK;
         mp = mparse_alloc(mparse_options, MANDOCLEVEL_FATAL, NULL, NULL);  
         mc = mchars_alloc();          mc = mchars_alloc();
           mp = mparse_alloc(mparse_options, MANDOCLEVEL_FATAL, NULL,
               mc, NULL);
         ohash_init(&mpages, 6, &mpages_info);          ohash_init(&mpages, 6, &mpages_info);
         ohash_init(&mlinks, 6, &mlinks_info);          ohash_init(&mlinks, 6, &mlinks_info);
   
Line 436  main(int argc, char *argv[])
Line 450  main(int argc, char *argv[])
                  * Most of these deal with a specific directory.                   * Most of these deal with a specific directory.
                  * Jump into that directory first.                   * Jump into that directory first.
                  */                   */
                 if (OP_TEST != op && 0 == set_basedir(path_arg))                  if (OP_TEST != op && 0 == set_basedir(path_arg, 1))
                         goto out;                          goto out;
   
                 if (dbopen(1)) {                  if (dbopen(1)) {
Line 502  main(int argc, char *argv[])
Line 516  main(int argc, char *argv[])
                                 ohash_init(&mlinks, 6, &mlinks_info);                                  ohash_init(&mlinks, 6, &mlinks_info);
                         }                          }
   
                         if (0 == set_basedir(dirs.paths[j]))                          if (0 == set_basedir(dirs.paths[j], argc > 0))
                                 goto out;                                  continue;
                         if (0 == treescan())                          if (0 == treescan())
                                 goto out;                                  continue;
                         if (0 == dbopen(0))                          if (0 == dbopen(0))
                                 goto out;                                  continue;
   
                         mpages_merge(mc, mp);                          mpages_merge(mc, mp);
                         if (warnings && !nodb &&                          if (warnings && !nodb &&
Line 524  main(int argc, char *argv[])
Line 538  main(int argc, char *argv[])
         }          }
 out:  out:
         manpath_free(&dirs);          manpath_free(&dirs);
         mchars_free(mc);  
         mparse_free(mp);          mparse_free(mp);
           mchars_free(mc);
         mpages_free();          mpages_free();
         ohash_delete(&mpages);          ohash_delete(&mpages);
         ohash_delete(&mlinks);          ohash_delete(&mlinks);
Line 1076  mpages_merge(struct mchars *mc, struct mparse *mp)
Line 1090  mpages_merge(struct mchars *mc, struct mparse *mp)
 {  {
         char                     any[] = "any";          char                     any[] = "any";
         struct ohash_info        str_info;          struct ohash_info        str_info;
         int                      fd[2];  
         struct mpage            *mpage, *mpage_dest;          struct mpage            *mpage, *mpage_dest;
         struct mlink            *mlink, *mlink_dest;          struct mlink            *mlink, *mlink_dest;
         struct mdoc             *mdoc;          struct mdoc             *mdoc;
         struct man              *man;          struct man              *man;
         char                    *sodest;          char                    *sodest;
         char                    *cp;          char                    *cp;
         pid_t                    child_pid;          int                      fd;
         int                      status;  
         unsigned int             pslot;          unsigned int             pslot;
         enum mandoclevel         lvl;          enum mandoclevel         lvl;
   
Line 1093  mpages_merge(struct mchars *mc, struct mparse *mp)
Line 1105  mpages_merge(struct mchars *mc, struct mparse *mp)
         str_info.free = hash_free;          str_info.free = hash_free;
         str_info.key_offset = offsetof(struct str, key);          str_info.key_offset = offsetof(struct str, key);
   
         if (0 == nodb)          if ( ! nodb)
                 SQL_EXEC("BEGIN TRANSACTION");                  SQL_EXEC("BEGIN TRANSACTION");
   
         mpage = ohash_first(&mpages, &pslot);          mpage = ohash_first(&mpages, &pslot);
         while (NULL != mpage) {          while (mpage != NULL) {
                 mlinks_undupe(mpage);                  mlinks_undupe(mpage);
                 if (NULL == mpage->mlinks) {                  if (mpage->mlinks == NULL) {
                         mpage = ohash_next(&mpages, &pslot);                          mpage = ohash_next(&mpages, &pslot);
                         continue;                          continue;
                 }                  }
Line 1111  mpages_merge(struct mchars *mc, struct mparse *mp)
Line 1123  mpages_merge(struct mchars *mc, struct mparse *mp)
                 mdoc = NULL;                  mdoc = NULL;
                 man = NULL;                  man = NULL;
                 sodest = NULL;                  sodest = NULL;
                 child_pid = 0;  
                 fd[0] = -1;  
                 fd[1] = -1;  
   
                 if (mpage->mlinks->gzip) {                  mparse_open(mp, &fd, mpage->mlinks->file);
                         if (-1 == pipe(fd)) {                  if (fd == -1) {
                                 exitcode = (int)MANDOCLEVEL_SYSERR;                          say(mpage->mlinks->file, "&open");
                                 say(mpage->mlinks->file, "&pipe gunzip");                          goto nextpage;
                                 goto nextpage;  
                         }  
                         switch (child_pid = fork()) {  
                         case -1:  
                                 exitcode = (int)MANDOCLEVEL_SYSERR;  
                                 say(mpage->mlinks->file, "&fork gunzip");  
                                 child_pid = 0;  
                                 close(fd[1]);  
                                 close(fd[0]);  
                                 goto nextpage;  
                         case 0:  
                                 close(fd[0]);  
                                 if (-1 == dup2(fd[1], STDOUT_FILENO)) {  
                                         say(mpage->mlinks->file,  
                                             "&dup gunzip");  
                                         exit(1);  
                                 }  
                                 execlp("gunzip", "gunzip", "-c",  
                                     mpage->mlinks->file, NULL);  
                                 say(mpage->mlinks->file, "&exec gunzip");  
                                 exit(1);  
                         default:  
                                 close(fd[1]);  
                                 break;  
                         }  
                 }                  }
   
                 /*                  /*
Line 1151  mpages_merge(struct mchars *mc, struct mparse *mp)
Line 1135  mpages_merge(struct mchars *mc, struct mparse *mp)
                  * source code, unless it is already known to be                   * source code, unless it is already known to be
                  * formatted.  Fall back to formatted mode.                   * formatted.  Fall back to formatted mode.
                  */                   */
                 if (FORM_CAT != mpage->mlinks->dform ||                  if (mpage->mlinks->dform != FORM_CAT ||
                     FORM_CAT != mpage->mlinks->fform) {                      mpage->mlinks->fform != FORM_CAT) {
                         lvl = mparse_readfd(mp, fd[0], mpage->mlinks->file);                          lvl = mparse_readfd(mp, fd, mpage->mlinks->file);
                         if (lvl < MANDOCLEVEL_FATAL)                          if (lvl < MANDOCLEVEL_FATAL)
                                 mparse_result(mp, &mdoc, &man, &sodest);                                  mparse_result(mp, &mdoc, &man, &sodest);
                 }                  }
   
                 if (NULL != sodest) {                  if (sodest != NULL) {
                         mlink_dest = ohash_find(&mlinks,                          mlink_dest = ohash_find(&mlinks,
                             ohash_qlookup(&mlinks, sodest));                              ohash_qlookup(&mlinks, sodest));
                         if (NULL != mlink_dest) {                          if (mlink_dest == NULL) {
                                   mandoc_asprintf(&cp, "%s.gz", sodest);
                                   mlink_dest = ohash_find(&mlinks,
                                       ohash_qlookup(&mlinks, cp));
                                   free(cp);
                           }
                           if (mlink_dest != NULL) {
   
                                 /* The .so target exists. */                                  /* The .so target exists. */
   
Line 1180  mpages_merge(struct mchars *mc, struct mparse *mp)
Line 1170  mpages_merge(struct mchars *mc, struct mparse *mp)
                                          */                                           */
   
                                         if (mpage_dest->pageid)                                          if (mpage_dest->pageid)
                                                 dbadd_mlink(mlink);                                                  dbadd_mlink_name(mlink);
   
                                         if (NULL == mlink->next)                                          if (mlink->next == NULL)
                                                 break;                                                  break;
                                         mlink = mlink->next;                                          mlink = mlink->next;
                                 }                                  }
Line 1194  mpages_merge(struct mchars *mc, struct mparse *mp)
Line 1184  mpages_merge(struct mchars *mc, struct mparse *mp)
                                 mpage->mlinks = NULL;                                  mpage->mlinks = NULL;
                         }                          }
                         goto nextpage;                          goto nextpage;
                 } else if (NULL != mdoc) {                  } else if (mdoc != NULL) {
                         mpage->form = FORM_SRC;                          mpage->form = FORM_SRC;
                         mpage->sec = mdoc_meta(mdoc)->msec;                          mpage->sec = mdoc_meta(mdoc)->msec;
                         mpage->sec = mandoc_strdup(                          mpage->sec = mandoc_strdup(
                             NULL == mpage->sec ? "" : mpage->sec);                              mpage->sec == NULL ? "" : mpage->sec);
                         mpage->arch = mdoc_meta(mdoc)->arch;                          mpage->arch = mdoc_meta(mdoc)->arch;
                         mpage->arch = mandoc_strdup(                          mpage->arch = mandoc_strdup(
                             NULL == mpage->arch ? "" : mpage->arch);                              mpage->arch == NULL ? "" : mpage->arch);
                         mpage->title =                          mpage->title =
                             mandoc_strdup(mdoc_meta(mdoc)->title);                              mandoc_strdup(mdoc_meta(mdoc)->title);
                 } else if (NULL != man) {                  } else if (man != NULL) {
                         mpage->form = FORM_SRC;                          mpage->form = FORM_SRC;
                         mpage->sec =                          mpage->sec =
                             mandoc_strdup(man_meta(man)->msec);                              mandoc_strdup(man_meta(man)->msec);
Line 1221  mpages_merge(struct mchars *mc, struct mparse *mp)
Line 1211  mpages_merge(struct mchars *mc, struct mparse *mp)
                         mpage->title =                          mpage->title =
                             mandoc_strdup(mpage->mlinks->name);                              mandoc_strdup(mpage->mlinks->name);
                 }                  }
                 if (mpage->mlinks->gzip)  
                         mpage->form |= FORM_GZ;  
                 putkey(mpage, mpage->sec, TYPE_sec);                  putkey(mpage, mpage->sec, TYPE_sec);
                 putkey(mpage, '\0' == *mpage->arch ?                  if (*mpage->arch != '\0')
                     any : mpage->arch, TYPE_arch);                          putkey(mpage, mpage->arch, TYPE_arch);
   
                 for (mlink = mpage->mlinks; mlink; mlink = mlink->next) {                  for (mlink = mpage->mlinks; mlink; mlink = mlink->next) {
                         if ('\0' != *mlink->dsec)                          if ('\0' != *mlink->dsec)
Line 1241  mpages_merge(struct mchars *mc, struct mparse *mp)
Line 1229  mpages_merge(struct mchars *mc, struct mparse *mp)
                 if (NULL != mdoc) {                  if (NULL != mdoc) {
                         if (NULL != (cp = mdoc_meta(mdoc)->name))                          if (NULL != (cp = mdoc_meta(mdoc)->name))
                                 putkey(mpage, cp, NAME_HEAD);                                  putkey(mpage, cp, NAME_HEAD);
                         parse_mdoc(mpage, mdoc_node(mdoc));                          parse_mdoc(mpage, mdoc_meta(mdoc), mdoc_node(mdoc));
                 } else if (NULL != man)                  } else if (NULL != man)
                         parse_man(mpage, man_node(man));                          parse_man(mpage, man_node(man));
                 else                  else
                         parse_cat(mpage, fd[0]);                          parse_cat(mpage, fd);
                 if (NULL == mpage->desc)                  if (NULL == mpage->desc)
                         mpage->desc = mandoc_strdup(mpage->mlinks->name);                          mpage->desc = mandoc_strdup(mpage->mlinks->name);
   
Line 1257  mpages_merge(struct mchars *mc, struct mparse *mp)
Line 1245  mpages_merge(struct mchars *mc, struct mparse *mp)
                 dbadd(mpage, mc);                  dbadd(mpage, mc);
   
 nextpage:  nextpage:
                 if (child_pid) {                  if (mparse_wait(mp) != MANDOCLEVEL_OK) {
                         if (-1 == waitpid(child_pid, &status, 0)) {                          exitcode = (int)MANDOCLEVEL_SYSERR;
                                 exitcode = (int)MANDOCLEVEL_SYSERR;                          say(mpage->mlinks->file, "&wait gunzip");
                                 say(mpage->mlinks->file, "&wait gunzip");  
                         } else if (WIFSIGNALED(status)) {  
                                 exitcode = (int)MANDOCLEVEL_SYSERR;  
                                 say(mpage->mlinks->file,  
                                     "gunzip died from signal %d",  
                                     WTERMSIG(status));  
                         } else if (WEXITSTATUS(status)) {  
                                 exitcode = (int)MANDOCLEVEL_SYSERR;  
                                 say(mpage->mlinks->file,  
                                     "gunzip failed with code %d",  
                                     WEXITSTATUS(status));  
                         }  
                 }                  }
                 ohash_delete(&strings);                  ohash_delete(&strings);
                 ohash_delete(&names);                  ohash_delete(&names);
Line 1578  parse_man(struct mpage *mpage, const struct man_node *
Line 1554  parse_man(struct mpage *mpage, const struct man_node *
 }  }
   
 static void  static void
 parse_mdoc(struct mpage *mpage, const struct mdoc_node *n)  parse_mdoc(struct mpage *mpage, const struct mdoc_meta *meta,
           const struct mdoc_node *n)
 {  {
   
         assert(NULL != n);          assert(NULL != n);
Line 1594  parse_mdoc(struct mpage *mpage, const struct mdoc_node
Line 1571  parse_mdoc(struct mpage *mpage, const struct mdoc_node
                         /* FALLTHROUGH */                          /* FALLTHROUGH */
                 case MDOC_TAIL:                  case MDOC_TAIL:
                         if (NULL != mdocs[n->tok].fp)                          if (NULL != mdocs[n->tok].fp)
                                if (0 == (*mdocs[n->tok].fp)(mpage, n))                                 if (0 == (*mdocs[n->tok].fp)(mpage, meta, n))
                                        break;                                         break;
                         if (mdocs[n->tok].mask)                          if (mdocs[n->tok].mask)
                                 putmdockey(mpage, n->child,                                  putmdockey(mpage, n->child,
Line 1605  parse_mdoc(struct mpage *mpage, const struct mdoc_node
Line 1582  parse_mdoc(struct mpage *mpage, const struct mdoc_node
                         continue;                          continue;
                 }                  }
                 if (NULL != n->child)                  if (NULL != n->child)
                         parse_mdoc(mpage, n);                          parse_mdoc(mpage, meta, n);
         }          }
 }  }
   
 static int  static int
 parse_mdoc_Fd(struct mpage *mpage, const struct mdoc_node *n)  parse_mdoc_Fd(struct mpage *mpage, const struct mdoc_meta *meta,
           const struct mdoc_node *n)
 {  {
         const char      *start, *end;          const char      *start, *end;
         size_t           sz;          size_t           sz;
Line 1653  parse_mdoc_Fd(struct mpage *mpage, const struct mdoc_n
Line 1631  parse_mdoc_Fd(struct mpage *mpage, const struct mdoc_n
 }  }
   
 static int  static int
 parse_mdoc_Fn(struct mpage *mpage, const struct mdoc_node *n)  parse_mdoc_Fn(struct mpage *mpage, const struct mdoc_meta *meta,
           const struct mdoc_node *n)
 {  {
         char    *cp;          char    *cp;
   
Line 1674  parse_mdoc_Fn(struct mpage *mpage, const struct mdoc_n
Line 1653  parse_mdoc_Fn(struct mpage *mpage, const struct mdoc_n
                 cp++;                  cp++;
   
         putkey(mpage, cp, TYPE_Fn);          putkey(mpage, cp, TYPE_Fn);
           if (n->sec == SEC_SYNOPSIS)
                   putkey(mpage, cp, NAME_SYN);
   
         if (n->string < cp)          if (n->string < cp)
                 putkeys(mpage, n->string, cp - n->string, TYPE_Ft);                  putkeys(mpage, n->string, cp - n->string, TYPE_Ft);
Line 1686  parse_mdoc_Fn(struct mpage *mpage, const struct mdoc_n
Line 1667  parse_mdoc_Fn(struct mpage *mpage, const struct mdoc_n
 }  }
   
 static int  static int
 parse_mdoc_Xr(struct mpage *mpage, const struct mdoc_node *n)  parse_mdoc_Fo(struct mpage *mpage, const struct mdoc_meta *meta,
           const struct mdoc_node *n)
 {  {
   
           putmdockey(mpage, n->child, TYPE_Fn);
           if (n->sec == SEC_SYNOPSIS)
                   putmdockey(mpage, n->child, NAME_SYN);
           return(0);
   }
   
   static int
   parse_mdoc_Xr(struct mpage *mpage, const struct mdoc_meta *meta,
           const struct mdoc_node *n)
   {
         char    *cp;          char    *cp;
   
         if (NULL == (n = n->child))          if (NULL == (n = n->child))
Line 1705  parse_mdoc_Xr(struct mpage *mpage, const struct mdoc_n
Line 1698  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_meta *meta,
           const struct mdoc_node *n)
 {  {
   
         if (MDOC_BODY == n->type)          if (MDOC_BODY == n->type)
Line 1714  parse_mdoc_Nd(struct mpage *mpage, const struct mdoc_n
Line 1708  parse_mdoc_Nd(struct mpage *mpage, const struct mdoc_n
 }  }
   
 static int  static int
 parse_mdoc_Nm(struct mpage *mpage, const struct mdoc_node *n)  parse_mdoc_Nm(struct mpage *mpage, const struct mdoc_meta *meta,
           const struct mdoc_node *n)
 {  {
   
         if (SEC_NAME == n->sec)          if (SEC_NAME == n->sec)
                 putmdockey(mpage, n->child, NAME_TITLE);                  putmdockey(mpage, n->child, NAME_TITLE);
         else if (SEC_SYNOPSIS == n->sec && MDOC_HEAD == n->type)          else if (SEC_SYNOPSIS == n->sec && MDOC_HEAD == n->type) {
                 putmdockey(mpage, n->child, NAME_SYN);                  if (n->child == NULL)
                           putkey(mpage, meta->name, NAME_SYN);
                   else
                           putmdockey(mpage, n->child, NAME_SYN);
           }
         return(0);          return(0);
 }  }
   
 static int  static int
 parse_mdoc_Sh(struct mpage *mpage, const struct mdoc_node *n)  parse_mdoc_Sh(struct mpage *mpage, const struct mdoc_meta *meta,
           const struct mdoc_node *n)
 {  {
   
         return(SEC_CUSTOM == n->sec && MDOC_HEAD == n->type);          return(SEC_CUSTOM == n->sec && MDOC_HEAD == n->type);
 }  }
   
 static int  static int
 parse_mdoc_head(struct mpage *mpage, const struct mdoc_node *n)  parse_mdoc_head(struct mpage *mpage, const struct mdoc_meta *meta,
           const struct mdoc_node *n)
 {  {
   
         return(MDOC_HEAD == n->type);          return(MDOC_HEAD == n->type);
 }  }
   
 static int  static int
 parse_mdoc_body(struct mpage *mpage, const struct mdoc_node *n)  parse_mdoc_body(struct mpage *mpage, const struct mdoc_meta *meta,
           const struct mdoc_node *n)
 {  {
   
         return(MDOC_BODY == n->type);          return(MDOC_BODY == n->type);
Line 1766  putkeys(const struct mpage *mpage,
Line 1768  putkeys(const struct mpage *mpage,
         if (TYPE_Nm & v) {          if (TYPE_Nm & v) {
                 htab = &names;                  htab = &names;
                 v &= name_mask;                  v &= name_mask;
                 name_mask &= ~NAME_FIRST;                  if (v & NAME_FIRST)
                           name_mask &= ~NAME_FIRST;
                 if (debug > 1)                  if (debug > 1)
                         say(mpage->mlinks->file,                          say(mpage->mlinks->file,
                             "Adding name %*s", sz, cp);                              "Adding name %*s", sz, cp);
Line 1774  putkeys(const struct mpage *mpage,
Line 1777  putkeys(const struct mpage *mpage,
                 htab = &strings;                  htab = &strings;
                 if (debug > 1)                  if (debug > 1)
                     for (i = 0; i < mansearch_keymax; i++)                      for (i = 0; i < mansearch_keymax; i++)
                         if (1 << i & v)                          if ((uint64_t)1 << i & v)
                             say(mpage->mlinks->file,                              say(mpage->mlinks->file,
                                 "Adding key %s=%*s",                                  "Adding key %s=%*s",
                                 mansearch_keynames[i], sz, cp);                                  mansearch_keynames[i], sz, cp);
Line 1941  render_key(struct mchars *mc, struct str *key)
Line 1944  render_key(struct mchars *mc, struct str *key)
                  */                   */
   
                 if (write_utf8) {                  if (write_utf8) {
                         if (0 == (u = mchars_spec2cp(mc, seq, len)))                          if ((u = mchars_spec2cp(mc, seq, len)) <= 0)
                                 continue;                                  continue;
                         cpp = utfbuf;                          cpp = utfbuf;
                         if (0 == (sz = utf8(u, utfbuf)))                          if (0 == (sz = utf8(u, utfbuf)))
Line 1981  dbadd_mlink(const struct mlink *mlink)
Line 1984  dbadd_mlink(const struct mlink *mlink)
         SQL_BIND_INT64(stmts[STMT_INSERT_LINK], i, mlink->mpage->pageid);          SQL_BIND_INT64(stmts[STMT_INSERT_LINK], i, mlink->mpage->pageid);
         SQL_STEP(stmts[STMT_INSERT_LINK]);          SQL_STEP(stmts[STMT_INSERT_LINK]);
         sqlite3_reset(stmts[STMT_INSERT_LINK]);          sqlite3_reset(stmts[STMT_INSERT_LINK]);
   }
   
   static void
   dbadd_mlink_name(const struct mlink *mlink)
   {
           size_t           i;
   
           dbadd_mlink(mlink);
   
         i = 1;          i = 1;
         SQL_BIND_INT64(stmts[STMT_INSERT_NAME], i, NAME_FILE);          SQL_BIND_INT64(stmts[STMT_INSERT_NAME], i, NAME_FILE & NAME_MASK);
         SQL_BIND_TEXT(stmts[STMT_INSERT_NAME], i, mlink->name);          SQL_BIND_TEXT(stmts[STMT_INSERT_NAME], i, mlink->name);
         SQL_BIND_INT64(stmts[STMT_INSERT_NAME], i, mlink->mpage->pageid);          SQL_BIND_INT64(stmts[STMT_INSERT_NAME], i, mlink->mpage->pageid);
         SQL_STEP(stmts[STMT_INSERT_NAME]);          SQL_STEP(stmts[STMT_INSERT_NAME]);
Line 2351  prepare_statements:
Line 2362  prepare_statements:
             "PRAGMA synchronous = OFF", NULL, NULL, NULL)) {              "PRAGMA synchronous = OFF", NULL, NULL, NULL)) {
                 exitcode = (int)MANDOCLEVEL_SYSERR;                  exitcode = (int)MANDOCLEVEL_SYSERR;
                 say(MANDOC_DB, "PRAGMA synchronous: %s",                  say(MANDOC_DB, "PRAGMA synchronous: %s",
                 sqlite3_errmsg(db));                      sqlite3_errmsg(db));
                 sqlite3_close(db);                  sqlite3_close(db);
                 return(0);                  return(0);
         }          }
Line 2382  hash_free(void *p, void *arg)
Line 2393  hash_free(void *p, void *arg)
 }  }
   
 static int  static int
 set_basedir(const char *targetdir)  set_basedir(const char *targetdir, int report_baddir)
 {  {
         static char      startdir[PATH_MAX];          static char      startdir[PATH_MAX];
         static int       getcwd_status;  /* 1 = ok, 2 = failure */          static int       getcwd_status;  /* 1 = ok, 2 = failure */
Line 2435  set_basedir(const char *targetdir)
Line 2446  set_basedir(const char *targetdir)
          * we can reliably check whether files are inside.           * we can reliably check whether files are inside.
          */           */
         if (NULL == realpath(targetdir, basedir)) {          if (NULL == realpath(targetdir, basedir)) {
                 exitcode = (int)MANDOCLEVEL_BADARG;                  if (report_baddir || errno != ENOENT) {
                 say("", "&%s: realpath", targetdir);                          exitcode = (int)MANDOCLEVEL_BADARG;
                           say("", "&%s: realpath", targetdir);
                   }
                 return(0);                  return(0);
         } else if (-1 == chdir(basedir)) {          } else if (-1 == chdir(basedir)) {
                 exitcode = (int)MANDOCLEVEL_BADARG;                  if (report_baddir || errno != ENOENT) {
                 say("", "&chdir");                          exitcode = (int)MANDOCLEVEL_BADARG;
                           say("", "&chdir");
                   }
                 return(0);                  return(0);
         }          }
         chdir_status = 1;          chdir_status = 1;

Legend:
Removed from v.1.161  
changed lines
  Added in v.1.173

CVSweb