]> git.cameronkatri.com Git - mandoc.git/blobdiff - main.c
Make HTML tags lower case for better stylistic agreement with what
[mandoc.git] / main.c
diff --git a/main.c b/main.c
index ccebdb4d922b6202d39fde38f1610bd6c02a2e67..eb056230c4c64fff51a1d13fea84de04b6d56d3d 100644 (file)
--- a/main.c
+++ b/main.c
@@ -1,7 +1,7 @@
-/*     $Id: main.c,v 1.261 2016/01/08 02:13:39 schwarze Exp $ */
+/*     $Id: main.c,v 1.265 2016/04/14 20:55:48 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2010-2012, 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2010-2012, 2014-2016 Ingo Schwarze <schwarze@openbsd.org>
  * Copyright (c) 2010 Joerg Sonnenberger <joerg@netbsd.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
@@ -35,6 +35,7 @@
 #include <stdint.h>
 #include <stdlib.h>
 #include <string.h>
+#include <time.h>
 #include <unistd.h>
 
 #include "mandoc_aux.h"
@@ -123,10 +124,9 @@ main(int argc, char *argv[])
        unsigned char   *uc;
        struct manpage  *res, *resp;
        char            *conf_file, *defpaths;
-       size_t           isec, i, sz;
+       const char      *sec;
+       size_t           i, sz;
        int              prio, best_prio;
-       char             sec;
-       enum mandoclevel rctmp;
        enum outmode     outmode;
        int              fd;
        int              show_usage;
@@ -390,7 +390,7 @@ main(int argc, char *argv[])
 
                if (outmode == OUTMODE_ONE) {
                        argc = 1;
-                       best_prio = 10;
+                       best_prio = 20;
                } else if (outmode == OUTMODE_ALL)
                        argc = (int)sz;
 
@@ -406,11 +406,13 @@ main(int argc, char *argv[])
                                    res[i].output);
                        else if (outmode == OUTMODE_ONE) {
                                /* Search for the best section. */
-                               isec = strcspn(res[i].file, "123456789");
-                               sec = res[i].file[isec];
-                               if ('\0' == sec)
+                               sec = res[i].file;
+                               sec += strcspn(sec, "123456789");
+                               if (sec[0] == '\0')
                                        continue;
-                               prio = sec_prios[sec - '1'];
+                               prio = sec_prios[sec[0] - '1'];
+                               if (sec[1] != '/')
+                                       prio += 10;
                                if (prio >= best_prio)
                                        continue;
                                best_prio = prio;
@@ -459,11 +461,7 @@ main(int argc, char *argv[])
        }
 
        while (argc > 0) {
-               rctmp = mparse_open(curp.mp, &fd,
-                   resp != NULL ? resp->file : *argv);
-               if (rc < rctmp)
-                       rc = rctmp;
-
+               fd = mparse_open(curp.mp, resp != NULL ? resp->file : *argv);
                if (fd != -1) {
                        if (use_pager) {
                                tag_files = tag_init();
@@ -482,7 +480,8 @@ main(int argc, char *argv[])
 
                        if (argc > 1 && curp.outtype <= OUTT_UTF8)
                                ascii_sepline(curp.outdata);
-               }
+               } else if (rc < MANDOCLEVEL_ERROR)
+                       rc = MANDOCLEVEL_ERROR;
 
                if (MANDOCLEVEL_OK != rc && curp.wstop)
                        break;
@@ -685,7 +684,7 @@ fs_search(const struct mansearch *cfg, const struct manpaths *paths,
        int argc, char **argv, struct manpage **res, size_t *ressz)
 {
        const char *const sections[] =
-           {"1", "8", "6", "2", "3", "3p", "5", "7", "4", "9"};
+           {"1", "8", "6", "2", "3", "5", "7", "4", "9", "3p"};
        const size_t nsec = sizeof(sections)/sizeof(sections[0]);
 
        size_t           ipath, isec, lastsz;
@@ -724,7 +723,7 @@ parse(struct curparse *curp, int fd, const char *file)
        /* Begin by parsing the file itself. */
 
        assert(file);
-       assert(fd > 0);
+       assert(fd >= 0);
 
        rctmp = mparse_readfd(curp->mp, fd, file);
        if (fd != STDIN_FILENO)
@@ -1022,6 +1021,7 @@ mmsg(enum mandocerr t, enum mandoclevel lvl,
 static pid_t
 spawn_pager(struct tag_files *tag_files)
 {
+       const struct timespec timeout = { 0, 100000000 };  /* 0.1s */
 #define MAX_PAGER_ARGS 16
        char            *argv[MAX_PAGER_ARGS];
        const char      *pager;
@@ -1071,8 +1071,6 @@ spawn_pager(struct tag_files *tag_files)
        case -1:
                err((int)MANDOCLEVEL_SYSERR, "fork");
        case 0:
-               /* Set pgrp in both parent and child to avoid racing exec. */
-               (void)setpgid(0, 0);
                break;
        default:
                (void)setpgid(pager_pid, 0);
@@ -1091,6 +1089,12 @@ spawn_pager(struct tag_files *tag_files)
                err((int)MANDOCLEVEL_SYSERR, "pager stdout");
        close(tag_files->ofd);
        close(tag_files->tfd);
+
+       /* Do not start the pager before controlling the terminal. */
+
+       while (tcgetpgrp(STDIN_FILENO) != getpid())
+               nanosleep(&timeout, NULL);
+
        execvp(argv[0], argv);
        err((int)MANDOCLEVEL_SYSERR, "exec %s", argv[0]);
 }