## root/htags/anchor.h

/* [<][>][^][v][top][bottom][index][help] */

## INCLUDED FROM

    /*
     * Copyright (c) 2004, 2005 Tama Communications Corporation
     *
     * This file is part of GNU GLOBAL.
     *
     * This program is free software: you can redistribute it and/or modify
     * it under the terms of the GNU General Public License as published by
     * the Free Software Foundation, either version 3 of the License, or
     * (at your option) any later version.
     *
     * This program is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     * GNU General Public License for more details.
     *
     * You should have received a copy of the GNU General Public License
     * along with this program.  If not, see <http://www.gnu.org/licenses/>.
     */
    #ifndef _ANCHOR_H_
    #define _ANCHOR_H_

    #include "checkalloc.h"
    /*
     * Anchor table.
     *
     * Most names are written to tag[] directly.
     * Long name whose length > ANCHOR_NAMELEN are written to newly allocated
     * memory and are linked to reserve. It is necessary to clear the variable
     * which is not used.
     */
    #define ANCHOR_NAMELEN  32
    struct anchor {
            int lineno;
            char type;
            char done;
            int length;
            char tag[ANCHOR_NAMELEN];
            char *reserve;
    };

    #define gettag(a)       (a->tag[0] ? a->tag : a->reserve)
    #define settag(a, b)    do {                                            \
            char *tag = b;                                                  \
            (a)->length = strlen(tag);                                      \
            if ((a)->length < ANCHOR_NAMELEN) {                             \
                    strlimcpy((a)->tag, tag, sizeof((a)->tag));             \
                    (a)->reserve = NULL;                                    \
            } else {                                                        \
                    (a)->reserve = check_strdup(tag);                       \
                    (a)->tag[0] = '\0';                                     \
            }                                                               \
    } while (0)

    #define A_PREV          0
    #define A_NEXT          1
    #define A_FIRST         2
    #define A_LAST          3
    #define A_TOP           4
    #define A_BOTTOM        5
    #define A_SIZE          6

    #define A_INDEX         6
    #define A_HELP          7
    #define A_LIMIT         8

    void anchor_prepare(FILE *);
    void anchor_load(const char *);
    void anchor_unload(void);
    struct anchor *anchor_first(void);
    struct anchor *anchor_next(void);
    struct anchor *anchor_get(const char *, int, int, int);
    int define_line(int);
    int *anchor_getlinks(int);
    void anchor_dump(FILE *, int);

    #endif /* _ANCHOR_H_ */

/* [<][>][^][v][top][bottom][index][help] */