## root/htags/incop.c

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

## DEFINITIONS

This source file includes following definitions.

1. strtolower
2. init_inc
3. put_inc
4. get_inc
5. first_inc
6. next_inc
7. put_included
8. get_included

    /*
     * Copyright (c) 2003, 2004, 2006 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/>.
     */
    #ifdef HAVE_CONFIG_H
    #include "config.h"
    #endif
    #include <ctype.h>
    #ifdef STDC_HEADERS
    #include <stdlib.h>
    #endif
    #include "global.h"
    #include "incop.h"

    #if defined(_WIN32) || defined(__DJGPP__)
    static const char *
    strtolower(const char *s)
    {
            static char lower[MAXPATHLEN];
            char *t = lower, *end = lower + sizeof(lower);

            do {
                    if (t == end)
                            die("name is too long.");
            } while ((*t++ = tolower((unsigned char)*s++)) != '\0');

            return lower;
    }
    #define HASH_KEY(name)  strtolower(name)
    #else
    #define HASH_KEY(name)  (name)
    #endif
    /*----------------------------------------------------------------------*/
    /* Include path list                                                    */
    /*----------------------------------------------------------------------*/
    static STRHASH *head_inc;

    /*
     * init_inc: initialize include file list.
     */
    void
    init_inc(void)
    {
            head_inc = strhash_open(1024);
    }
    /*
     * put_inc: put include file.
     *
     *      i)      file    file name (the last component of the path)
     *      i)      path    path name or command line.
     *      i)      id      path id
     */
    void
    put_inc(const char *file, const char *path, int id)
    {
            struct sh_entry *entry;
            struct data *data;

            entry = strhash_assign(head_inc, HASH_KEY(file), 1);
            data = entry->value;
            if (data == NULL) {
                    data = (struct data *)check_malloc(sizeof(struct data));
    #if defined(_WIN32) || defined(__DJGPP__)
                    strlimcpy(data->name, file, sizeof(data->name));
    #else
                    data->name = entry->name;
    #endif
                    data->id = id;
                    data->contents = strbuf_open(0);
                    data->ref_contents = NULL;
                    data->count = 0;
                    data->ref_count = 0;
                    entry->value = data;
            }
            strbuf_puts0(data->contents, path);
            data->count++;
    }
    /*
     * get_inc: get include file.
     *
     *      i)      path    path name or command line.
     *      r)              descriptor
     */
    struct data *
    get_inc(const char *name)
    {
            struct sh_entry *entry = strhash_assign(head_inc, HASH_KEY(name), 0);

            return entry ? entry->value : NULL;
    }
    /*
     * first_inc: get the first include file.
     *
     *      r)              descriptor
     */
    struct data *
    first_inc(void)
    {
            struct sh_entry *entry = strhash_first(head_inc);

            return entry ? entry->value : NULL;
    }
    /*
     * next_inc: get the next include file.
     *
     *      r)              descriptor
     */
    struct data *
    next_inc(void)
    {
            struct sh_entry *entry = strhash_next(head_inc);

            return entry ? entry->value : NULL;
    }

    /*
     * put_included: put include file reference.
     *
     *      i)      data    inc structure
     *      i)      path    path name or command line.
     */
    void
    put_included(struct data *data, const char *path)
    {
            if (data->ref_contents == NULL)
                    data->ref_contents = strbuf_open(0);
            strbuf_puts0(data->ref_contents, path);
            data->ref_count++;
    }
    /*
     * get_included: get included file.
     *
     *      i)      path    path name or command line.
     *      r)              descriptor
     */
    struct data *
    get_included(const char *name)
    {
            struct data *data = get_inc(name);

            return (data && data->ref_count) ? data : NULL;
    }
    /*
     * Terminate function is not needed.
     */

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