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

Diff for /mandoc/mandocdb.c between version 1.129 and 1.132

version 1.129, 2014/04/04 15:55:19 version 1.132, 2014/04/09 21:50:08
Line 147  static void *hash_alloc(size_t, void *);
Line 147  static void *hash_alloc(size_t, void *);
 static  void     hash_free(void *, size_t, void *);  static  void     hash_free(void *, size_t, void *);
 static  void    *hash_halloc(size_t, void *);  static  void    *hash_halloc(size_t, void *);
 static  void     mlink_add(struct mlink *, const struct stat *);  static  void     mlink_add(struct mlink *, const struct stat *);
 static  int      mlink_check(struct mpage *, struct mlink *);  static  void     mlink_check(struct mpage *, struct mlink *);
 static  void     mlink_free(struct mlink *);  static  void     mlink_free(struct mlink *);
 static  void     mlinks_undupe(struct mpage *);  static  void     mlinks_undupe(struct mpage *);
 static  void     mpages_free(void);  static  void     mpages_free(void);
 static  void     mpages_merge(struct mchars *, struct mparse *);  static  void     mpages_merge(struct mchars *, struct mparse *);
   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_node *);
Line 223  static const struct mdoc_handler mdocs[MDOC_MAX] = {
Line 224  static const struct mdoc_handler mdocs[MDOC_MAX] = {
         { NULL, TYPE_Ic },  /* Ic */          { NULL, TYPE_Ic },  /* Ic */
         { NULL, TYPE_In },  /* In */          { NULL, TYPE_In },  /* In */
         { NULL, TYPE_Li },  /* Li */          { NULL, TYPE_Li },  /* Li */
         { parse_mdoc_Nd, TYPE_Nd },  /* Nd */          { parse_mdoc_Nd, 0 },  /* Nd */
         { parse_mdoc_Nm, 0 },  /* Nm */          { parse_mdoc_Nm, 0 },  /* Nm */
         { NULL, 0 },  /* Op */          { NULL, 0 },  /* Op */
         { NULL, 0 },  /* Ot */          { NULL, 0 },  /* Ot */
Line 495  main(int argc, char *argv[])
Line 496  main(int argc, char *argv[])
                                 goto out;                                  goto out;
   
                         mpages_merge(mc, mp);                          mpages_merge(mc, mp);
                           if (warnings &&
                               ! (MPARSE_QUICK & mparse_options))
                                   names_check();
                         dbclose(0);                          dbclose(0);
   
                         if (j + 1 < dirs.sz) {                          if (j + 1 < dirs.sz) {
Line 920  nextlink:
Line 924  nextlink:
         }          }
 }  }
   
 static int  static void
 mlink_check(struct mpage *mpage, struct mlink *mlink)  mlink_check(struct mpage *mpage, struct mlink *mlink)
 {  {
         int      match;          struct str      *str;
           unsigned int     slot;
   
         match = 1;  
   
         /*          /*
          * Check whether the manual section given in a file           * Check whether the manual section given in a file
          * agrees with the directory where the file is located.           * agrees with the directory where the file is located.
Line 937  mlink_check(struct mpage *mpage, struct mlink *mlink)
Line 940  mlink_check(struct mpage *mpage, struct mlink *mlink)
          */           */
   
         if (FORM_SRC == mpage->form &&          if (FORM_SRC == mpage->form &&
             strcasecmp(mpage->sec, mlink->dsec)) {              strcasecmp(mpage->sec, mlink->dsec))
                 match = 0;  
                 say(mlink->file, "Section \"%s\" manual in %s directory",                  say(mlink->file, "Section \"%s\" manual in %s directory",
                     mpage->sec, mlink->dsec);                      mpage->sec, mlink->dsec);
         }  
   
         /*          /*
          * Manual page directories exist for each kernel           * Manual page directories exist for each kernel
Line 956  mlink_check(struct mpage *mpage, struct mlink *mlink)
Line 957  mlink_check(struct mpage *mpage, struct mlink *mlink)
          * on amd64, i386, sparc, and sparc64.           * on amd64, i386, sparc, and sparc64.
          */           */
   
         if (strcasecmp(mpage->arch, mlink->arch)) {          if (strcasecmp(mpage->arch, mlink->arch))
                 match = 0;  
                 say(mlink->file, "Architecture \"%s\" manual in "                  say(mlink->file, "Architecture \"%s\" manual in "
                     "\"%s\" directory", mpage->arch, mlink->arch);                      "\"%s\" directory", mpage->arch, mlink->arch);
         }  
   
         if (strcasecmp(mpage->title, mlink->name))          /*
                 match = 0;           * XXX
            * parse_cat() doesn't set TYPE_Nm and TYPE_NAME yet.
            */
   
         return(match);          if (FORM_CAT == mpage->form)
                   return;
   
           /*
            * Check whether this mlink
            * appears as a name in the NAME section.
            */
   
           slot = ohash_qlookup(&strings, mlink->name);
           str = ohash_find(&strings, slot);
           assert(NULL != str);
           if ( ! (TYPE_NAME & str->mask))
                   say(mlink->file, "Name missing in NAME section");
 }  }
   
 /*  /*
Line 988  mpages_merge(struct mchars *mc, struct mparse *mp)
Line 1001  mpages_merge(struct mchars *mc, struct mparse *mp)
         char                    *sodest;          char                    *sodest;
         char                    *cp;          char                    *cp;
         pid_t                    child_pid;          pid_t                    child_pid;
         int                      match, status;          int                      status;
         unsigned int             pslot;          unsigned int             pslot;
         enum mandoclevel         lvl;          enum mandoclevel         lvl;
   
Line 1136  mpages_merge(struct mchars *mc, struct mparse *mp)
Line 1149  mpages_merge(struct mchars *mc, struct mparse *mp)
                         putkey(mpage, mlink->name, TYPE_Nm);                          putkey(mpage, mlink->name, TYPE_Nm);
                 }                  }
   
                 if (warnings && !use_all) {  
                         match = 0;  
                         for (mlink = mpage->mlinks; mlink;  
                              mlink = mlink->next)  
                                 if (mlink_check(mpage, mlink))  
                                         match = 1;  
                 } else  
                         match = 1;  
   
                 if (NULL != mdoc) {                  if (NULL != mdoc) {
                         if (NULL != (cp = mdoc_meta(mdoc)->name))                          if (NULL != (cp = mdoc_meta(mdoc)->name))
                                 putkey(mpage, cp, TYPE_Nm);                                  putkey(mpage, cp, TYPE_Nm);
                         assert(NULL == mpage->desc);                          assert(NULL == mpage->desc);
                         parse_mdoc(mpage, mdoc_node(mdoc));                          parse_mdoc(mpage, mdoc_node(mdoc));
                         putkey(mpage, NULL != mpage->desc ?                          if (NULL == mpage->desc)
                             mpage->desc : mpage->mlinks->name, TYPE_Nd);                                  mpage->desc = mandoc_strdup(
                                       mpage->mlinks->name);
                 } 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[0]);
   
                   if (warnings && !use_all)
                           for (mlink = mpage->mlinks; mlink;
                                mlink = mlink->next)
                                   mlink_check(mpage, mlink);
   
                 dbadd(mpage, mc);                  dbadd(mpage, mc);
   
 nextpage:  nextpage:
Line 1185  nextpage:
Line 1195  nextpage:
 }  }
   
 static void  static void
   names_check(void)
   {
           sqlite3_stmt    *stmt;
           const char      *name, *sec, *arch, *key;
           size_t           i;
           int              irc;
   
           sqlite3_prepare_v2(db,
             "SELECT name, sec, arch, key FROM ("
               "SELECT key, pageid FROM keys "
               "WHERE bits & ? AND NOT EXISTS ("
                 "SELECT pageid FROM mlinks "
                 "WHERE mlinks.pageid == keys.pageid "
                 "AND mlinks.name == keys.key"
               ")"
             ") JOIN ("
               "SELECT * FROM mlinks GROUP BY pageid"
             ") USING (pageid);",
             -1, &stmt, NULL);
   
           i = 1;
           SQL_BIND_INT64(stmt, i, TYPE_NAME);
   
           while (SQLITE_ROW == (irc = sqlite3_step(stmt))) {
                   name = sqlite3_column_text(stmt, 0);
                   sec  = sqlite3_column_text(stmt, 1);
                   arch = sqlite3_column_text(stmt, 2);
                   key  = sqlite3_column_text(stmt, 3);
                   say("", "%s(%s%s%s) lacks mlink \"%s\"", name, sec,
                       '\0' == *arch ? "" : "/",
                       '\0' == *arch ? "" : arch, key);
           }
           sqlite3_finalize(stmt);
   }
   
   static void
 parse_cat(struct mpage *mpage, int fd)  parse_cat(struct mpage *mpage, int fd)
 {  {
         FILE            *stream;          FILE            *stream;
Line 1253  parse_cat(struct mpage *mpage, int fd)
Line 1299  parse_cat(struct mpage *mpage, int fd)
                             "Cannot find NAME section");                              "Cannot find NAME section");
                 assert(NULL == mpage->desc);                  assert(NULL == mpage->desc);
                 mpage->desc = mandoc_strdup(mpage->mlinks->name);                  mpage->desc = mandoc_strdup(mpage->mlinks->name);
                 putkey(mpage, mpage->mlinks->name, TYPE_Nd);  
                 fclose(stream);                  fclose(stream);
                 free(title);                  free(title);
                 return;                  return;
Line 1294  parse_cat(struct mpage *mpage, int fd)
Line 1339  parse_cat(struct mpage *mpage, int fd)
   
         assert(NULL == mpage->desc);          assert(NULL == mpage->desc);
         mpage->desc = mandoc_strdup(p);          mpage->desc = mandoc_strdup(p);
         putkey(mpage, mpage->desc, TYPE_Nd);  
         fclose(stream);          fclose(stream);
         free(title);          free(title);
 }  }
Line 1435  parse_man(struct mpage *mpage, const struct man_node *
Line 1479  parse_man(struct mpage *mpage, const struct man_node *
   
                         assert(NULL == mpage->desc);                          assert(NULL == mpage->desc);
                         mpage->desc = mandoc_strdup(start);                          mpage->desc = mandoc_strdup(start);
                         putkey(mpage, mpage->desc, TYPE_Nd);  
                         free(title);                          free(title);
                         return;                          return;
                 }                  }
Line 1883  dbadd(struct mpage *mpage, struct mchars *mc)
Line 1926  dbadd(struct mpage *mpage, struct mchars *mc)
                         if (NULL != mlink)                          if (NULL != mlink)
                                 fputs(", ", stdout);                                  fputs(", ", stdout);
                 }                  }
                 for (key = ohash_first(&strings, &slot); NULL != key;                  printf(" - %s\n", mpage->desc);
                      key = ohash_next(&strings, &slot)) {  
                         if (TYPE_Nd & key->mask) {  
                                 if (NULL == key->rendered)  
                                         render_key(mc, key);  
                                 printf(" - %s", key->rendered);  
                                 break;  
                         }  
                 }  
                 putchar('\n');  
                 return;                  return;
         }          }
   
Line 1900  dbadd(struct mpage *mpage, struct mchars *mc)
Line 1934  dbadd(struct mpage *mpage, struct mchars *mc)
                 say(mlink->file, "Adding to database");                  say(mlink->file, "Adding to database");
   
         i = 1;          i = 1;
           SQL_BIND_TEXT(stmts[STMT_INSERT_PAGE], i, mpage->desc);
         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]);
         mpage->recno = sqlite3_last_insert_rowid(db);          mpage->recno = sqlite3_last_insert_rowid(db);
Line 2112  dbopen(int real)
Line 2147  dbopen(int real)
   
 create_tables:  create_tables:
         sql = "CREATE TABLE \"mpages\" (\n"          sql = "CREATE TABLE \"mpages\" (\n"
                 " \"desc\" TEXT NOT NULL,\n"
               " \"form\" INTEGER NOT NULL,\n"                " \"form\" INTEGER NOT NULL,\n"
               " \"id\" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL\n"                " \"id\" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL\n"
               ");\n"                ");\n"
Line 2144  prepare_statements:
Line 2180  prepare_statements:
                 "sec=? AND arch=? AND name=?)";                  "sec=? AND arch=? AND name=?)";
         sqlite3_prepare_v2(db, sql, -1, &stmts[STMT_DELETE_PAGE], NULL);          sqlite3_prepare_v2(db, sql, -1, &stmts[STMT_DELETE_PAGE], NULL);
         sql = "INSERT INTO mpages "          sql = "INSERT INTO mpages "
                 "(form) VALUES (?)";                  "(desc,form) VALUES (?,?)";
         sqlite3_prepare_v2(db, sql, -1, &stmts[STMT_INSERT_PAGE], NULL);          sqlite3_prepare_v2(db, sql, -1, &stmts[STMT_INSERT_PAGE], NULL);
         sql = "INSERT INTO mlinks "          sql = "INSERT INTO mlinks "
                 "(sec,arch,name,pageid) VALUES (?,?,?,?)";                  "(sec,arch,name,pageid) VALUES (?,?,?,?)";

Legend:
Removed from v.1.129  
changed lines
  Added in v.1.132

CVSweb