]> git.cameronkatri.com Git - mandoc.git/commitdiff
If no tags were generated at all, unlink(2) the empty tags file as
authorIngo Schwarze <schwarze@openbsd.org>
Fri, 19 Jul 2019 20:27:25 +0000 (20:27 +0000)
committerIngo Schwarze <schwarze@openbsd.org>
Fri, 19 Jul 2019 20:27:25 +0000 (20:27 +0000)
soon as the condition can be detected and do not pass it to less(1).
This may happen for man(7) pages, for preformatted pages, and for
very simple pages like true(1).  The main benefit is that :t inside
less(1) yields the clearer diagnostic message "No tags file" rather
than the mildly confusing "No such tag in tags file": the latter
might encourage further, futile attempts to jump to other tags.

Improvement suggested by Leah Neukirchen <leah at vuxu dot org>
from The Void.

main.c
tag.c

diff --git a/main.c b/main.c
index a535023b971044f8e6b6fba42022afb104838b00..b11f7b51c164c96d90ebbc334fdf9bcb936daade 100644 (file)
--- a/main.c
+++ b/main.c
@@ -1,4 +1,4 @@
-/*     $Id: main.c,v 1.331 2019/07/15 21:41:08 schwarze Exp $ */
+/*     $Id: main.c,v 1.332 2019/07/19 20:27:25 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2012, 2014-2019 Ingo Schwarze <schwarze@openbsd.org>
@@ -1194,7 +1194,7 @@ spawn_pager(struct tag_files *tag_files)
 
        use_ofn = 1;
 #if HAVE_LESS_T
-       if ((cmdlen = strlen(argv[0])) >= 4) {
+       if (*tag_files->tfn != '\0' && (cmdlen = strlen(argv[0])) >= 4) {
                cp = argv[0] + cmdlen - 4;
                if (strcmp(cp, "less") == 0) {
                        argv[argc++] = mandoc_strdup("-T");
diff --git a/tag.c b/tag.c
index 4ba3824176cfc43f9bd4cbabaa0829f7bdc939ed..43571c7f80351185f79643d68414437069030aab 100644 (file)
--- a/tag.c
+++ b/tag.c
@@ -1,4 +1,4 @@
-/*     $Id: tag.c,v 1.22 2019/07/10 19:39:01 schwarze Exp $ */
+/*     $Id: tag.c,v 1.23 2019/07/19 20:27:25 schwarze Exp $ */
 /*
  * Copyright (c) 2015, 2016, 2018, 2019 Ingo Schwarze <schwarze@openbsd.org>
  *
@@ -225,6 +225,7 @@ tag_write(void)
        struct tag_entry        *entry;
        size_t                   i;
        unsigned int             slot;
+       int                      empty;
 
        if (tag_files.tfd <= 0)
                return;
@@ -235,12 +236,16 @@ tag_write(void)
        }
        if ((stream = fdopen(tag_files.tfd, "w")) == NULL)
                mandoc_msg(MANDOCERR_FDOPEN, 0, 0, "%s", strerror(errno));
+       empty = 1;
        entry = ohash_first(&tag_data, &slot);
        while (entry != NULL) {
-               if (stream != NULL && entry->prio >= 0)
-                       for (i = 0; i < entry->nlines; i++)
+               if (stream != NULL && entry->prio >= 0) {
+                       for (i = 0; i < entry->nlines; i++) {
                                fprintf(stream, "%s %s %zu\n",
                                    entry->s, tag_files.ofn, entry->lines[i]);
+                               empty = 0;
+                       }
+               }
                free(entry->lines);
                free(entry);
                entry = ohash_next(&tag_data, &slot);
@@ -251,6 +256,10 @@ tag_write(void)
        else
                close(tag_files.tfd);
        tag_files.tfd = -1;
+       if (empty) {
+               unlink(tag_files.tfn);
+               *tag_files.tfn = '\0';
+       }
 }
 
 void