## root/htags/lexcommon.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 _LEXCOMMON_H
    #define _LEXCOMMON_H

    #include "incop.h"
    #include "tab.h"

    /*
     * Definition of LEXTEXT, LEXLENG, LEXIN and LEXRESTART.
     *
     * These symbols are substitutions of yytext, yyleng, yyin and yyrestart.
     * You should write lex code using them.
     * The usage of this file is, for instance, in c.l:
     *
     *      #define lex_symbol_generation_rule(x) c_ ## x
     *      #include "lexcommon.h"
     */
    #ifndef lex_symbol_generation_rule
    ERROR: lex_symbol_generation_rule(x) macro not defined.
    lexcommon.h requires the lex_symbol_generation_rule(x) macro for each language
    to generate language specific symbols.
    #endif
    #define LEXTEXT lex_symbol_generation_rule(text)
    #define LEXLENG lex_symbol_generation_rule(leng)
    #define LEXIN lex_symbol_generation_rule(in)
    #define LEXRESTART lex_symbol_generation_rule(restart)

    /*
     * The default action for line control.
     * These can be applicable to most languages.
     * You must define C_COMMENT, CPP_COMMENT SHELL_COMMENT, LITERAL, STRING
     * and PREPROCESSOR_LINE as %start values, even if they are not used.
     * It assumed that CPP_COMMENT and SHELL_COMMENT is one line comment.
     */
    static int lexcommon_lineno;
    static int begin_line;
    /*
     * If you want newline to terminate string, set this variable to 1.
     */
    static int newline_terminate_string = 0;

    /*
     * Variables for converting tabs to spaces.
     */
    static int dest_column;
    static int left_spaces;

    #define YY_INPUT(buf, result, max_size) do {                            \
            result = read_file_detabing(buf, max_size, LEXIN,               \
                            &dest_column, &left_spaces);                    \
    } while (0)

    #define LINENO lexcommon_lineno

    #define DEFAULT_BEGIN_OF_FILE_ACTION {                                  \
            LEXIN = ip;                                                     \
            LEXRESTART(LEXIN);                                              \
            LINENO = 1;                                                     \
            begin_line = 1;                                                 \
            dest_column = 0;                                                \
            left_spaces = 0;                                                \
    }

    #define DEFAULT_YY_USER_ACTION {                                        \
            if (begin_line) {                                               \
                    put_begin_of_line(LINENO);                              \
                    switch (YY_START) {                                     \
                    case C_COMMENT:                                         \
                    case CPP_COMMENT:                                       \
                    case SHELL_COMMENT:                                     \
                            echos(comment_begin);                           \
                            break;                                          \
                    }                                                       \
                    begin_line = 0;                                         \
            }                                                               \
    }

    #define DEFAULT_END_OF_LINE_ACTION {                                    \
            switch (YY_START) {                                             \
            case CPP_COMMENT:                                               \
            case SHELL_COMMENT:                                             \
                    yy_pop_state();                                         \
                    /* FALLTHROUGH */                                       \
            case C_COMMENT:                                                 \
                    echos(comment_end);                                     \
                    break;                                                  \
            case STRING:                                                    \
            case LITERAL:                                                   \
                    if (newline_terminate_string)                           \
                            yy_pop_state();                                 \
                    break;                                                  \
            }                                                               \
            if (YY_START == PREPROCESSOR_LINE)                              \
                    yy_pop_state();                                         \
            put_end_of_line(LINENO);                                        \
            /* for the next line */                                         \
            LINENO++;                                                       \
            begin_line = 1;                                                 \
    }

    #define DEFAULT_BACKSLASH_NEWLINE_ACTION {                              \
            echoc('\\');                                                    \
            switch (YY_START) {                                             \
            case CPP_COMMENT:                                               \
            case C_COMMENT:                                                 \
            case SHELL_COMMENT:                                             \
                    echos(comment_end);                                     \
                    break;                                                  \
            }                                                               \
            put_end_of_line(LINENO);                                        \
            /* for the next line */                                         \
            LINENO++;                                                       \
            begin_line = 1;                                                 \
    }

    /*
     * Output routine.
     */
    extern void echoc(int);
    extern void echos(const char *);
    extern const char *generate_guide(int);
    extern void put_anchor(char *, int, int);
    extern void put_include_anchor(struct data *, const char *);
    extern void put_reserved_word(const char *);
    extern void put_macro(const char *);
    extern void unknown_preprocessing_directive(const char *, int);
    extern void unexpected_eof(int);
    extern void unknown_yacc_directive(const char *, int);
    extern void missing_left(const char *, int);
    extern void put_char(int);
    extern void put_string(const char *);
    extern void put_brace(const char *);
    extern void put_begin_of_line(int);
    extern void put_end_of_line(int);

    #endif /* ! _LEXCOMMON_H */

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