]> git.cameronkatri.com Git - mandoc.git/blobdiff - mandoc_xr.c
While we do not recommend the idiom ".Fl Fl long" for long options
[mandoc.git] / mandoc_xr.c
index 2285361690296957077e0bb7d447596d017b8757..da0a7f0cf23b132e20ec25baea5e7631a6a5c109 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mandoc_xr.c,v 1.1 2017/07/01 09:47:30 schwarze Exp $ */
+/*     $Id: mandoc_xr.c,v 1.3 2017/07/02 21:18:29 schwarze Exp $ */
 /*
  * Copyright (c) 2017 Ingo Schwarze <schwarze@openbsd.org>
  *
@@ -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;
@@ -80,21 +81,29 @@ mandoc_xr_add(const char *sec, const char *name, int line, int pos)
        xr->name = xr->hashkey + ssz;
        xr->line = line;
        xr->pos = pos;
+       xr->count = 1;
        memcpy(xr->sec, sec, ssz);
        memcpy(xr->name, name, nsz);
 
        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;
+       }
+
+       oxr->count++;
+       ret = (oxr->line == -1) ^ (xr->line == -1);
+       if (xr->line == -1)
+               oxr->line = -1;
+       free(xr);
+       return ret;
 }
 
 struct mandoc_xr *