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] */