]> git.cameronkatri.com Git - mandoc.git/commitdiff
Introduce a new mdoc(7) macro .Tg ("tag") to explicitly mark a place
authorIngo Schwarze <schwarze@openbsd.org>
Sun, 19 Jan 2020 18:02:00 +0000 (18:02 +0000)
committerIngo Schwarze <schwarze@openbsd.org>
Sun, 19 Jan 2020 18:02:00 +0000 (18:02 +0000)
as defining a term.  Please only use it when automatic tagging does
not work.  Manual page authors will not be required to add the new
macro; using it remains optional.  HTML output is still rudimentary
in this version and will be polished later.

Thanks to kn@ for reminding me that i have been considering since
BSDCan 2014 whether something like this might be useful.  Given
that possibilities of making automatic tagging better are running
out and there are still several situations where automatic tagging
cannot do the job, i think the time is now ripe.

Feedback and no objection from millert@; OK espie@ inoguchi@ kn@.

15 files changed:
html.c
html.h
mandoc.h
mandoc_msg.c
mdoc.7
mdoc_html.c
mdoc_macro.c
mdoc_man.c
mdoc_markdown.c
mdoc_state.c
mdoc_term.c
mdoc_validate.c
roff.c
roff.h
tag.c

diff --git a/html.c b/html.c
index 50fa78ce0cc5b2e30b9cae689dc5f4fe7f964b54..28be30152e7ccf93e12eb70ad7a036be41bedb6f 100644 (file)
--- a/html.c
+++ b/html.c
@@ -1,4 +1,4 @@
-/*     $Id: html.c,v 1.261 2019/09/05 13:35:04 schwarze Exp $ */
+/*     $Id: html.c,v 1.262 2020/01/19 18:02:00 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2011-2015, 2017-2019 Ingo Schwarze <schwarze@openbsd.org>
@@ -88,6 +88,7 @@ static        const struct htmldata htmltags[TAG_MAX] = {
        {"span",        HTML_INPHRASE | HTML_TOPHRASE},
        {"var",         HTML_INPHRASE | HTML_TOPHRASE},
        {"br",          HTML_INPHRASE | HTML_NOSTACK | HTML_NLALL},
+       {"mark",        HTML_INPHRASE | HTML_NOSTACK },
        {"math",        HTML_INPHRASE | HTML_NLALL | HTML_INDENT},
        {"mrow",        0},
        {"mi",          0},
diff --git a/html.h b/html.h
index dc4a19cf250f27fd0bed3fd5de96062253a7addd..ac463b9722fa1c8a3c3a113a173839f371ee92be 100644 (file)
--- a/html.h
+++ b/html.h
@@ -1,4 +1,4 @@
-/*     $Id: html.h,v 1.105 2019/09/01 15:12:19 schwarze Exp $ */
+/*     $Id: html.h,v 1.106 2020/01/19 18:02:00 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2017, 2018, 2019 Ingo Schwarze <schwarze@openbsd.org>
@@ -48,6 +48,7 @@ enum  htmltag {
        TAG_SPAN,
        TAG_VAR,
        TAG_BR,
+       TAG_MARK,
        TAG_MATH,
        TAG_MROW,
        TAG_MI,
index 24ce01840e12da2851e5276e5a6e96fde504fe54..8379f9727a8a139fc4d48e236a08d42f2123664f 100644 (file)
--- a/mandoc.h
+++ b/mandoc.h
@@ -1,4 +1,4 @@
-/*     $Id: mandoc.h,v 1.265 2020/01/19 16:44:50 schwarze Exp $ */
+/*     $Id: mandoc.h,v 1.266 2020/01/19 18:02:00 schwarze Exp $ */
 /*
  * Copyright (c) 2010, 2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2012-2020 Ingo Schwarze <schwarze@openbsd.org>
@@ -223,6 +223,7 @@ enum        mandocerr {
        MANDOCERR_SHIFT, /* excessive shift: ..., but max is ... */
        MANDOCERR_SO_PATH, /* NOT IMPLEMENTED: .so with absolute path or ".." */
        MANDOCERR_SO_FAIL, /* .so request failed */
+       MANDOCERR_TG_SPC, /* skipping tag containing whitespace: tag */
        MANDOCERR_ARG_SKIP, /* skipping all arguments: macro args */
        MANDOCERR_ARG_EXCESS, /* skipping excess arguments: macro ... args */
        MANDOCERR_DIVZERO, /* divide by zero */
index 78d3463eadc544f8538a95c2aa5740745a1fbcc0..4a3e5203b338c9c4fb034b5c956ab441d1ddb3d1 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mandoc_msg.c,v 1.9 2020/01/19 16:44:50 schwarze Exp $ */
+/*     $Id: mandoc_msg.c,v 1.10 2020/01/19 18:02:00 schwarze Exp $ */
 /*
  * Copyright (c) 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2014-2020 Ingo Schwarze <schwarze@openbsd.org>
@@ -223,6 +223,7 @@ static      const char *const type_message[MANDOCERR_MAX] = {
        "excessive shift",
        "NOT IMPLEMENTED: .so with absolute path or \"..\"",
        ".so request failed",
+       "skipping tag containing whitespace",
        "skipping all arguments",
        "skipping excess arguments",
        "divide by zero",
diff --git a/mdoc.7 b/mdoc.7
index deca4ba88c0571ae5ad326bfe0302cc6b45ad841..d0dad4807d990443fec59fda2986bb37d8628cb9 100644 (file)
--- a/mdoc.7
+++ b/mdoc.7
@@ -1,7 +1,7 @@
-.\"    $Id: mdoc.7,v 1.279 2019/07/15 19:20:30 schwarze Exp $
+.\"    $Id: mdoc.7,v 1.280 2020/01/19 18:02:00 schwarze Exp $
 .\"
 .\" Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
-.\" Copyright (c) 2010, 2011, 2013-2018 Ingo Schwarze <schwarze@openbsd.org>
+.\" Copyright (c) 2010, 2011, 2013-2020 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
@@ -15,7 +15,7 @@
 .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 .\"
-.Dd $Mdocdate: July 15 2019 $
+.Dd $Mdocdate: January 19 2020 $
 .Dt MDOC 7
 .Os
 .Sh NAME
@@ -449,6 +449,7 @@ in the alphabetical
 .It Ic \&Ss Ta subsection header (one line)
 .It Ic \&Sx Ta internal cross reference to a section or subsection
 .It Ic \&Xr Ta cross reference to another manual page: Ar name section
+.It Ic \&Tg Ta tag the definition of a Ar term Pq <= 1 arguments
 .It Ic \&Pp Ta start a text paragraph (no arguments)
 .El
 .Ss Displays and lists
@@ -2548,6 +2549,49 @@ Table cell separator in
 .Ic \&Bl Fl column
 lists; can only be used below
 .Ic \&It .
+.It Ic \&Tg Op Ar term
+Announce that the next input line starts a definition of the
+.Ar term .
+This macro must appear alone on its own input line.
+The argument defaults to the first argument of the first macro
+on the next line.
+The argument may not contain whitespace characters, not even when it is quoted.
+This macro is a
+.Xr mandoc 1
+extension and is typically ignored by other formatters.
+.Pp
+When viewing terminal output with
+.Xr less 1 ,
+the interactive
+.Ic :t
+command can be used to go to the definition of the
+.Ar term
+as described for the
+.Ev MANPAGER
+variable in
+.Xr man 1 ;
+when producing HTML output, a fragment identifier
+.Pq Ic id No attribute
+is generated, to be used for deep linking to this place of the document.
+.Pp
+In most cases, adding a
+.Ic \&Tg
+macro would be redundant because
+.Xr mandoc 1
+is able to automatically tag most definitions.
+This macro is intended for cases where automatic tagging of a
+.Ar term
+is unsatisfactory, for example if a definition is not tagged
+automatically (false negative) or if places are tagged that do
+not define the
+.Ar term
+(false positives).
+When there is at least one
+.Ic \&Tg
+macro for a
+.Ar term ,
+no other places are automatically marked as definitions of that
+.Ar term .
 .It Ic \&Tn Ar word ...
 Supported only for compatibility, do not use this in new manuals.
 Even though the macro name
@@ -2912,6 +2956,7 @@ then the macro accepts an arbitrary number of arguments.
 .It Ic \&St  Ta    \&No     Ta    Yes      Ta    1
 .It Ic \&Sx  Ta    Yes      Ta    Yes      Ta    >0
 .It Ic \&Sy  Ta    Yes      Ta    Yes      Ta    >0
+.It Ic \&Tg  Ta    \&No     Ta    \&No     Ta    <2
 .It Ic \&Tn  Ta    Yes      Ta    Yes      Ta    >0
 .It Ic \&Ud  Ta    \&No     Ta    \&No     Ta    0
 .It Ic \&Ux  Ta    Yes      Ta    Yes      Ta    n
index 3d1e3ecfe393d3bfa8bde666cf6ad4b6519f6919..a0582bf0ceaeb7d9b1f6d33933f817909fd99d07 100644 (file)
@@ -1,7 +1,7 @@
-/*     $Id: mdoc_html.c,v 1.332 2019/12/11 18:44:05 schwarze Exp $ */
+/*     $Id: mdoc_html.c,v 1.333 2020/01/19 18:02:00 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2014-2019 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2014-2020 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
@@ -115,6 +115,7 @@ static      int               mdoc_ss_pre(MDOC_ARGS);
 static int               mdoc_st_pre(MDOC_ARGS);
 static int               mdoc_sx_pre(MDOC_ARGS);
 static int               mdoc_sy_pre(MDOC_ARGS);
+static int               mdoc_tg_pre(MDOC_ARGS);
 static int               mdoc_va_pre(MDOC_ARGS);
 static int               mdoc_vt_pre(MDOC_ARGS);
 static int               mdoc_xr_pre(MDOC_ARGS);
@@ -241,6 +242,7 @@ static const struct mdoc_html_act mdoc_html_acts[MDOC_MAX - MDOC_Dd] = {
        {mdoc__x_pre, mdoc__x_post}, /* %Q */
        {mdoc__x_pre, mdoc__x_post}, /* %U */
        {NULL, NULL}, /* Ta */
+       {mdoc_tg_pre, NULL}, /* Tg */
 };
 
 
@@ -721,6 +723,16 @@ mdoc_xr_pre(MDOC_ARGS)
        return 0;
 }
 
+static int
+mdoc_tg_pre(MDOC_ARGS)
+{
+       char    *id;
+
+       if ((id = html_make_id(n, 1)) != NULL)
+               print_otag(h, TAG_MARK, "i", id);
+       return 0;
+}
+
 static int
 mdoc_ns_pre(MDOC_ARGS)
 {
index a91d57a62b45bc6cfd6a83e73170dfd06c3996ec..dd3885c702b737dfc992d04a1eb5467ead161605 100644 (file)
@@ -1,7 +1,7 @@
-/*     $Id: mdoc_macro.c,v 1.233 2020/01/19 16:44:50 schwarze Exp $ */
+/*     $Id: mdoc_macro.c,v 1.234 2020/01/19 18:02:00 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2010, 2012-2019 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2010, 2012-2020 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
@@ -200,6 +200,7 @@ static const struct mdoc_macro mdoc_macros[MDOC_MAX - MDOC_Dd] = {
        { in_line_eoln, MDOC_JOIN }, /* %Q */
        { in_line_eoln, 0 }, /* %U */
        { phrase_ta, MDOC_CALLABLE | MDOC_PARSED | MDOC_JOIN }, /* Ta */
+       { in_line_eoln, 0 }, /* Tg */
 };
 
 
index 2e8f02ae56f2984eaf1aa7ed08dbdc071adee6c2..7a0d7de6e8711436563ad10c5381f67db794383b 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_man.c,v 1.132 2019/01/04 03:17:36 schwarze Exp $ */
+/*     $Id: mdoc_man.c,v 1.133 2020/01/19 18:02:00 schwarze Exp $ */
 /*
  * Copyright (c) 2011-2019 Ingo Schwarze <schwarze@openbsd.org>
  *
@@ -262,6 +262,7 @@ static const struct mdoc_man_act mdoc_man_acts[MDOC_MAX - MDOC_Dd] = {
        { NULL, NULL, post_percent, NULL, NULL }, /* %Q */
        { NULL, NULL, post_percent, NULL, NULL }, /* %U */
        { NULL, NULL, NULL, NULL, NULL }, /* Ta */
+       { NULL, NULL, NULL, NULL, NULL }, /* Tg */
 };
 static const struct mdoc_man_act *mdoc_man_act(enum roff_tok);
 
index 88e37c0b188bd1dc38f9db7c9e5a8575b4547103..7c1c3940fde6f2beb9560c2a3e6ecd6985ef96ae 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_markdown.c,v 1.31 2019/07/01 22:56:24 schwarze Exp $ */
+/*     $Id: mdoc_markdown.c,v 1.32 2020/01/19 18:02:00 schwarze Exp $ */
 /*
  * Copyright (c) 2017, 2018 Ingo Schwarze <schwarze@openbsd.org>
  *
@@ -226,6 +226,7 @@ static      const struct md_act md_acts[MDOC_MAX - MDOC_Dd] = {
        { NULL, NULL, md_post_pc, NULL, NULL }, /* %Q */
        { NULL, md_pre_Lk, md_post_pc, NULL, NULL }, /* %U */
        { NULL, NULL, NULL, NULL, NULL }, /* Ta */
+       { NULL, NULL, NULL, NULL, NULL }, /* Tg */
 };
 static const struct md_act *md_act(enum roff_tok);
 
index f9a585e736236c8897807ba5148c29390fb79701..9d98c580e113ef0979c6613badb29a4d84f5a8eb 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_state.c,v 1.15 2019/01/01 07:42:04 schwarze Exp $ */
+/*     $Id: mdoc_state.c,v 1.16 2020/01/19 18:02:00 schwarze Exp $ */
 /*
  * Copyright (c) 2014, 2015, 2017 Ingo Schwarze <schwarze@openbsd.org>
  *
@@ -157,6 +157,7 @@ static      const state_handler state_handlers[MDOC_MAX - MDOC_Dd] = {
        NULL,           /* %Q */
        NULL,           /* %U */
        NULL,           /* Ta */
+       NULL,           /* Tg */
 };
 
 
index 18f0ff09e2c7b0f236b78bab4f834d817204bf20..134f82b84572ad08d7f8393abd55c51c66c9bb96 100644 (file)
@@ -1,7 +1,7 @@
-/*     $Id: mdoc_term.c,v 1.374 2019/06/27 12:20:18 schwarze Exp $ */
+/*     $Id: mdoc_term.c,v 1.375 2020/01/19 18:02:00 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2010, 2012-2019 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2010, 2012-2020 Ingo Schwarze <schwarze@openbsd.org>
  * Copyright (c) 2013 Franco Fichtner <franco@lastsummer.de>
  *
  * Permission to use, copy, modify, and distribute this software for any
@@ -119,6 +119,7 @@ static      int       termp_pp_pre(DECL_ARGS);
 static int       termp_ss_pre(DECL_ARGS);
 static int       termp_sy_pre(DECL_ARGS);
 static int       termp_tag_pre(DECL_ARGS);
+static int       termp_tg_pre(DECL_ARGS);
 static int       termp_under_pre(DECL_ARGS);
 static int       termp_vt_pre(DECL_ARGS);
 static int       termp_xr_pre(DECL_ARGS);
@@ -245,6 +246,7 @@ static const struct mdoc_term_act mdoc_term_acts[MDOC_MAX - MDOC_Dd] = {
        { NULL, termp____post }, /* %Q */
        { NULL, termp____post }, /* %U */
        { NULL, NULL }, /* Ta */
+       { termp_tg_pre, NULL }, /* Tg */
 };
 
 static int      fn_prio;
@@ -2081,6 +2083,13 @@ termp_tag_pre(DECL_ARGS)
        return 1;
 }
 
+static int
+termp_tg_pre(DECL_ARGS)
+{
+       tag_put(n->child->string, -2, p->line);
+       return 0;
+}
+
 static int
 termp_abort_pre(DECL_ARGS)
 {
index 4ec794239f10f1155e3348414aea1c1697a61539..b0b6d6f337456c9335fe1d52a15df10d1f783d67 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_validate.c,v 1.376 2020/01/19 16:44:50 schwarze Exp $ */
+/*     $Id: mdoc_validate.c,v 1.377 2020/01/19 18:02:00 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2020 Ingo Schwarze <schwarze@openbsd.org>
@@ -113,6 +113,7 @@ static      void     post_sm(POST_ARGS);
 static void     post_st(POST_ARGS);
 static void     post_std(POST_ARGS);
 static void     post_sx(POST_ARGS);
+static void     post_tg(POST_ARGS);
 static void     post_useless(POST_ARGS);
 static void     post_xr(POST_ARGS);
 static void     post_xx(POST_ARGS);
@@ -238,6 +239,7 @@ static      const v_post mdoc_valids[MDOC_MAX - MDOC_Dd] = {
        NULL,           /* %Q */
        NULL,           /* %U */
        NULL,           /* Ta */
+       post_tg,        /* Tg */
 };
 
 #define        RSORD_MAX 14 /* Number of `Rs' blocks. */
@@ -1089,6 +1091,41 @@ post_st(POST_ARGS)
        mdoc->last= n;
 }
 
+static void
+post_tg(POST_ARGS)
+{
+       struct roff_node        *n, *nch;
+       size_t                  len;
+
+       n = mdoc->last;
+       nch = n->child;
+       if (nch == NULL && n->next != NULL &&
+           n->next->child->type == ROFFT_TEXT) {
+               mdoc->next = ROFF_NEXT_CHILD;
+               roff_word_alloc(mdoc, n->line, n->pos, n->next->child->string);
+               nch = mdoc->last;
+               nch->flags |= NODE_NOSRC;
+               mdoc->last = n;
+       }
+       if (nch == NULL || *nch->string == '\0') {
+               mandoc_msg(MANDOCERR_MACRO_EMPTY, n->line, n->pos, "Tg");
+               roff_node_delete(mdoc, n);
+               return;
+       }
+       len = strcspn(nch->string, " \t");
+       if (nch->string[len] != '\0')
+               mandoc_msg(MANDOCERR_TG_SPC, nch->line, nch->pos + len + 1,
+                   "Tg %s", nch->string);
+       if (nch->next != NULL) {
+               mandoc_msg(MANDOCERR_ARG_EXCESS, nch->next->line,
+                   nch->next->pos, "Tg ... %s", nch->next->string);
+               while (nch->next != NULL)
+                       roff_node_delete(mdoc, nch->next);
+       }
+       if (nch->string[len] != '\0')
+               roff_node_delete(mdoc, n);
+}
+
 static void
 post_obsolete(POST_ARGS)
 {
@@ -1754,7 +1791,7 @@ post_bl(POST_ARGS)
        while (nchild != NULL) {
                nnext = nchild->next;
                if (nchild->tok == MDOC_It ||
-                   (nchild->tok == MDOC_Sm &&
+                   ((nchild->tok == MDOC_Sm || nchild->tok == MDOC_Tg) &&
                     nnext != NULL && nnext->tok == MDOC_It)) {
                        nchild = nnext;
                        continue;
diff --git a/roff.c b/roff.c
index 427f62b52e9923a2b8c0869c7c7fb6f1ade07aa7..84f2b7cc621331201a8d3d75d35a94720ec33c01 100644 (file)
--- a/roff.c
+++ b/roff.c
@@ -1,7 +1,7 @@
-/*     $Id: roff.c,v 1.368 2019/12/26 19:51:51 schwarze Exp $ */
+/*     $Id: roff.c,v 1.369 2020/01/19 18:02:00 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2010-2015, 2017-2019 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2010-2015, 2017-2020 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
@@ -355,7 +355,7 @@ const char *__roff_name[MAN_MAX + 1] = {
        "Lk",           "Mt",           "Brq",          "Bro",
        "Brc",          "%C",           "Es",           "En",
        "Dx",           "%Q",           "%U",           "Ta",
-       NULL,
+       "Tg",           NULL,
        "TH",           "SH",           "SS",           "TP",
        "TQ",
        "LP",           "PP",           "P",            "IP",
diff --git a/roff.h b/roff.h
index 49b0927513d443ea44f2143fbfc504b0ba73169e..736b9e0f972fddcbeefa7a5dae5b84dbe5160910 100644 (file)
--- a/roff.h
+++ b/roff.h
@@ -1,7 +1,7 @@
-/*     $Id: roff.h,v 1.69 2019/03/04 13:01:57 schwarze Exp $   */
+/*     $Id: roff.h,v 1.70 2020/01/19 18:02:00 schwarze Exp $   */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2013-2015, 2017-2019 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2013-2015, 2017-2020 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
@@ -437,6 +437,7 @@ enum        roff_tok {
        MDOC__Q,
        MDOC__U,
        MDOC_Ta,
+       MDOC_Tg,
        MDOC_MAX,
        MAN_TH,
        MAN_SH,
diff --git a/tag.c b/tag.c
index c311cec26ef906b80278d58a790dbb1075cd33f8..c98c7b849bd4b2727599d9914b5278630844de0e 100644 (file)
--- a/tag.c
+++ b/tag.c
@@ -1,6 +1,6 @@
-/*     $Id: tag.c,v 1.25 2019/07/27 13:40:57 schwarze Exp $ */
+/*     $Id: tag.c,v 1.26 2020/01/19 18:02:00 schwarze Exp $ */
 /*
- * Copyright (c) 2015, 2016, 2018, 2019 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2015,2016,2018,2019,2020 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
@@ -196,12 +196,13 @@ tag_put(const char *s, int prio, size_t line)
 
                /* A better entry is already present, ignore the new one. */
 
-               if (entry->prio > 0 && entry->prio < prio)
+               if (entry->prio != -1 && entry->prio < prio)
                        return;
 
                /* The existing entry is worse, clear it. */
 
-               if (entry->prio < 1 || entry->prio > prio)
+               if (entry->prio == -1 || entry->prio == 0 ||
+                   entry->prio > prio)
                        entry->nlines = 0;
        }
 
@@ -241,7 +242,7 @@ tag_write(void)
        empty = 1;
        entry = ohash_first(&tag_data, &slot);
        while (entry != NULL) {
-               if (stream != NULL && entry->prio >= 0) {
+               if (stream != NULL && entry->prio != -1) {
                        for (i = 0; i < entry->nlines; i++) {
                                fprintf(stream, "%s %s %zu\n",
                                    entry->s, tag_files.ofn, entry->lines[i]);