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>