Annotation of embedaddon/strongswan/src/libstrongswan/utils/parser_helper.h, revision 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>