version 1.174, 2014/06/20 16:11:42 |
version 1.180, 2014/08/17 03:24:47 |
|
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
*/ |
*/ |
#ifdef HAVE_CONFIG_H |
|
#include "config.h" |
#include "config.h" |
#endif |
|
|
|
|
#include <sys/types.h> |
|
|
#include <assert.h> |
#include <assert.h> |
#include <stdio.h> |
#include <stdio.h> |
#include <stdint.h> |
#include <stdint.h> |
|
|
#include "main.h" |
#include "main.h" |
#include "mdoc.h" |
#include "mdoc.h" |
#include "man.h" |
#include "man.h" |
|
#include "manpath.h" |
|
#include "mansearch.h" |
|
|
#if !defined(__GNUC__) || (__GNUC__ < 2) |
#if !defined(__GNUC__) || (__GNUC__ < 2) |
# if !defined(lint) |
# if !defined(lint) |
Line 74 static void mmsg(enum mandocerr, enum mandoclevel, |
|
Line 76 static void mmsg(enum mandocerr, enum mandoclevel, |
|
static void parse(struct curparse *, int, |
static void parse(struct curparse *, int, |
const char *, enum mandoclevel *); |
const char *, enum mandoclevel *); |
static int toptions(struct curparse *, char *); |
static int toptions(struct curparse *, char *); |
static void usage(void) __attribute__((noreturn)); |
static void usage(enum argmode) __attribute__((noreturn)); |
static void version(void) __attribute__((noreturn)); |
static void version(void) __attribute__((noreturn)); |
static int woptions(struct curparse *, char *); |
static int woptions(struct curparse *, char *); |
|
|
Line 84 static const char *progname; |
|
Line 86 static const char *progname; |
|
int |
int |
main(int argc, char *argv[]) |
main(int argc, char *argv[]) |
{ |
{ |
int c; |
|
struct curparse curp; |
struct curparse curp; |
int options; |
struct mansearch search; |
enum mandoclevel rc; |
struct manpaths paths; |
|
char *conf_file, *defpaths, *auxpaths; |
char *defos; |
char *defos; |
|
#if HAVE_SQLITE3 |
|
struct manpage *res; |
|
size_t i, sz; |
|
#endif |
|
enum mandoclevel rc; |
|
int show_usage; |
|
int options; |
|
int c; |
|
|
progname = strrchr(argv[0], '/'); |
progname = strrchr(argv[0], '/'); |
if (progname == NULL) |
if (progname == NULL) |
Line 96 main(int argc, char *argv[]) |
|
Line 106 main(int argc, char *argv[]) |
|
else |
else |
++progname; |
++progname; |
|
|
memset(&curp, 0, sizeof(struct curparse)); |
/* Search options. */ |
|
|
options = MPARSE_SO; |
memset(&paths, 0, sizeof(struct manpaths)); |
|
conf_file = defpaths = auxpaths = NULL; |
|
|
|
memset(&search, 0, sizeof(struct mansearch)); |
|
search.outkey = "Nd"; |
|
|
|
if (strcmp(progname, "man") == 0) |
|
search.argmode = ARG_NAME; |
|
else if (strncmp(progname, "apropos", 7) == 0) |
|
search.argmode = ARG_EXPR; |
|
else if (strncmp(progname, "whatis", 6) == 0) |
|
search.argmode = ARG_WORD; |
|
else |
|
search.argmode = ARG_FILE; |
|
|
|
/* Parser and formatter options. */ |
|
|
|
memset(&curp, 0, sizeof(struct curparse)); |
curp.outtype = OUTT_ASCII; |
curp.outtype = OUTT_ASCII; |
curp.wlevel = MANDOCLEVEL_FATAL; |
curp.wlevel = MANDOCLEVEL_FATAL; |
|
options = MPARSE_SO; |
defos = NULL; |
defos = NULL; |
|
|
while (-1 != (c = getopt(argc, argv, "I:m:O:T:VW:"))) |
show_usage = 0; |
|
while (-1 != (c = getopt(argc, argv, "C:fI:kM:m:O:S:s:T:VW:"))) { |
switch (c) { |
switch (c) { |
|
case 'C': |
|
conf_file = optarg; |
|
break; |
|
case 'f': |
|
search.argmode = ARG_WORD; |
|
break; |
case 'I': |
case 'I': |
if (strncmp(optarg, "os=", 3)) { |
if (strncmp(optarg, "os=", 3)) { |
fprintf(stderr, |
fprintf(stderr, |
"-I%s: Bad argument\n", optarg); |
"%s: -I%s: Bad argument\n", |
|
progname, optarg); |
return((int)MANDOCLEVEL_BADARG); |
return((int)MANDOCLEVEL_BADARG); |
} |
} |
if (defos) { |
if (defos) { |
fprintf(stderr, |
fprintf(stderr, |
"-I%s: Duplicate argument\n", |
"%s: -I%s: Duplicate argument\n", |
optarg); |
progname, optarg); |
return((int)MANDOCLEVEL_BADARG); |
return((int)MANDOCLEVEL_BADARG); |
} |
} |
defos = mandoc_strdup(optarg + 3); |
defos = mandoc_strdup(optarg + 3); |
break; |
break; |
|
case 'k': |
|
search.argmode = ARG_EXPR; |
|
break; |
|
case 'M': |
|
defpaths = optarg; |
|
break; |
case 'm': |
case 'm': |
if ( ! moptions(&options, optarg)) |
auxpaths = optarg; |
return((int)MANDOCLEVEL_BADARG); |
|
break; |
break; |
case 'O': |
case 'O': |
|
search.outkey = optarg; |
(void)strlcat(curp.outopts, optarg, BUFSIZ); |
(void)strlcat(curp.outopts, optarg, BUFSIZ); |
(void)strlcat(curp.outopts, ",", BUFSIZ); |
(void)strlcat(curp.outopts, ",", BUFSIZ); |
break; |
break; |
|
case 'S': |
|
search.arch = optarg; |
|
break; |
|
case 's': |
|
search.sec = optarg; |
|
break; |
case 'T': |
case 'T': |
if ( ! toptions(&curp, optarg)) |
if ( ! toptions(&curp, optarg)) |
return((int)MANDOCLEVEL_BADARG); |
return((int)MANDOCLEVEL_BADARG); |
Line 139 main(int argc, char *argv[]) |
|
Line 187 main(int argc, char *argv[]) |
|
version(); |
version(); |
/* NOTREACHED */ |
/* NOTREACHED */ |
default: |
default: |
usage(); |
show_usage = 1; |
/* NOTREACHED */ |
break; |
} |
} |
|
} |
|
|
|
if (show_usage) |
|
usage(search.argmode); |
|
|
|
argc -= optind; |
|
argv += optind; |
|
|
|
/* man(1), whatis(1), apropos(1) */ |
|
|
|
if (search.argmode != ARG_FILE) { |
|
#if HAVE_SQLITE3 |
|
if (argc == 0) |
|
usage(search.argmode); |
|
manpath_parse(&paths, conf_file, defpaths, auxpaths); |
|
mansearch_setup(1); |
|
if( ! mansearch(&search, &paths, argc, argv, &res, &sz)) |
|
usage(search.argmode); |
|
manpath_free(&paths); |
|
for (i = 0; i < sz; i++) |
|
printf("%s - %s\n", res[i].names, |
|
res[i].output == NULL ? "" : res[i].output); |
|
mansearch_free(res, sz); |
|
mansearch_setup(0); |
|
return((int)MANDOCLEVEL_OK); |
|
#else |
|
fputs("mandoc: database support not compiled in\n", |
|
stderr); |
|
return((int)MANDOCLEVEL_BADARG); |
|
#endif |
|
} |
|
|
|
/* mandoc(1) */ |
|
|
|
if ( ! moptions(&options, auxpaths)) |
|
return((int)MANDOCLEVEL_BADARG); |
|
|
curp.mp = mparse_alloc(options, curp.wlevel, mmsg, defos); |
curp.mp = mparse_alloc(options, curp.wlevel, mmsg, defos); |
|
|
/* |
/* |
Line 151 main(int argc, char *argv[]) |
|
Line 235 main(int argc, char *argv[]) |
|
if (OUTT_MAN == curp.outtype) |
if (OUTT_MAN == curp.outtype) |
mparse_keep(curp.mp); |
mparse_keep(curp.mp); |
|
|
argc -= optind; |
|
argv += optind; |
|
|
|
rc = MANDOCLEVEL_OK; |
rc = MANDOCLEVEL_OK; |
|
|
if (NULL == *argv) |
if (NULL == *argv) |
|
|
version(void) |
version(void) |
{ |
{ |
|
|
printf("%s %s\n", progname, VERSION); |
printf("mandoc %s\n", VERSION); |
exit((int)MANDOCLEVEL_OK); |
exit((int)MANDOCLEVEL_OK); |
} |
} |
|
|
static void |
static void |
usage(void) |
usage(enum argmode argmode) |
{ |
{ |
|
|
fprintf(stderr, "usage: %s " |
switch (argmode) { |
"[-V] " |
case ARG_FILE: |
"[-Ios=name] " |
fputs("usage: mandoc [-V] [-Ios=name] [-mformat]" |
"[-mformat] " |
" [-Ooption] [-Toutput] [-Wlevel]\n" |
"[-Ooption] " |
"\t [file ...]\n", stderr); |
"[-Toutput] " |
break; |
"[-Wlevel]\n" |
case ARG_NAME: |
"\t [file ...]\n", |
fputs("usage: man [-acfhkVw] [-C file] " |
progname); |
"[-M path] [-m path] [-S arch] [-s section]\n" |
|
"\t [section] name ...\n", stderr); |
|
break; |
|
case ARG_WORD: |
|
fputs("usage: whatis [-V] [-C file] [-M path] [-m path] " |
|
"[-S arch] [-s section] name ...\n", stderr); |
|
break; |
|
case ARG_EXPR: |
|
fputs("usage: apropos [-V] [-C file] [-M path] [-m path] " |
|
"[-O outkey] [-S arch]\n" |
|
"\t [-s section] expression ...\n", stderr); |
|
break; |
|
} |
exit((int)MANDOCLEVEL_BADARG); |
exit((int)MANDOCLEVEL_BADARG); |
} |
} |
|
|
|
|
moptions(int *options, char *arg) |
moptions(int *options, char *arg) |
{ |
{ |
|
|
if (0 == strcmp(arg, "doc")) |
if (arg == NULL) |
|
/* nothing to do */; |
|
else if (0 == strcmp(arg, "doc")) |
*options |= MPARSE_MDOC; |
*options |= MPARSE_MDOC; |
else if (0 == strcmp(arg, "andoc")) |
else if (0 == strcmp(arg, "andoc")) |
/* nothing to do */; |
/* nothing to do */; |
else if (0 == strcmp(arg, "an")) |
else if (0 == strcmp(arg, "an")) |
*options |= MPARSE_MAN; |
*options |= MPARSE_MAN; |
else { |
else { |
fprintf(stderr, "%s: Bad argument\n", arg); |
fprintf(stderr, "%s: -m%s: Bad argument\n", |
|
progname, arg); |
return(0); |
return(0); |
} |
} |
|
|
Line 357 toptions(struct curparse *curp, char *arg) |
|
Line 452 toptions(struct curparse *curp, char *arg) |
|
else if (0 == strcmp(arg, "pdf")) |
else if (0 == strcmp(arg, "pdf")) |
curp->outtype = OUTT_PDF; |
curp->outtype = OUTT_PDF; |
else { |
else { |
fprintf(stderr, "%s: Bad argument\n", arg); |
fprintf(stderr, "%s: -T%s: Bad argument\n", |
|
progname, arg); |
return(0); |
return(0); |
} |
} |
|
|
Line 395 woptions(struct curparse *curp, char *arg) |
|
Line 491 woptions(struct curparse *curp, char *arg) |
|
curp->wlevel = MANDOCLEVEL_FATAL; |
curp->wlevel = MANDOCLEVEL_FATAL; |
break; |
break; |
default: |
default: |
fprintf(stderr, "-W%s: Bad argument\n", o); |
fprintf(stderr, "%s: -W%s: Bad argument\n", |
|
progname, o); |
return(0); |
return(0); |
} |
} |
} |
} |
|
|
mmsg(enum mandocerr t, enum mandoclevel lvl, |
mmsg(enum mandocerr t, enum mandoclevel lvl, |
const char *file, int line, int col, const char *msg) |
const char *file, int line, int col, const char *msg) |
{ |
{ |
|
const char *mparse_msg; |
|
|
fprintf(stderr, "%s: %s:%d:%d: %s: %s", progname, |
fprintf(stderr, "%s: %s:", progname, file); |
file, line, col + 1, |
|
mparse_strlevel(lvl), mparse_strerror(t)); |
if (line) |
|
fprintf(stderr, "%d:%d:", line, col + 1); |
|
|
|
fprintf(stderr, " %s", mparse_strlevel(lvl)); |
|
|
|
if (NULL != (mparse_msg = mparse_strerror(t))) |
|
fprintf(stderr, ": %s", mparse_msg); |
|
|
if (msg) |
if (msg) |
fprintf(stderr, ": %s", msg); |
fprintf(stderr, ": %s", msg); |