version 1.88, 2013/12/27 18:42:25 |
version 1.90, 2013/12/27 23:41:55 |
Line 144 static void hash_free(void *, size_t, void *); |
|
Line 144 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 void mlink_free(struct mlink *); |
static void mlink_free(struct mlink *); |
|
static void mlinks_undupe(struct mpage *); |
static void mpages_free(void); |
static void mpages_free(void); |
static void mpages_merge(struct mchars *, struct mparse *, int); |
static void mpages_merge(struct mchars *, struct mparse *, int); |
static void parse_cat(struct mpage *); |
static void parse_cat(struct mpage *); |
|
|
/* |
/* |
* If we're a regular file, add an mlink by using the |
* If we're a regular file, add an mlink by using the |
* stored directory data and handling the filename. |
* stored directory data and handling the filename. |
* Disallow duplicate (hard-linked) files. |
|
*/ |
*/ |
if (FTS_F == ff->fts_info) { |
if (FTS_F == ff->fts_info) { |
if (0 == strcmp(path, MANDOC_DB)) |
if (0 == strcmp(path, MANDOC_DB)) |
|
|
} |
} |
|
|
/* |
/* |
* Add a file to the file vector. |
* Add a file to the mlinks table. |
* Do not verify that it's a "valid" looking manpage (we'll do that |
* Do not verify that it's a "valid" looking manpage (we'll do that |
* later). |
* later). |
* |
* |
|
|
* or |
* or |
* [./]cat<section>[/<arch>]/<name>.0 |
* [./]cat<section>[/<arch>]/<name>.0 |
* |
* |
* Stuff this information directly into the mlink vector. |
|
* See treescan() for the fts(3) version of this. |
* See treescan() for the fts(3) version of this. |
*/ |
*/ |
static void |
static void |
Line 842 mpages_free(void) |
|
Line 841 mpages_free(void) |
|
} |
} |
|
|
/* |
/* |
|
* For each mlink to the mpage, check whether the path looks like |
|
* it is formatted, and if it does, check whether a source manual |
|
* exists by the same name, ignoring the suffix. |
|
* If both conditions hold, drop the mlink. |
|
*/ |
|
static void |
|
mlinks_undupe(struct mpage *mpage) |
|
{ |
|
char buf[PATH_MAX]; |
|
struct mlink **prev; |
|
struct mlink *mlink; |
|
char *bufp; |
|
|
|
mpage->form = FORM_CAT; |
|
prev = &mpage->mlinks; |
|
while (NULL != (mlink = *prev)) { |
|
if (FORM_CAT != mlink->dform) { |
|
mpage->form = FORM_NONE; |
|
goto nextlink; |
|
} |
|
if (strlcpy(buf, mlink->file, PATH_MAX) >= PATH_MAX) { |
|
if (warnings) |
|
say(mlink->file, "Filename too long"); |
|
goto nextlink; |
|
} |
|
bufp = strstr(buf, "cat"); |
|
assert(NULL != bufp); |
|
memcpy(bufp, "man", 3); |
|
if (NULL != (bufp = strrchr(buf, '.'))) |
|
*++bufp = '\0'; |
|
strlcat(buf, mlink->dsec, PATH_MAX); |
|
if (NULL == ohash_find(&mlinks, |
|
ohash_qlookup(&mlinks, buf))) |
|
goto nextlink; |
|
if (warnings) |
|
say(mlink->file, "Man source exists: %s", buf); |
|
if (use_all) |
|
goto nextlink; |
|
*prev = mlink->next; |
|
mlink_free(mlink); |
|
continue; |
|
nextlink: |
|
prev = &(*prev)->next; |
|
} |
|
} |
|
|
|
/* |
* Run through the files in the global vector "mpages" |
* Run through the files in the global vector "mpages" |
* and add them to the database specified in "basedir". |
* and add them to the database specified in "basedir". |
* |
* |
Line 853 mpages_merge(struct mchars *mc, struct mparse *mp, int |
|
Line 899 mpages_merge(struct mchars *mc, struct mparse *mp, int |
|
{ |
{ |
struct ohash title_table; |
struct ohash title_table; |
struct ohash_info title_info, str_info; |
struct ohash_info title_info, str_info; |
char buf[PATH_MAX]; |
|
struct mpage *mpage; |
struct mpage *mpage; |
struct mdoc *mdoc; |
struct mdoc *mdoc; |
struct man *man; |
struct man *man; |
struct title *title_entry; |
struct title *title_entry; |
char *bufp, *title_str; |
char *title_str; |
const char *cp; |
const char *cp; |
size_t sz; |
|
int match; |
int match; |
unsigned int pslot, tslot; |
unsigned int pslot, tslot; |
enum mandoclevel lvl; |
enum mandoclevel lvl; |
Line 880 mpages_merge(struct mchars *mc, struct mparse *mp, int |
|
Line 924 mpages_merge(struct mchars *mc, struct mparse *mp, int |
|
|
|
mpage = ohash_first(&mpages, &pslot); |
mpage = ohash_first(&mpages, &pslot); |
while (NULL != mpage) { |
while (NULL != mpage) { |
/* |
mlinks_undupe(mpage); |
* If we're a catpage (as defined by our path), then see |
if (NULL == mpage->mlinks) { |
* if a manpage exists by the same name (ignoring the |
mpage = ohash_next(&mpages, &pslot); |
* suffix). |
continue; |
* If it does, then we want to use it instead of our |
|
* own. |
|
*/ |
|
if ( ! use_all && FORM_CAT == mpage->mlinks->dform) { |
|
sz = strlcpy(buf, mpage->mlinks->file, PATH_MAX); |
|
if (sz >= PATH_MAX) { |
|
if (warnings) |
|
say(mpage->mlinks->file, |
|
"Filename too long"); |
|
mpage = ohash_next(&mpages, &pslot); |
|
continue; |
|
} |
|
bufp = strstr(buf, "cat"); |
|
assert(NULL != bufp); |
|
memcpy(bufp, "man", 3); |
|
if (NULL != (bufp = strrchr(buf, '.'))) |
|
*++bufp = '\0'; |
|
strlcat(buf, mpage->mlinks->dsec, PATH_MAX); |
|
if (NULL != ohash_find(&mlinks, |
|
ohash_qlookup(&mlinks, buf))) { |
|
if (warnings) |
|
say(mpage->mlinks->file, "Man " |
|
"source exists: %s", buf); |
|
mpage = ohash_next(&mpages, &pslot); |
|
continue; |
|
} |
|
} |
} |
|
|
ohash_init(&strings, 6, &str_info); |
ohash_init(&strings, 6, &str_info); |