Annotation of embedaddon/strongswan/src/libstrongswan/utils/parser_helper.h, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2014 Tobias Brunner
                      3:  * HSR Hochschule fuer Technik Rapperswil
                      4:  *
                      5:  * This program is free software; you can redistribute it and/or modify it
                      6:  * under the terms of the GNU General Public License as published by the
                      7:  * Free Software Foundation; either version 2 of the License, or (at your
                      8:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
                      9:  *
                     10:  * This program is distributed in the hope that it will be useful, but
                     11:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     12:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
                     13:  * for more details.
                     14:  */
                     15: 
                     16: /**
                     17:  * @defgroup parser_helper parser_helper
                     18:  * @{ @ingroup utils
                     19:  */
                     20: 
                     21: #ifndef PARSER_HELPER_H_
                     22: #define PARSER_HELPER_H_
                     23: 
                     24: #include <utils/debug.h>
                     25: #include <collections/array.h>
                     26: #include <bio/bio_writer.h>
                     27: 
                     28: typedef struct parser_helper_t parser_helper_t;
                     29: 
                     30: /**
                     31:  * Helper class for flex/bison based parsers.
                     32:  *
                     33:  * <code>PREFIX</code> equals whatever is configure with
                     34:  * <code>%option prefix</code> resp. <code>%name-prefix</code>.
                     35:  */
                     36: struct parser_helper_t {
                     37: 
                     38:        /**
                     39:         * A user defined parser context object.
                     40:         */
                     41:        const void *context;
                     42: 
                     43:        /**
                     44:         * Opaque object allocated by the lexer, should be set with:
                     45:         * @code
                     46:         * PREFIXlex_init_extra(helper, &helper->scanner).
                     47:         * @endcode
                     48:         */
                     49:        void *scanner;
                     50: 
                     51:        /**
                     52:         * Function to determine the current line number (defined by the lexer).
                     53:         *
                     54:         * Basically, this should be assigned to <code>PREFIXget_lineno</code>.
                     55:         *
                     56:         * @param scanner       the lexer
                     57:         * @return                      current line number
                     58:         */
                     59:        int (*get_lineno)(void *scanner);
                     60: 
                     61:        /**
                     62:         * Resolves the given include pattern, relative to the location of the
                     63:         * current file.
                     64:         *
                     65:         * Call file_next() to open the next file.
                     66:         *
                     67:         * @param pattern       file pattern
                     68:         */
                     69:        void (*file_include)(parser_helper_t *this, char *pattern);
                     70: 
                     71:        /**
                     72:         * Get the next file to process.
                     73:         *
                     74:         * This will return NULL if all files matching the most recent pattern
                     75:         * have been handled. If there are other patterns the next call will then
                     76:         * return the next file matching the previous pattern.
                     77:         *
                     78:         * When hitting <code>\<\<EOF\>\></code> first call
                     79:         * @code
                     80:         * PREFIXpop_buffer_state(yyscanner);
                     81:         * @endcode
                     82:         * then call this method to check if there are more files to include for
                     83:         * the most recent call to file_include(), if so, call
                     84:         * @code
                     85:         * PREFIXset_in(file, helper->scanner);
                     86:         * PREFIXpush_buffer_state(PREFIX_create_buffer(file, YY_BUF_SIZE,
                     87:         *                                              helper->scanner), helper->scanner);
                     88:         * @endcode
                     89:         *
                     90:         * If there are no more files to process check
                     91:         * <code>YY_CURRENT_BUFFER</code> and if it is FALSE call yyterminate().
                     92:         *
                     93:         * @return                      next file to process, or NULL (see comment)
                     94:         */
                     95:        FILE *(*file_next)(parser_helper_t *this);
                     96: 
                     97:        /**
                     98:         * Start parsing a string, discards any currently stored data.
                     99:         */
                    100:        void (*string_init)(parser_helper_t *this);
                    101: 
                    102:        /**
                    103:         * Append the given string.
                    104:         *
                    105:         * @param str           string to append
                    106:         */
                    107:        void (*string_add)(parser_helper_t *this, char *str);
                    108: 
                    109:        /**
                    110:         * Extract the current string buffer as null-terminated string. Can only
                    111:         * be called once per string.
                    112:         *
                    113:         * @return                      allocated string
                    114:         */
                    115:        char *(*string_get)(parser_helper_t *this);
                    116: 
                    117:        /**
                    118:         * Destroy this instance.
                    119:         */
                    120:        void (*destroy)(parser_helper_t *this);
                    121: };
                    122: 
                    123: /**
                    124:  * Log the given message either as error or warning
                    125:  *
                    126:  * @param level                log level
                    127:  * @param ctx          current parser context
                    128:  * @param fmt          error message format
                    129:  * @param ...          additional arguments
                    130:  */
                    131: void parser_helper_log(int level, parser_helper_t *ctx, char *fmt, ...);
                    132: 
                    133: #if DEBUG_LEVEL >= 1
                    134: # define PARSER_DBG1(ctx, fmt, ...) parser_helper_log(1, ctx, fmt, ##__VA_ARGS__)
                    135: #endif
                    136: #if DEBUG_LEVEL >= 2
                    137: # define PARSER_DBG2(ctx, fmt, ...) parser_helper_log(2, ctx, fmt, ##__VA_ARGS__)
                    138: #endif
                    139: #if DEBUG_LEVEL >= 3
                    140: # define PARSER_DBG3(ctx, fmt, ...) parser_helper_log(3, ctx, fmt, ##__VA_ARGS__)
                    141: #endif
                    142: 
                    143: #ifndef PARSER_DBG1
                    144: # define PARSER_DBG1(...) {}
                    145: #endif
                    146: #ifndef PARSER_DBG2
                    147: # define PARSER_DBG2(...) {}
                    148: #endif
                    149: #ifndef PARSER_DBG3
                    150: # define PARSER_DBG3(...) {}
                    151: #endif
                    152: 
                    153: /**
                    154:  * Create a parser helper object
                    155:  *
                    156:  * @param context              user defined parser context
                    157:  * @return                             parser helper
                    158:  */
                    159: parser_helper_t *parser_helper_create(void *context);
                    160: 
                    161: #endif /** PARSER_HELPER_H_ @}*/

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>