version 1.179, 2014/08/16 23:04:25 |
version 1.180, 2014/08/17 03:24:47 |
|
|
#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 68 struct curparse { |
|
Line 70 struct curparse { |
|
char outopts[BUFSIZ]; /* buf of output opts */ |
char outopts[BUFSIZ]; /* buf of output opts */ |
}; |
}; |
|
|
#if HAVE_SQLITE3 |
|
int apropos(int, char**); |
|
#endif |
|
|
|
static int moptions(int *, char *); |
static int moptions(int *, char *); |
static void mmsg(enum mandocerr, enum mandoclevel, |
static void mmsg(enum mandocerr, enum mandoclevel, |
const char *, int, int, const char *); |
const char *, int, int, const char *); |
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 88 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 100 main(int argc, char *argv[]) |
|
Line 106 main(int argc, char *argv[]) |
|
else |
else |
++progname; |
++progname; |
|
|
#if HAVE_SQLITE3 |
/* Search options. */ |
if (0 == strncmp(progname, "apropos", 7) || |
|
0 == strncmp(progname, "whatis", 6)) |
|
return(apropos(argc, argv)); |
|
#endif |
|
|
|
memset(&curp, 0, sizeof(struct curparse)); |
memset(&paths, 0, sizeof(struct manpaths)); |
|
conf_file = defpaths = auxpaths = NULL; |
|
|
options = MPARSE_SO; |
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, |
Line 130 main(int argc, char *argv[]) |
|
Line 155 main(int argc, char *argv[]) |
|
} |
} |
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 150 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 162 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 */; |