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) { |
|
|
} |
} |
} |
} |
|
|
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: |
|
|
} |
} |
|
|
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 (?,?,?,?)"; |