diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2017-07-02 15:31:59 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2017-07-02 15:31:59 +0000 |
commit | 9a0fd61677909a43ee8a1f7d69598769f9a7ad6b (patch) | |
tree | ff9b788408b481515dd3eae168a45e4aea03416d /mandoc_xr.c | |
parent | 58be69d2a5cab3e51bf16a2880fbfa2115dad47d (diff) | |
download | mandoc-9a0fd61677909a43ee8a1f7d69598769f9a7ad6b.tar.gz |
add warning "cross reference to self"; inspired by mdoclint
Diffstat (limited to 'mandoc_xr.c')
-rw-r--r-- | mandoc_xr.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/mandoc_xr.c b/mandoc_xr.c index d69c9c80..4d6b7825 100644 --- a/mandoc_xr.c +++ b/mandoc_xr.c @@ -59,17 +59,18 @@ mandoc_xr_reset(void) xr_first = xr_last = NULL; } -void +int mandoc_xr_add(const char *sec, const char *name, int line, int pos) { - struct mandoc_xr *xr; + struct mandoc_xr *xr, *oxr; const char *pend; size_t ssz, nsz, tsz; unsigned int slot; + int ret; uint32_t hv; if (xr_hash == NULL) - return; + return 0; ssz = strlen(sec) + 1; nsz = strlen(name) + 1; @@ -86,15 +87,21 @@ mandoc_xr_add(const char *sec, const char *name, int line, int pos) pend = xr->hashkey + tsz; hv = ohash_interval(xr->hashkey, &pend); slot = ohash_lookup_memory(xr_hash, xr->hashkey, tsz, hv); - if (ohash_find(xr_hash, slot) == NULL) { + if ((oxr = ohash_find(xr_hash, slot)) == NULL) { ohash_insert(xr_hash, slot, xr); if (xr_first == NULL) xr_first = xr; else xr_last->next = xr; xr_last = xr; - } else - free(xr); + return 0; + } + + ret = (oxr->line == -1) ^ (xr->line == -1); + if (xr->line == -1) + oxr->line = -1; + free(xr); + return ret; } struct mandoc_xr * |