summaryrefslogtreecommitdiff
path: root/tag.c
diff options
context:
space:
mode:
Diffstat (limited to 'tag.c')
-rw-r--r--tag.c49
1 files changed, 34 insertions, 15 deletions
diff --git a/tag.c b/tag.c
index 473ea7b6f4913..d5e7f89c1a509 100644
--- a/tag.c
+++ b/tag.c
@@ -1,6 +1,6 @@
-/* $Id: tag.c,v 1.21 2018/11/22 11:30:23 schwarze Exp $ */
+/* $Id: tag.c,v 1.24 2019/07/22 03:21:50 schwarze Exp $ */
/*
- * Copyright (c) 2015, 2016, 2018 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2015, 2016, 2018, 2019 Ingo Schwarze <schwarze@openbsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -18,9 +18,7 @@
#include <sys/types.h>
-#if HAVE_ERR
-#include <err.h>
-#endif
+#include <errno.h>
#include <limits.h>
#include <signal.h>
#include <stddef.h>
@@ -32,6 +30,7 @@
#include "mandoc_aux.h"
#include "mandoc_ohash.h"
+#include "mandoc.h"
#include "tag.h"
struct tag_entry {
@@ -83,8 +82,10 @@ tag_init(void)
/* Save the original standard output for use by the pager. */
- if ((tag_files.ofd = dup(STDOUT_FILENO)) == -1)
+ if ((tag_files.ofd = dup(STDOUT_FILENO)) == -1) {
+ mandoc_msg(MANDOCERR_DUP, 0, 0, "%s", strerror(errno));
goto fail;
+ }
/* Create both temporary output files. */
@@ -92,12 +93,20 @@ tag_init(void)
sizeof(tag_files.ofn));
(void)strlcpy(tag_files.tfn, "/tmp/man.XXXXXXXXXX",
sizeof(tag_files.tfn));
- if ((ofd = mkstemp(tag_files.ofn)) == -1)
+ if ((ofd = mkstemp(tag_files.ofn)) == -1) {
+ mandoc_msg(MANDOCERR_MKSTEMP, 0, 0,
+ "%s: %s", tag_files.ofn, strerror(errno));
goto fail;
- if ((tag_files.tfd = mkstemp(tag_files.tfn)) == -1)
+ }
+ if ((tag_files.tfd = mkstemp(tag_files.tfn)) == -1) {
+ mandoc_msg(MANDOCERR_MKSTEMP, 0, 0,
+ "%s: %s", tag_files.tfn, strerror(errno));
goto fail;
- if (dup2(ofd, STDOUT_FILENO) == -1)
+ }
+ if (dup2(ofd, STDOUT_FILENO) == -1) {
+ mandoc_msg(MANDOCERR_DUP, 0, 0, "%s", strerror(errno));
goto fail;
+ }
close(ofd);
/*
@@ -142,11 +151,11 @@ tag_put(const char *s, int prio, size_t line)
s += 2;
/*
- * Skip whitespace and whatever follows it,
+ * Skip whitespace and escapes and whatever follows,
* and if there is any, downgrade the priority.
*/
- len = strcspn(s, " \t");
+ len = strcspn(s, " \t\\");
if (len == 0)
return;
@@ -216,21 +225,27 @@ tag_write(void)
struct tag_entry *entry;
size_t i;
unsigned int slot;
+ int empty;
if (tag_files.tfd <= 0)
return;
if (tag_files.tagname != NULL && ohash_find(&tag_data,
ohash_qlookup(&tag_data, tag_files.tagname)) == NULL) {
- warnx("%s: no such tag", tag_files.tagname);
+ mandoc_msg(MANDOCERR_TAG, 0, 0, "%s", tag_files.tagname);
tag_files.tagname = NULL;
}
- stream = fdopen(tag_files.tfd, "w");
+ 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);
@@ -241,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