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

Diff for /mandoc/main.c between version 1.317 and 1.327

version 1.317, 2019/01/10 06:29:00 version 1.327, 2019/05/03 18:39:34
Line 21 
Line 21 
 #include <sys/types.h>  #include <sys/types.h>
 #include <sys/ioctl.h>  #include <sys/ioctl.h>
 #include <sys/param.h>  /* MACHINE */  #include <sys/param.h>  /* MACHINE */
 #include <sys/termios.h>  #include <sys/stat.h>
 #include <sys/wait.h>  #include <sys/wait.h>
   
 #include <assert.h>  #include <assert.h>
Line 40 
Line 40 
 #include <stdint.h>  #include <stdint.h>
 #include <stdlib.h>  #include <stdlib.h>
 #include <string.h>  #include <string.h>
   #include <termios.h>
 #include <time.h>  #include <time.h>
 #include <unistd.h>  #include <unistd.h>
   
Line 125  main(int argc, char *argv[])
Line 126  main(int argc, char *argv[])
         char            *conf_file, *defpaths, *auxpaths;          char            *conf_file, *defpaths, *auxpaths;
         char            *oarg, *tagarg;          char            *oarg, *tagarg;
         unsigned char   *uc;          unsigned char   *uc;
         size_t           i, sz;          size_t           i, sz, ssz;
         int              prio, best_prio;          int              prio, best_prio;
         enum outmode     outmode;          enum outmode     outmode;
         int              fd, startdir;          int              fd, startdir;
Line 299  main(int argc, char *argv[])
Line 300  main(int argc, char *argv[])
                         search.outkey = oarg;                          search.outkey = oarg;
                 else {                  else {
                         while (oarg != NULL) {                          while (oarg != NULL) {
                                 thisarg = oarg;  
                                 if (manconf_output(&conf.output,                                  if (manconf_output(&conf.output,
                                     strsep(&oarg, ","), 0) == 0)                                      strsep(&oarg, ","), 0) == -1)
                                         continue;                                          return (int)MANDOCLEVEL_BADARG;
                                 warnx("-O %s: Bad argument", thisarg);  
                                 return (int)MANDOCLEVEL_BADARG;  
                         }                          }
                 }                  }
         }          }
Line 355  main(int argc, char *argv[])
Line 353  main(int argc, char *argv[])
                 } else if (argc > 1 &&                  } else if (argc > 1 &&
                     ((uc = (unsigned char *)argv[0]) != NULL) &&                      ((uc = (unsigned char *)argv[0]) != NULL) &&
                     ((isdigit(uc[0]) && (uc[1] == '\0' ||                      ((isdigit(uc[0]) && (uc[1] == '\0' ||
                       (isalpha(uc[1]) && uc[2] == '\0'))) ||                        isalpha(uc[1]))) ||
                      (uc[0] == 'n' && uc[1] == '\0'))) {                       (uc[0] == 'n' && uc[1] == '\0'))) {
                         search.sec = (char *)uc;                          search.sec = (char *)uc;
                         argv++;                          argv++;
Line 411  main(int argc, char *argv[])
Line 409  main(int argc, char *argv[])
                                 res[sz].file = mandoc_strdup(argv[c]);                                  res[sz].file = mandoc_strdup(argv[c]);
                                 res[sz].names = NULL;                                  res[sz].names = NULL;
                                 res[sz].output = NULL;                                  res[sz].output = NULL;
                                   res[sz].bits = 0;
                                 res[sz].ipath = SIZE_MAX;                                  res[sz].ipath = SIZE_MAX;
                                 res[sz].sec = 10;                                  res[sz].sec = 10;
                                 res[sz].form = FORM_SRC;                                  res[sz].form = FORM_SRC;
Line 433  main(int argc, char *argv[])
Line 432  main(int argc, char *argv[])
   
                 if (outmode == OUTMODE_ONE) {                  if (outmode == OUTMODE_ONE) {
                         argc = 1;                          argc = 1;
                         best_prio = 20;                          best_prio = 40;
                 } else if (outmode == OUTMODE_ALL)                  } else if (outmode == OUTMODE_ALL)
                         argc = (int)sz;                          argc = (int)sz;
   
Line 452  main(int argc, char *argv[])
Line 451  main(int argc, char *argv[])
                                 sec = res[i].file;                                  sec = res[i].file;
                                 sec += strcspn(sec, "123456789");                                  sec += strcspn(sec, "123456789");
                                 if (sec[0] == '\0')                                  if (sec[0] == '\0')
                                         continue;                                          continue; /* No section at all. */
                                 prio = sec_prios[sec[0] - '1'];                                  prio = sec_prios[sec[0] - '1'];
                                 if (sec[1] != '/')                                  if (search.sec != NULL) {
                                         prio += 10;                                          ssz = strlen(search.sec);
                                           if (strncmp(sec, search.sec, ssz) == 0)
                                                   sec += ssz;
                                   } else
                                           sec++; /* Prefer without suffix. */
                                   if (*sec != '/')
                                           prio += 10; /* Wrong dir name. */
                                   if (search.sec != NULL &&
                                       (strlen(sec) <= ssz  + 3 ||
                                        strcmp(sec + strlen(sec) - ssz,
                                         search.sec) != 0))
                                           prio += 20; /* Wrong file ext. */
                                 if (prio >= best_prio)                                  if (prio >= best_prio)
                                         continue;                                          continue;
                                 best_prio = prio;                                  best_prio = prio;
Line 561  main(int argc, char *argv[])
Line 571  main(int argc, char *argv[])
                         }                          }
                 } else                  } else
                         mandoc_msg(MANDOCERR_FILE, 0, 0,                          mandoc_msg(MANDOCERR_FILE, 0, 0,
                             "%s", strerror(errno));                              "%s: %s", thisarg, strerror(errno));
   
                 if (curp.wstop && mandoc_msg_getrc() != MANDOCLEVEL_OK)                  if (curp.wstop && mandoc_msg_getrc() != MANDOCLEVEL_OK)
                         break;                          break;
Line 701  fs_lookup(const struct manpaths *paths, size_t ipath,
Line 711  fs_lookup(const struct manpaths *paths, size_t ipath,
         const char *sec, const char *arch, const char *name,          const char *sec, const char *arch, const char *name,
         struct manpage **res, size_t *ressz)          struct manpage **res, size_t *ressz)
 {  {
           struct stat      sb;
         glob_t           globinfo;          glob_t           globinfo;
         struct manpage  *page;          struct manpage  *page;
         char            *file;          char            *file;
Line 710  fs_lookup(const struct manpaths *paths, size_t ipath,
Line 721  fs_lookup(const struct manpaths *paths, size_t ipath,
         form = FORM_SRC;          form = FORM_SRC;
         mandoc_asprintf(&file, "%s/man%s/%s.%s",          mandoc_asprintf(&file, "%s/man%s/%s.%s",
             paths->paths[ipath], sec, name, sec);              paths->paths[ipath], sec, name, sec);
         if (access(file, R_OK) != -1)          if (stat(file, &sb) != -1)
                 goto found;                  goto found;
         free(file);          free(file);
   
         mandoc_asprintf(&file, "%s/cat%s/%s.0",          mandoc_asprintf(&file, "%s/cat%s/%s.0",
             paths->paths[ipath], sec, name);              paths->paths[ipath], sec, name);
         if (access(file, R_OK) != -1) {          if (stat(file, &sb) != -1) {
                 form = FORM_CAT;                  form = FORM_CAT;
                 goto found;                  goto found;
         }          }
Line 725  fs_lookup(const struct manpaths *paths, size_t ipath,
Line 736  fs_lookup(const struct manpaths *paths, size_t ipath,
         if (arch != NULL) {          if (arch != NULL) {
                 mandoc_asprintf(&file, "%s/man%s/%s/%s.%s",                  mandoc_asprintf(&file, "%s/man%s/%s/%s.%s",
                     paths->paths[ipath], sec, arch, name, sec);                      paths->paths[ipath], sec, arch, name, sec);
                 if (access(file, R_OK) != -1)                  if (stat(file, &sb) != -1)
                         goto found;                          goto found;
                 free(file);                  free(file);
         }          }
Line 739  fs_lookup(const struct manpaths *paths, size_t ipath,
Line 750  fs_lookup(const struct manpaths *paths, size_t ipath,
         if (globres == 0)          if (globres == 0)
                 file = mandoc_strdup(*globinfo.gl_pathv);                  file = mandoc_strdup(*globinfo.gl_pathv);
         globfree(&globinfo);          globfree(&globinfo);
         if (globres == 0)          if (globres == 0) {
                 goto found;                  if (stat(file, &sb) != -1)
                           goto found;
                   free(file);
           }
         if (res != NULL || ipath + 1 != paths->sz)          if (res != NULL || ipath + 1 != paths->sz)
                 return 0;                  return 0;
   
         mandoc_asprintf(&file, "%s.%s", name, sec);          mandoc_asprintf(&file, "%s.%s", name, sec);
         globres = access(file, R_OK);          globres = stat(file, &sb);
         free(file);          free(file);
         return globres != -1;          return globres != -1;
   
Line 761  found:
Line 775  found:
         page->file = file;          page->file = file;
         page->names = NULL;          page->names = NULL;
         page->output = NULL;          page->output = NULL;
           page->bits = NAME_FILE & NAME_MASK;
         page->ipath = ipath;          page->ipath = ipath;
         page->sec = (*sec >= '1' && *sec <= '9') ? *sec - '1' + 1 : 10;          page->sec = (*sec >= '1' && *sec <= '9') ? *sec - '1' + 1 : 10;
         page->form = form;          page->form = form;
Line 797  fs_search(const struct mansearch *cfg, const struct ma
Line 812  fs_search(const struct mansearch *cfg, const struct ma
                 }                  }
                 if (res != NULL && *ressz == lastsz &&                  if (res != NULL && *ressz == lastsz &&
                     strchr(*argv, '/') == NULL) {                      strchr(*argv, '/') == NULL) {
                         if (cfg->sec == NULL)                          if (cfg->arch != NULL &&
                               arch_valid(cfg->arch, OSENUM) == 0)
                                   warnx("Unknown architecture \"%s\".",
                                       cfg->arch);
                           else if (cfg->sec == NULL)
                                 warnx("No entry for %s in the manual.",                                  warnx("No entry for %s in the manual.",
                                     *argv);                                      *argv);
                         else                          else
Line 835  parse(struct curparse *curp, int fd, const char *file)
Line 854  parse(struct curparse *curp, int fd, const char *file)
   
         if (curp->outdata == NULL)          if (curp->outdata == NULL)
                 outdata_alloc(curp);                  outdata_alloc(curp);
           else if (curp->outtype == OUTT_HTML)
                   html_reset(curp);
   
         mandoc_xr_reset();          mandoc_xr_reset();
         meta = mparse_result(curp->mp);          meta = mparse_result(curp->mp);
Line 1155  spawn_pager(struct tag_files *tag_files)
Line 1176  spawn_pager(struct tag_files *tag_files)
         char            *argv[MAX_PAGER_ARGS];          char            *argv[MAX_PAGER_ARGS];
         const char      *pager;          const char      *pager;
         char            *cp;          char            *cp;
   #if HAVE_LESS_T
         size_t           cmdlen;          size_t           cmdlen;
   #endif
         int              argc, use_ofn;          int              argc, use_ofn;
         pid_t            pager_pid;          pid_t            pager_pid;
   
Line 1187  spawn_pager(struct tag_files *tag_files)
Line 1210  spawn_pager(struct tag_files *tag_files)
         /* For less(1), use the tag file. */          /* For less(1), use the tag file. */
   
         use_ofn = 1;          use_ofn = 1;
   #if HAVE_LESS_T
         if ((cmdlen = strlen(argv[0])) >= 4) {          if ((cmdlen = strlen(argv[0])) >= 4) {
                 cp = argv[0] + cmdlen - 4;                  cp = argv[0] + cmdlen - 4;
                 if (strcmp(cp, "less") == 0) {                  if (strcmp(cp, "less") == 0) {
Line 1199  spawn_pager(struct tag_files *tag_files)
Line 1223  spawn_pager(struct tag_files *tag_files)
                         }                          }
                 }                  }
         }          }
   #endif
         if (use_ofn)          if (use_ofn)
                 argv[argc++] = tag_files->ofn;                  argv[argc++] = tag_files->ofn;
         argv[argc] = NULL;          argv[argc] = NULL;

Legend:
Removed from v.1.317  
changed lines
  Added in v.1.327

CVSweb