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

Diff for /mandoc/mandocdb.c between version 1.164 and 1.171

version 1.164, 2014/09/07 03:08:47 version 1.171, 2014/11/27 01:58:21
Line 138  struct mdoc_handler {
Line 138  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 169  static void  putmdockey(const struct mpage *,
Line 170  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 315  static const struct mdoc_handler mdocs[MDOC_MAX] = {
Line 316  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 426  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 438  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 504  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 526  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 1082  mpages_merge(struct mchars *mc, struct mparse *mp)
Line 1084  mpages_merge(struct mchars *mc, struct mparse *mp)
         struct man              *man;          struct man              *man;
         char                    *sodest;          char                    *sodest;
         char                    *cp;          char                    *cp;
         pid_t                    child_pid;  
         int                      fd;          int                      fd;
         unsigned int             pslot;          unsigned int             pslot;
         enum mandoclevel         lvl;          enum mandoclevel         lvl;
Line 1092  mpages_merge(struct mchars *mc, struct mparse *mp)
Line 1093  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 1110  mpages_merge(struct mchars *mc, struct mparse *mp)
Line 1111  mpages_merge(struct mchars *mc, struct mparse *mp)
                 mdoc = NULL;                  mdoc = NULL;
                 man = NULL;                  man = NULL;
                 sodest = NULL;                  sodest = NULL;
                 child_pid = 0;  
   
                 mparse_open(mp, &fd, mpage->mlinks->file, &child_pid);                  mparse_open(mp, &fd, mpage->mlinks->file);
                 if (fd == -1) {                  if (fd == -1) {
                         say(mpage->mlinks->file, "&open");                          say(mpage->mlinks->file, "&open");
                         goto nextpage;                          goto nextpage;
Line 1123  mpages_merge(struct mchars *mc, struct mparse *mp)
Line 1123  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, 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 1152  mpages_merge(struct mchars *mc, struct mparse *mp)
Line 1158  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 1166  mpages_merge(struct mchars *mc, struct mparse *mp)
Line 1172  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 1193  mpages_merge(struct mchars *mc, struct mparse *mp)
Line 1199  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);
                 if (*mpage->arch != '\0')                  if (*mpage->arch != '\0')
                         putkey(mpage, mpage->arch, TYPE_arch);                          putkey(mpage, mpage->arch, TYPE_arch);
Line 1229  mpages_merge(struct mchars *mc, struct mparse *mp)
Line 1233  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) {
                     mparse_wait(mp, child_pid) != MANDOCLEVEL_OK) {  
                         exitcode = (int)MANDOCLEVEL_SYSERR;                          exitcode = (int)MANDOCLEVEL_SYSERR;
                         say(mpage->mlinks->file, "&wait gunzip");                          say(mpage->mlinks->file, "&wait gunzip");
                 }                  }
Line 1727  putkeys(const struct mpage *mpage,
Line 1730  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 1902  render_key(struct mchars *mc, struct str *key)
Line 1906  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 1942  dbadd_mlink(const struct mlink *mlink)
Line 1946  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 2343  hash_free(void *p, void *arg)
Line 2355  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 2396  set_basedir(const char *targetdir)
Line 2408  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.164  
changed lines
  Added in v.1.171

CVSweb