aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/tag.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2020-04-08 11:56:03 +0000
committerIngo Schwarze <schwarze@openbsd.org>2020-04-08 11:56:03 +0000
commit637b922ab2b2aa18419a0abed18ae9d2fed4e50a (patch)
tree43a6a061839c1d2a8278fd43533f585b09e81304 /tag.c
parentf4c07cc80595b2276a99fd6e5c95c734187feaab (diff)
downloadmandoc-637b922ab2b2aa18419a0abed18ae9d2fed4e50a.tar.gz
mandoc-637b922ab2b2aa18419a0abed18ae9d2fed4e50a.tar.zst
mandoc-637b922ab2b2aa18419a0abed18ae9d2fed4e50a.zip
Use a separate node->tag attribute rather than abusing the node->string
attribute for the purpose. No functional change intended. The purpose is to make it possible to later attach tags to text nodes.
Diffstat (limited to 'tag.c')
-rw-r--r--tag.c27
1 files changed, 17 insertions, 10 deletions
diff --git a/tag.c b/tag.c
index 634b0f03..0c330f46 100644
--- a/tag.c
+++ b/tag.c
@@ -1,4 +1,4 @@
-/* $Id: tag.c,v 1.33 2020/04/07 22:56:02 schwarze Exp $ */
+/* $Id: tag.c,v 1.34 2020/04/08 11:56:04 schwarze Exp $ */
/*
* Copyright (c) 2015,2016,2018,2019,2020 Ingo Schwarze <schwarze@openbsd.org>
*
@@ -83,6 +83,7 @@ void
tag_put(const char *s, int prio, struct roff_node *n)
{
struct tag_entry *entry;
+ struct roff_node *nold;
const char *se;
size_t len;
unsigned int slot;
@@ -155,9 +156,12 @@ tag_put(const char *s, int prio, struct roff_node *n)
*/
else if (entry->prio > prio || prio == TAG_FALLBACK) {
- while (entry->nnodes > 0)
- entry->nodes[--entry->nnodes]->flags &= ~NODE_ID;
-
+ while (entry->nnodes > 0) {
+ nold = entry->nodes[--entry->nnodes];
+ nold->flags &= ~NODE_ID;
+ free(nold->tag);
+ nold->tag = NULL;
+ }
if (prio == TAG_FALLBACK) {
entry->prio = TAG_DELETE;
return;
@@ -175,8 +179,8 @@ tag_put(const char *s, int prio, struct roff_node *n)
entry->prio = prio;
n->flags |= NODE_ID;
if (n->child == NULL || n->child->string != s || *se != '\0') {
- assert(n->string == NULL);
- n->string = mandoc_strndup(s, len);
+ assert(n->tag == NULL);
+ n->tag = mandoc_strndup(s, len);
}
}
@@ -222,9 +226,9 @@ tag_move_id(struct roff_node *n)
}
/* FALLTHROUGH */
case MDOC_Pp: /* Target the ROFFT_ELEM = <p>. */
- if (np->string == NULL) {
- np->string = mandoc_strdup(n->string == NULL ?
- n->child->string : n->string);
+ if (np->tag == NULL) {
+ np->tag = mandoc_strdup(n->tag == NULL ?
+ n->child->string : n->tag);
np->flags |= NODE_ID;
n->flags &= ~NODE_ID;
}
@@ -268,8 +272,11 @@ tag_postprocess(struct roff_node *n)
tag_move_id(n);
if (n->tok != MDOC_Tg)
n->flags |= NODE_HREF;
- else if ((n->flags & NODE_ID) == 0)
+ else if ((n->flags & NODE_ID) == 0) {
n->flags |= NODE_NOPRT;
+ free(n->tag);
+ n->tag = NULL;
+ }
break;
}
}