[BACK]Return to main.c CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / mandoc

Diff for /mandoc/main.c between version 1.179 and 1.180

version 1.179, 2014/08/16 23:04:25 version 1.180, 2014/08/17 03:24:47
Line 32 
Line 32 
 #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)
Line 190  static void
Line 260  static void
 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);
 }  }
   
Line 328  static int
Line 409  static int
 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 */;

Legend:
Removed from v.1.179  
changed lines
  Added in v.1.180

CVSweb