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

Diff for /mandoc/main.c between version 1.337 and 1.338

version 1.337, 2019/07/28 13:13:03 version 1.338, 2019/07/28 18:23:17
Line 120  main(int argc, char *argv[])
Line 120  main(int argc, char *argv[])
         struct outstate  outst;         /* Output state. */          struct outstate  outst;         /* Output state. */
         struct winsize   ws;            /* Result of ioctl(TIOCGWINSZ). */          struct winsize   ws;            /* Result of ioctl(TIOCGWINSZ). */
         struct mansearch search;        /* Search options. */          struct mansearch search;        /* Search options. */
         struct manpage  *res, *resp;    /* Search results. */          struct manpage  *res;           /* Complete list of search results. */
           struct manpage  *resn;          /* Search results for one name. */
         struct mparse   *mp;            /* Opaque parser object. */          struct mparse   *mp;            /* Opaque parser object. */
         const char      *conf_file;     /* -C: alternate config file. */          const char      *conf_file;     /* -C: alternate config file. */
         const char      *os_s;          /* -I: Operating system for display. */          const char      *os_s;          /* -I: Operating system for display. */
Line 130  main(int argc, char *argv[])
Line 131  main(int argc, char *argv[])
         char            *oarg;          /* -O: output option string. */          char            *oarg;          /* -O: output option string. */
         char            *tagarg;        /* -O tag: default value. */          char            *tagarg;        /* -O tag: default value. */
         unsigned char   *uc;          unsigned char   *uc;
         size_t           sz;            /* Number of elements in res[]. */          size_t           ressz;         /* Number of elements in res[]. */
         size_t           i, ssz;          size_t           resnsz;        /* Number of elements in resn[]. */
           size_t           i, ib, ssz;
         int              options;       /* Parser options. */          int              options;       /* Parser options. */
         int              show_usage;    /* Invalid argument: give up. */          int              show_usage;    /* Invalid argument: give up. */
         int              prio, best_prio;          int              prio, best_prio;
Line 384  main(int argc, char *argv[])
Line 386  main(int argc, char *argv[])
                 argc -= optind;                  argc -= optind;
                 argv += optind;                  argv += optind;
         }          }
         resp = NULL;  
   
         /*          /*
          * Quirks for help(1)           * Quirks for help(1) and man(1),
          * and for a man(1) section argument without -s.           * in particular for a section argument without -s.
          */           */
   
         if (search.argmode == ARG_NAME) {          if (search.argmode == ARG_NAME) {
Line 412  main(int argc, char *argv[])
Line 413  main(int argc, char *argv[])
                 if (search.arch == NULL)                  if (search.arch == NULL)
                         search.arch = MACHINE;                          search.arch = MACHINE;
 #endif  #endif
                   if (outmode == OUTMODE_ONE)
                           search.firstmatch = 1;
         }          }
   
         /*          /*
Line 425  main(int argc, char *argv[])
Line 428  main(int argc, char *argv[])
                 conf.output.tag = tagarg == NULL ? *argv : tagarg + 1;                  conf.output.tag = tagarg == NULL ? *argv : tagarg + 1;
         }          }
   
         /* man(1), whatis(1), apropos(1) */          /* Read the configuration file. */
   
         if (search.argmode != ARG_FILE) {          if (search.argmode != ARG_FILE)
                 if (search.argmode == ARG_NAME &&  
                     outmode == OUTMODE_ONE)  
                         search.firstmatch = 1;  
   
                 /* Access the mandoc database. */  
   
                 manconf_parse(&conf, conf_file, defpaths, auxpaths);                  manconf_parse(&conf, conf_file, defpaths, auxpaths);
                 if ( ! mansearch(&search, &conf.manpath,  
                     argc, argv, &res, &sz))  
                         usage(search.argmode);  
   
                 if (sz == 0 && search.argmode == ARG_NAME)          /* man(1): Resolve each name individually. */
                         (void)fs_search(&search, &conf.manpath,  
                             argc, argv, &res, &sz);  
   
                 if (search.argmode == ARG_NAME) {          if (search.argmode == ARG_NAME) {
                         for (c = 0; c < argc; c++) {                  if (argc < 1)
                                 if (strchr(argv[c], '/') == NULL)                          usage(ARG_NAME);
                   for (res = NULL, ressz = 0; argc > 0; argc--, argv++) {
                           (void)mansearch(&search, &conf.manpath,
                               1, argv, &resn, &resnsz);
                           if (resnsz == 0)
                                   (void)fs_search(&search, &conf.manpath,
                                       1, argv, &resn, &resnsz);
                           if (resnsz == 0) {
                                   if (strchr(*argv, '/') == NULL) {
                                           mandoc_msg_setrc(MANDOCLEVEL_BADARG);
                                         continue;                                          continue;
                                 if (access(argv[c], R_OK) == -1) {                                  }
                                         mandoc_msg_setinfilename(argv[c]);                                  if (access(*argv, R_OK) == -1) {
                                           mandoc_msg_setinfilename(*argv);
                                         mandoc_msg(MANDOCERR_BADARG_BAD,                                          mandoc_msg(MANDOCERR_BADARG_BAD,
                                             0, 0, "%s", strerror(errno));                                              0, 0, "%s", strerror(errno));
                                         mandoc_msg_setinfilename(NULL);                                          mandoc_msg_setinfilename(NULL);
                                         continue;                                          continue;
                                 }                                  }
                                   resnsz = 1;
                                   resn = mandoc_calloc(resnsz, sizeof(*res));
                                   resn->file = mandoc_strdup(*argv);
                                   resn->ipath = SIZE_MAX;
                                   resn->form = FORM_SRC;
                           }
                           if (outmode != OUTMODE_ONE || resnsz == 1) {
                                 res = mandoc_reallocarray(res,                                  res = mandoc_reallocarray(res,
                                     sz + 1, sizeof(*res));                                      ressz + resnsz, sizeof(*res));
                                 res[sz].file = mandoc_strdup(argv[c]);                                  memcpy(res + ressz, resn,
                                 res[sz].names = NULL;                                      sizeof(*resn) * resnsz);
                                 res[sz].output = NULL;                                  ressz += resnsz;
                                 res[sz].bits = 0;                                  continue;
                                 res[sz].ipath = SIZE_MAX;  
                                 res[sz].sec = 10;  
                                 res[sz].form = FORM_SRC;  
                                 sz++;  
                         }                          }
                 }  
   
                 if (sz == 0) {                          /* Search for the best section. */
                         if (search.argmode != ARG_NAME)  
                                 warnx("nothing appropriate");  
                         mandoc_msg_setrc(MANDOCLEVEL_BADARG);  
                         goto out;  
                 }  
   
                 /*  
                  * For standard man(1) and -a output mode,  
                  * prepare for copying filename pointers  
                  * into the program parameter array.  
                  */  
   
                 if (outmode == OUTMODE_ONE) {  
                         argc = 1;  
                         best_prio = 40;                          best_prio = 40;
                 } else if (outmode == OUTMODE_ALL)                          for (ib = i = 0; i < resnsz; i++) {
                         argc = (int)sz;                                  sec = resn[i].file;
   
                 /* Iterate all matching manuals. */  
   
                 resp = res;  
                 for (i = 0; i < sz; i++) {  
                         if (outmode == OUTMODE_FLN)  
                                 puts(res[i].file);  
                         else if (outmode == OUTMODE_LST)  
                                 printf("%s - %s\n", res[i].names,  
                                     res[i].output == NULL ? "" :  
                                     res[i].output);  
                         else if (outmode == OUTMODE_ONE) {  
                                 /* Search for the best section. */  
                                 sec = res[i].file;  
                                 sec += strcspn(sec, "123456789");                                  sec += strcspn(sec, "123456789");
                                 if (sec[0] == '\0')                                  if (sec[0] == '\0')
                                         continue; /* No section at all. */                                          continue; /* No section at all. */
Line 519  main(int argc, char *argv[])
Line 496  main(int argc, char *argv[])
                                 if (prio >= best_prio)                                  if (prio >= best_prio)
                                         continue;                                          continue;
                                 best_prio = prio;                                  best_prio = prio;
                                 resp = res + i;                                  ib = i;
                         }                          }
                           res = mandoc_reallocarray(res, ressz + 1,
                               sizeof(*res));
                           memcpy(res + ressz++, resn + ib, sizeof(*resn));
                 }                  }
   
                 /*          /* apropos(1), whatis(1): Process the full search expression. */
                  * For man(1), -a and -i output mode, fall through  
                  * to the main mandoc(1) code iterating files  
                  * and running the parsers on each of them.  
                  */  
   
                 if (outmode == OUTMODE_FLN || outmode == OUTMODE_LST)          } else if (search.argmode != ARG_FILE) {
                   if (mansearch(&search, &conf.manpath,
                       argc, argv, &res, &ressz) == 0)
                           usage(search.argmode);
   
                   if (ressz == 0) {
                           warnx("nothing appropriate");
                           mandoc_msg_setrc(MANDOCLEVEL_BADARG);
                         goto out;                          goto out;
                   }
   
           /* mandoc(1): Take command line arguments as file names. */
   
         } else {          } else {
                 sz = argc > 0 ? argc : 1;                  ressz = argc > 0 ? argc : 1;
                 resp = res = mandoc_recallocarray(NULL, 0, sz, sizeof(*res));                  res = mandoc_calloc(ressz, sizeof(*res));
                 for (i = 0; i < sz; i++) {                  for (i = 0; i < ressz; i++) {
                         if (argc > 0)                          if (argc > 0)
                                 res[i].file = mandoc_strdup(argv[i]);                                  res[i].file = mandoc_strdup(argv[i]);
                         res[i].ipath = SIZE_MAX;                          res[i].ipath = SIZE_MAX;
                         res[i].form = FORM_SRC;                          res[i].form = FORM_SRC;
                 }                  }
                 if (argc < 1)  
                         argc = 1;  
         }          }
   
         /* mandoc(1) */          switch (outmode) {
           case OUTMODE_FLN:
                   for (i = 0; i < ressz; i++)
                           puts(res[i].file);
                   goto out;
           case OUTMODE_LST:
                   for (i = 0; i < ressz; i++)
                           printf("%s - %s\n", res[i].names,
                               res[i].output == NULL ? "" :
                               res[i].output);
                   goto out;
           default:
                   break;
           }
   
 #if HAVE_PLEDGE  #if HAVE_PLEDGE
         if (outst.use_pager) {          if (outst.use_pager) {
Line 581  main(int argc, char *argv[])
Line 579  main(int argc, char *argv[])
          */           */
         startdir = open(".", O_RDONLY | O_DIRECTORY);          startdir = open(".", O_RDONLY | O_DIRECTORY);
   
         while (argc-- > 0) {          for (i = 0; i < ressz; i++) {
                 process_onefile(mp, resp++, startdir, &outst, &conf);                  process_onefile(mp, res + i, startdir, &outst, &conf);
                 if (outst.wstop && mandoc_msg_getrc() != MANDOCLEVEL_OK)                  if (outst.wstop && mandoc_msg_getrc() != MANDOCLEVEL_OK)
                         break;                          break;
         }          }
Line 614  main(int argc, char *argv[])
Line 612  main(int argc, char *argv[])
         mchars_free();          mchars_free();
   
 out:  out:
         mansearch_free(res, sz);          mansearch_free(res, ressz);
         if (search.argmode != ARG_FILE)          if (search.argmode != ARG_FILE)
                 manconf_free(&conf);                  manconf_free(&conf);
   

Legend:
Removed from v.1.337  
changed lines
  Added in v.1.338

CVSweb