From a523088e937ba170e198c1080112d6bfab51a27c Mon Sep 17 00:00:00 2001 From: Ingo Schwarze Date: Fri, 19 Jul 2019 20:27:25 +0000 Subject: If no tags were generated at all, unlink(2) the empty tags file as 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 from The Void. --- main.c | 2 +- tag.c | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/main.c b/main.c index e5a3976b..307e65dc 100644 --- a/main.c +++ b/main.c @@ -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 a0b0cd35..edff5064 100644 --- a/tag.c +++ b/tag.c @@ -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 -- cgit