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

Diff for /mandoc/main.c between version 1.233 and 1.242

version 1.233, 2015/04/16 16:36:21 version 1.242, 2015/07/19 06:05:16
Line 39 
Line 39 
 #include "roff.h"  #include "roff.h"
 #include "mdoc.h"  #include "mdoc.h"
 #include "man.h"  #include "man.h"
   #include "tag.h"
 #include "main.h"  #include "main.h"
 #include "manconf.h"  #include "manconf.h"
 #include "mansearch.h"  #include "mansearch.h"
Line 58  enum outmode {
Line 59  enum outmode {
         OUTMODE_ONE          OUTMODE_ONE
 };  };
   
 typedef void            (*out_mdoc)(void *, const struct mdoc *);  typedef void            (*out_mdoc)(void *, const struct roff_man *);
 typedef void            (*out_man)(void *, const struct man *);  typedef void            (*out_man)(void *, const struct roff_man *);
 typedef void            (*out_free)(void *);  typedef void            (*out_free)(void *);
   
 enum    outt {  enum    outt {
Line 352  main(int argc, char *argv[])
Line 353  main(int argc, char *argv[])
                 sz = 0;                  sz = 0;
 #endif  #endif
   
                 if (sz == 0 && search.argmode == ARG_NAME)                  if (sz == 0) {
                         fs_search(&search, &conf.manpath,                          if (search.argmode == ARG_NAME)
                             argc, argv, &res, &sz);                                  fs_search(&search, &conf.manpath,
                                       argc, argv, &res, &sz);
                           else
                                   fprintf(stderr,
                                       "%s: nothing appropriate\n",
                                       progname);
                   }
   
                 if (sz == 0) {                  if (sz == 0) {
                         rc = MANDOCLEVEL_BADARG;                          rc = MANDOCLEVEL_BADARG;
Line 412  main(int argc, char *argv[])
Line 419  main(int argc, char *argv[])
         if (search.argmode == ARG_FILE && ! moptions(&options, auxpaths))          if (search.argmode == ARG_FILE && ! moptions(&options, auxpaths))
                 return((int)MANDOCLEVEL_BADARG);                  return((int)MANDOCLEVEL_BADARG);
   
           if (pager_pid == 1 && isatty(STDOUT_FILENO) == 0)
                   pager_pid = 0;
   
         curp.mchars = mchars_alloc();          curp.mchars = mchars_alloc();
         curp.mp = mparse_alloc(options, curp.wlevel, mmsg,          curp.mp = mparse_alloc(options, curp.wlevel, mmsg,
             curp.mchars, defos);              curp.mchars, defos);
Line 423  main(int argc, char *argv[])
Line 433  main(int argc, char *argv[])
                 mparse_keep(curp.mp);                  mparse_keep(curp.mp);
   
         if (argc < 1) {          if (argc < 1) {
                 if (pager_pid == 1 && isatty(STDOUT_FILENO))                  if (pager_pid == 1)
                         pager_pid = spawn_pager();                          pager_pid = spawn_pager();
                 parse(&curp, STDIN_FILENO, "<stdin>");                  parse(&curp, STDIN_FILENO, "<stdin>");
         }          }
Line 435  main(int argc, char *argv[])
Line 445  main(int argc, char *argv[])
                         rc = rctmp;                          rc = rctmp;
   
                 if (fd != -1) {                  if (fd != -1) {
                         if (pager_pid == 1 && isatty(STDOUT_FILENO))                          if (pager_pid == 1)
                                 pager_pid = spawn_pager();                                  pager_pid = spawn_pager();
   
                         if (resp == NULL)                          if (resp == NULL)
Line 448  main(int argc, char *argv[])
Line 458  main(int argc, char *argv[])
                                 passthrough(resp->file, fd,                                  passthrough(resp->file, fd,
                                     conf.output.synopsisonly);                                      conf.output.synopsisonly);
   
                         rctmp = mparse_wait(curp.mp);  
                         if (rc < rctmp)  
                                 rc = rctmp;  
   
                         if (argc > 1 && curp.outtype <= OUTT_UTF8)                          if (argc > 1 && curp.outtype <= OUTT_UTF8)
                                 ascii_sepline(curp.outdata);                                  ascii_sepline(curp.outdata);
                 }                  }
Line 491  out:
Line 497  out:
   
         if (pager_pid != 0 && pager_pid != 1) {          if (pager_pid != 0 && pager_pid != 1) {
                 fclose(stdout);                  fclose(stdout);
                   tag_write();
                 waitpid(pager_pid, NULL, 0);                  waitpid(pager_pid, NULL, 0);
                   tag_unlink();
         }          }
   
         return((int)rc);          return((int)rc);
Line 561  fs_lookup(const struct manpaths *paths, size_t ipath,
Line 569  fs_lookup(const struct manpaths *paths, size_t ipath,
                 free(file);                  free(file);
         }          }
   
         mandoc_asprintf(&file, "%s/man%s/%s.*",          mandoc_asprintf(&file, "%s/man%s/%s.[01-9]*",
             paths->paths[ipath], sec, name);              paths->paths[ipath], sec, name);
         globres = glob(file, 0, NULL, &globinfo);          globres = glob(file, 0, NULL, &globinfo);
         if (globres != 0 && globres != GLOB_NOMATCH)          if (globres != 0 && globres != GLOB_NOMATCH)
Line 632  static void
Line 640  static void
 parse(struct curparse *curp, int fd, const char *file)  parse(struct curparse *curp, int fd, const char *file)
 {  {
         enum mandoclevel  rctmp;          enum mandoclevel  rctmp;
         struct mdoc      *mdoc;          struct roff_man  *man;
         struct man       *man;  
   
         /* Begin by parsing the file itself. */          /* Begin by parsing the file itself. */
   
Line 720  parse(struct curparse *curp, int fd, const char *file)
Line 727  parse(struct curparse *curp, int fd, const char *file)
                 }                  }
         }          }
   
         mparse_result(curp->mp, &mdoc, &man, NULL);          mparse_result(curp->mp, &man, NULL);
   
         /* Execute the out device, if it exists. */          /* Execute the out device, if it exists. */
   
         if (man && curp->outman)          if (man == NULL)
                   return;
           if (curp->outmdoc != NULL && man->macroset == MACROSET_MDOC)
                   (*curp->outmdoc)(curp->outdata, man);
           if (curp->outman != NULL && man->macroset == MACROSET_MAN)
                 (*curp->outman)(curp->outdata, man);                  (*curp->outman)(curp->outdata, man);
         if (mdoc && curp->outmdoc)  
                 (*curp->outmdoc)(curp->outdata, mdoc);  
 }  }
   
 static void  static void
Line 952  spawn_pager(void)
Line 961  spawn_pager(void)
         char            *argv[MAX_PAGER_ARGS];          char            *argv[MAX_PAGER_ARGS];
         const char      *pager;          const char      *pager;
         char            *cp;          char            *cp;
           size_t           cmdlen;
         int              fildes[2];          int              fildes[2];
         int              argc;          int              argc;
         pid_t            pager_pid;          pid_t            pager_pid;
   
           pager = getenv("MANPAGER");
           if (pager == NULL || *pager == '\0')
                   pager = getenv("PAGER");
           if (pager == NULL || *pager == '\0')
                   pager = "more -s";
           cp = mandoc_strdup(pager);
   
           /*
            * Parse the pager command into words.
            * Intentionally do not do anything fancy here.
            */
   
           argc = 0;
           while (argc + 4 < MAX_PAGER_ARGS) {
                   argv[argc++] = cp;
                   cp = strchr(cp, ' ');
                   if (cp == NULL)
                           break;
                   *cp++ = '\0';
                   while (*cp == ' ')
                           cp++;
                   if (*cp == '\0')
                           break;
           }
   
           /* Read all text right away and use the tag file. */
   
           if ((cmdlen = strlen(argv[0])) >= 4) {
                   cp = argv[0] + cmdlen - 4;
                   if (strcmp(cp, "less") == 0 ||
                       strcmp(cp, "more") == 0) {
                           tag_init();
                           argv[argc++] = mandoc_strdup("+G1G");
                           argv[argc++] = mandoc_strdup("-T");
                           argv[argc++] = tag_filename();
                   }
           }
           argv[argc] = NULL;
   
         if (pipe(fildes) == -1) {          if (pipe(fildes) == -1) {
                 fprintf(stderr, "%s: pipe: %s\n",                  fprintf(stderr, "%s: pipe: %s\n",
                     progname, strerror(errno));                      progname, strerror(errno));
Line 991  spawn_pager(void)
Line 1040  spawn_pager(void)
         }          }
         close(fildes[0]);          close(fildes[0]);
   
         pager = getenv("MANPAGER");  
         if (pager == NULL || *pager == '\0')  
                 pager = getenv("PAGER");  
         if (pager == NULL || *pager == '\0')  
                 pager = "more -s";  
         cp = mandoc_strdup(pager);  
   
         /*  
          * Parse the pager command into words.  
          * Intentionally do not do anything fancy here.  
          */  
   
         argc = 0;  
         while (argc + 1 < MAX_PAGER_ARGS) {  
                 argv[argc++] = cp;  
                 cp = strchr(cp, ' ');  
                 if (cp == NULL)  
                         break;  
                 *cp++ = '\0';  
                 while (*cp == ' ')  
                         cp++;  
                 if (*cp == '\0')  
                         break;  
         }  
         argv[argc] = NULL;  
   
         /* Hand over to the pager. */          /* Hand over to the pager. */
   
         execvp(argv[0], argv);          execvp(argv[0], argv);
         fprintf(stderr, "%s: exec: %s\n",          fprintf(stderr, "%s: exec %s: %s\n",
             progname, strerror(errno));              progname, argv[0], strerror(errno));
         exit((int)MANDOCLEVEL_SYSERR);          exit((int)MANDOCLEVEL_SYSERR);
 }  }

Legend:
Removed from v.1.233  
changed lines
  Added in v.1.242

CVSweb