[BACK]Return to mandoc_xr.c CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / mandoc

Annotation of mandoc/mandoc_xr.c, Revision 1.3

1.3     ! schwarze    1: /*     $Id: mandoc_xr.c,v 1.2 2017/07/02 15:31:59 schwarze Exp $ */
1.1       schwarze    2: /*
                      3:  * Copyright (c) 2017 Ingo Schwarze <schwarze@openbsd.org>
                      4:  *
                      5:  * Permission to use, copy, modify, and distribute this software for any
                      6:  * purpose with or without fee is hereby granted, provided that the above
                      7:  * copyright notice and this permission notice appear in all copies.
                      8:  *
                      9:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
                     10:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
                     11:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
                     12:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
                     13:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
                     14:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
                     15:  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
                     16:  */
                     17: #include <sys/types.h>
                     18:
                     19: #include <assert.h>
                     20: #include <stddef.h>
                     21: #include <stdint.h>
                     22: #include <stdlib.h>
                     23: #include <string.h>
                     24:
                     25: #include "mandoc_aux.h"
                     26: #include "mandoc_ohash.h"
                     27: #include "mandoc_xr.h"
                     28:
                     29: static struct ohash     *xr_hash = NULL;
                     30: static struct mandoc_xr         *xr_first = NULL;
                     31: static struct mandoc_xr         *xr_last = NULL;
                     32:
                     33: static void              mandoc_xr_clear(void);
                     34:
                     35:
                     36: static void
                     37: mandoc_xr_clear(void)
                     38: {
                     39:        struct mandoc_xr        *xr;
                     40:        unsigned int             slot;
                     41:
                     42:        if (xr_hash == NULL)
                     43:                return;
                     44:        for (xr = ohash_first(xr_hash, &slot); xr != NULL;
                     45:             xr = ohash_next(xr_hash, &slot))
                     46:                free(xr);
                     47:        ohash_delete(xr_hash);
                     48: }
                     49:
                     50: void
                     51: mandoc_xr_reset(void)
                     52: {
                     53:        if (xr_hash == NULL)
                     54:                xr_hash = mandoc_malloc(sizeof(*xr_hash));
                     55:        else
                     56:                mandoc_xr_clear();
                     57:        mandoc_ohash_init(xr_hash, 5,
                     58:            offsetof(struct mandoc_xr, hashkey));
                     59:        xr_first = xr_last = NULL;
                     60: }
                     61:
1.2       schwarze   62: int
1.1       schwarze   63: mandoc_xr_add(const char *sec, const char *name, int line, int pos)
                     64: {
1.2       schwarze   65:        struct mandoc_xr         *xr, *oxr;
1.1       schwarze   66:        const char               *pend;
                     67:        size_t                    ssz, nsz, tsz;
                     68:        unsigned int              slot;
1.2       schwarze   69:        int                       ret;
1.1       schwarze   70:        uint32_t                  hv;
                     71:
                     72:        if (xr_hash == NULL)
1.2       schwarze   73:                return 0;
1.1       schwarze   74:
                     75:        ssz = strlen(sec) + 1;
                     76:        nsz = strlen(name) + 1;
                     77:        tsz = ssz + nsz;
                     78:        xr = mandoc_malloc(sizeof(*xr) + tsz);
                     79:        xr->next = NULL;
                     80:        xr->sec = xr->hashkey;
                     81:        xr->name = xr->hashkey + ssz;
                     82:        xr->line = line;
                     83:        xr->pos = pos;
1.3     ! schwarze   84:        xr->count = 1;
1.1       schwarze   85:        memcpy(xr->sec, sec, ssz);
                     86:        memcpy(xr->name, name, nsz);
                     87:
                     88:        pend = xr->hashkey + tsz;
                     89:        hv = ohash_interval(xr->hashkey, &pend);
                     90:        slot = ohash_lookup_memory(xr_hash, xr->hashkey, tsz, hv);
1.2       schwarze   91:        if ((oxr = ohash_find(xr_hash, slot)) == NULL) {
1.1       schwarze   92:                ohash_insert(xr_hash, slot, xr);
                     93:                if (xr_first == NULL)
                     94:                        xr_first = xr;
                     95:                else
                     96:                        xr_last->next = xr;
                     97:                xr_last = xr;
1.2       schwarze   98:                return 0;
                     99:        }
                    100:
1.3     ! schwarze  101:        oxr->count++;
1.2       schwarze  102:        ret = (oxr->line == -1) ^ (xr->line == -1);
                    103:        if (xr->line == -1)
                    104:                oxr->line = -1;
                    105:        free(xr);
                    106:        return ret;
1.1       schwarze  107: }
                    108:
                    109: struct mandoc_xr *
                    110: mandoc_xr_get(void)
                    111: {
                    112:        return xr_first;
                    113: }
                    114:
                    115: void
                    116: mandoc_xr_free(void)
                    117: {
                    118:        mandoc_xr_clear();
                    119:        free(xr_hash);
                    120:        xr_hash = NULL;
                    121: }

CVSweb