version 1.206, 2015/11/06 16:30:33 |
version 1.212, 2016/01/08 02:13:39 |
|
|
/* $Id$ */ |
/* $Id$ */ |
/* |
/* |
* Copyright (c) 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv> |
* Copyright (c) 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv> |
* Copyright (c) 2011-2015 Ingo Schwarze <schwarze@openbsd.org> |
* Copyright (c) 2011-2016 Ingo Schwarze <schwarze@openbsd.org> |
* |
* |
* Permission to use, copy, modify, and distribute this software for any |
* Permission to use, copy, modify, and distribute this software for any |
* purpose with or without fee is hereby granted, provided that the above |
* purpose with or without fee is hereby granted, provided that the above |
|
|
|
|
#include <assert.h> |
#include <assert.h> |
#include <ctype.h> |
#include <ctype.h> |
|
#if HAVE_ERR |
#include <err.h> |
#include <err.h> |
|
#endif |
#include <errno.h> |
#include <errno.h> |
#include <fcntl.h> |
#include <fcntl.h> |
#if HAVE_FTS |
#if HAVE_FTS |
Line 154 static void parse_man(struct mpage *, const struct ro |
|
Line 156 static void parse_man(struct mpage *, const struct ro |
|
const struct roff_node *); |
const struct roff_node *); |
static void parse_mdoc(struct mpage *, const struct roff_meta *, |
static void parse_mdoc(struct mpage *, const struct roff_meta *, |
const struct roff_node *); |
const struct roff_node *); |
static int parse_mdoc_body(struct mpage *, const struct roff_meta *, |
|
const struct roff_node *); |
|
static int parse_mdoc_head(struct mpage *, const struct roff_meta *, |
static int parse_mdoc_head(struct mpage *, const struct roff_meta *, |
const struct roff_node *); |
const struct roff_node *); |
static int parse_mdoc_Fd(struct mpage *, const struct roff_meta *, |
static int parse_mdoc_Fd(struct mpage *, const struct roff_meta *, |
Line 171 static int parse_mdoc_Nm(struct mpage *, const struct |
|
Line 171 static int parse_mdoc_Nm(struct mpage *, const struct |
|
const struct roff_node *); |
const struct roff_node *); |
static int parse_mdoc_Sh(struct mpage *, const struct roff_meta *, |
static int parse_mdoc_Sh(struct mpage *, const struct roff_meta *, |
const struct roff_node *); |
const struct roff_node *); |
|
static int parse_mdoc_Va(struct mpage *, const struct roff_meta *, |
|
const struct roff_node *); |
static int parse_mdoc_Xr(struct mpage *, const struct roff_meta *, |
static int parse_mdoc_Xr(struct mpage *, const struct roff_meta *, |
const struct roff_node *); |
const struct roff_node *); |
static void putkey(const struct mpage *, char *, uint64_t); |
static void putkey(const struct mpage *, char *, uint64_t); |
Line 240 static const struct mdoc_handler mdocs[MDOC_MAX] = { |
|
Line 242 static const struct mdoc_handler mdocs[MDOC_MAX] = { |
|
{ NULL, TYPE_Pa }, /* Pa */ |
{ NULL, TYPE_Pa }, /* Pa */ |
{ NULL, 0 }, /* Rv */ |
{ NULL, 0 }, /* Rv */ |
{ NULL, TYPE_St }, /* St */ |
{ NULL, TYPE_St }, /* St */ |
{ NULL, TYPE_Va }, /* Va */ |
{ parse_mdoc_Va, TYPE_Va }, /* Va */ |
{ parse_mdoc_body, TYPE_Va }, /* Vt */ |
{ parse_mdoc_Va, TYPE_Vt }, /* Vt */ |
{ parse_mdoc_Xr, 0 }, /* Xr */ |
{ parse_mdoc_Xr, 0 }, /* Xr */ |
{ NULL, 0 }, /* %A */ |
{ NULL, 0 }, /* %A */ |
{ NULL, 0 }, /* %B */ |
{ NULL, 0 }, /* %B */ |
Line 337 mandocdb(int argc, char *argv[]) |
|
Line 339 mandocdb(int argc, char *argv[]) |
|
size_t j, sz; |
size_t j, sz; |
int ch, i; |
int ch, i; |
|
|
|
#if HAVE_PLEDGE |
|
if (pledge("stdio rpath wpath cpath fattr flock proc exec", NULL) == -1) { |
|
perror("pledge"); |
|
return (int)MANDOCLEVEL_SYSERR; |
|
} |
|
#endif |
|
|
memset(&conf, 0, sizeof(conf)); |
memset(&conf, 0, sizeof(conf)); |
memset(stmts, 0, STMT__MAX * sizeof(sqlite3_stmt *)); |
memset(stmts, 0, STMT__MAX * sizeof(sqlite3_stmt *)); |
|
|
Line 410 mandocdb(int argc, char *argv[]) |
|
Line 419 mandocdb(int argc, char *argv[]) |
|
argc -= optind; |
argc -= optind; |
argv += optind; |
argv += optind; |
|
|
|
#if HAVE_PLEDGE |
|
if (nodb) { |
|
if (pledge("stdio rpath", NULL) == -1) { |
|
perror("pledge"); |
|
return (int)MANDOCLEVEL_SYSERR; |
|
} |
|
} |
|
#endif |
|
|
if (OP_CONFFILE == op && argc > 0) { |
if (OP_CONFFILE == op && argc > 0) { |
warnx("-C: Too many arguments"); |
warnx("-C: Too many arguments"); |
goto usage; |
goto usage; |
Line 435 mandocdb(int argc, char *argv[]) |
|
Line 453 mandocdb(int argc, char *argv[]) |
|
* The existing database is usable. Process |
* The existing database is usable. Process |
* all files specified on the command-line. |
* all files specified on the command-line. |
*/ |
*/ |
|
#if HAVE_PLEDGE |
|
if (!nodb) { |
|
if (pledge("stdio rpath wpath cpath fattr flock", NULL) == -1) { |
|
perror("pledge"); |
|
exitcode = (int)MANDOCLEVEL_SYSERR; |
|
goto out; |
|
} |
|
} |
|
#endif |
use_all = 1; |
use_all = 1; |
for (i = 0; i < argc; i++) |
for (i = 0; i < argc; i++) |
filescan(argv[i]); |
filescan(argv[i]); |
Line 1119 mpages_merge(struct mparse *mp) |
|
Line 1146 mpages_merge(struct mparse *mp) |
|
*/ |
*/ |
if (mlink->dform != FORM_CAT || mlink->fform != FORM_CAT) { |
if (mlink->dform != FORM_CAT || mlink->fform != FORM_CAT) { |
mparse_readfd(mp, fd, mlink->file); |
mparse_readfd(mp, fd, mlink->file); |
|
close(fd); |
mparse_result(mp, &man, &sodest); |
mparse_result(mp, &man, &sodest); |
} |
} |
|
|
Line 1267 parse_cat(struct mpage *mpage, int fd) |
|
Line 1295 parse_cat(struct mpage *mpage, int fd) |
|
{ |
{ |
FILE *stream; |
FILE *stream; |
char *line, *p, *title; |
char *line, *p, *title; |
size_t len, plen, titlesz; |
size_t linesz, plen, titlesz; |
|
ssize_t len; |
|
int offs; |
|
|
stream = (-1 == fd) ? |
stream = (-1 == fd) ? |
fopen(mpage->mlinks->file, "r") : |
fopen(mpage->mlinks->file, "r") : |
Line 1280 parse_cat(struct mpage *mpage, int fd) |
|
Line 1310 parse_cat(struct mpage *mpage, int fd) |
|
return; |
return; |
} |
} |
|
|
|
line = NULL; |
|
linesz = 0; |
|
|
/* Skip to first blank line. */ |
/* Skip to first blank line. */ |
|
|
while (NULL != (line = fgetln(stream, &len))) |
while (getline(&line, &linesz, stream) != -1) |
if ('\n' == *line) |
if (*line == '\n') |
break; |
break; |
|
|
/* |
/* |
Line 1291 parse_cat(struct mpage *mpage, int fd) |
|
Line 1324 parse_cat(struct mpage *mpage, int fd) |
|
* is the first section header. Skip to it. |
* is the first section header. Skip to it. |
*/ |
*/ |
|
|
while (NULL != (line = fgetln(stream, &len))) |
while (getline(&line, &linesz, stream) != -1) |
if ('\n' != *line && ' ' != *line) |
if (*line != '\n' && *line != ' ') |
break; |
break; |
|
|
/* |
/* |
Line 1305 parse_cat(struct mpage *mpage, int fd) |
|
Line 1338 parse_cat(struct mpage *mpage, int fd) |
|
titlesz = 0; |
titlesz = 0; |
title = NULL; |
title = NULL; |
|
|
while (NULL != (line = fgetln(stream, &len))) { |
while ((len = getline(&line, &linesz, stream)) != -1) { |
if (' ' != *line || '\n' != line[len - 1]) |
if (*line != ' ') |
break; |
break; |
while (len > 0 && isspace((unsigned char)*line)) { |
offs = 0; |
line++; |
while (isspace((unsigned char)line[offs])) |
len--; |
offs++; |
} |
if (line[offs] == '\0') |
if (1 == len) |
|
continue; |
continue; |
title = mandoc_realloc(title, titlesz + len); |
title = mandoc_realloc(title, titlesz + len - offs); |
memcpy(title + titlesz, line, len); |
memcpy(title + titlesz, line + offs, len - offs); |
titlesz += len; |
titlesz += len - offs; |
title[titlesz - 1] = ' '; |
title[titlesz - 1] = ' '; |
} |
} |
|
free(line); |
|
|
/* |
/* |
* If no page content can be found, or the input line |
* If no page content can be found, or the input line |
Line 1336 parse_cat(struct mpage *mpage, int fd) |
|
Line 1369 parse_cat(struct mpage *mpage, int fd) |
|
return; |
return; |
} |
} |
|
|
title = mandoc_realloc(title, titlesz + 1); |
title[titlesz - 1] = '\0'; |
title[titlesz] = '\0'; |
|
|
|
/* |
/* |
* Skip to the first dash. |
* Skip to the first dash. |
Line 1658 parse_mdoc_Fo(struct mpage *mpage, const struct roff_m |
|
Line 1690 parse_mdoc_Fo(struct mpage *mpage, const struct roff_m |
|
} |
} |
|
|
static int |
static int |
|
parse_mdoc_Va(struct mpage *mpage, const struct roff_meta *meta, |
|
const struct roff_node *n) |
|
{ |
|
char *cp; |
|
|
|
if (n->type != ROFFT_ELEM && n->type != ROFFT_BODY) |
|
return 0; |
|
|
|
if (n->nchild == 1 && n->child->type == ROFFT_TEXT) |
|
return 1; |
|
|
|
cp = NULL; |
|
deroff(&cp, n); |
|
if (cp != NULL) { |
|
putkey(mpage, cp, TYPE_Vt | (n->tok == MDOC_Va || |
|
n->type == ROFFT_BODY ? TYPE_Va : 0)); |
|
free(cp); |
|
} |
|
|
|
return 0; |
|
} |
|
|
|
static int |
parse_mdoc_Xr(struct mpage *mpage, const struct roff_meta *meta, |
parse_mdoc_Xr(struct mpage *mpage, const struct roff_meta *meta, |
const struct roff_node *n) |
const struct roff_node *n) |
{ |
{ |
Line 1723 parse_mdoc_head(struct mpage *mpage, const struct roff |
|
Line 1778 parse_mdoc_head(struct mpage *mpage, const struct roff |
|
{ |
{ |
|
|
return n->type == ROFFT_HEAD; |
return n->type == ROFFT_HEAD; |
} |
|
|
|
static int |
|
parse_mdoc_body(struct mpage *mpage, const struct roff_meta *meta, |
|
const struct roff_node *n) |
|
{ |
|
|
|
return n->type == ROFFT_BODY; |
|
} |
} |
|
|
/* |
/* |