diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2020-04-02 22:12:55 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2020-04-02 22:12:55 +0000 |
commit | dc97ce56e26dda642ede91202db664ff13b2073d (patch) | |
tree | 5fe4bda413200ab4fa421fcd1700ae655bf33b69 /term_tag.h | |
parent | 064e8ea72f2d7bac4d2f3dbd3e2ffc3f6c05774c (diff) | |
download | mandoc-dc97ce56e26dda642ede91202db664ff13b2073d.tar.gz |
When the last file formatted yielded no tags, the tags file got
deleted before starting the pager, even when earlier input files
had written to it; thanks to weerd@ for reporting that bug.
Since we now generate tags for section headers, we almost always
generate at least some. Consequently, while fixing the above bug,
simplify the code by never deleting the tags file before the pager
exits, not even in the rare case that the file happens to be empty.
Hence, this patch is -75 +63 LOC even though it fixes two bugs.
While deleting the output files belongs after exit from the pager,
closing them should be done before it is started. Collect the
related code, which was scattered in various places, to where
it belongs, in a dedicated function in the term_tag.c module.
As a side benefit, never fclose(2) stdout, only dup2(2) to it.
Similarly, when the -O tag argument wasn't found in the last file
formatted, there was a complaint about "no such tag" even when the
argument did occur in earlier files. Fix that by looking for a
matching tag after every formatted file rather than just once at
the very end. Given that command line arguments aren't properties
of the file(s) being formatted, that check is a job for the main
program, not for the formatters, so while fixing the check, move
it from term_tag.c to main.c.
Diffstat (limited to 'term_tag.h')
-rw-r--r-- | term_tag.h | 5 |
1 files changed, 2 insertions, 3 deletions
@@ -21,7 +21,6 @@ struct tag_files { char ofn[20]; /* Output file name. */ char tfn[20]; /* Tag file name. */ - char *tagname; /* Target specified with -O. */ FILE *tfs; /* Tag file object. */ int ofd; /* Original output file descriptor. */ pid_t tcpgid; /* Process group controlling the terminal. */ @@ -29,7 +28,7 @@ struct tag_files { }; -struct tag_files *term_tag_init(char *); +struct tag_files *term_tag_init(void); void term_tag_write(struct roff_node *, size_t); -void term_tag_finish(void); +int term_tag_close(void); void term_tag_unlink(void); |