gfsmScanner.h
Go to the documentation of this file.
1 /*=============================================================================*\
2  * File: gfsmScanner.h
3  * Author: Bryan Jurish <moocow.bovine@gmail.com>
4  * Description: finite state machine library
5  *
6  * Copyright (c) 2005-2011 Bryan Jurish.
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 3 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21  *=============================================================================*/
22 
27 #ifndef _GFSM_SCANNER_H
28 #define _GFSM_SCANNER_H
29 
30 #include <stdio.h>
31 #include <stdarg.h>
32 
33 #include <gfsmError.h>
34 
35 /*======================================================================
36  * Types
37  */
38 
39 //------------------------------------------------------
41 typedef void* gfsmFlexScanner;
42 
43 //------------------------------------------------------
45 typedef void* gfsmFlexBufferState;
46 
47 //------------------------------------------------------
49 typedef int (*gfsmFlexScannerInitFunc) (gfsmFlexScanner yyscanner);
50 
52 typedef int (*gfsmFlexScannerFreeFunc) (gfsmFlexScanner yyscanner);
53 
54 //------------------------------------------------------
56 typedef int (*gfsmFlexScannerGetPosFunc) (gfsmFlexScanner yyscanner);
57 
59 typedef void (*gfsmFlexScannerSetPosFunc) (int pos, gfsmFlexScanner yyscanner);
60 
61 //------------------------------------------------------
63 typedef void (*gfsmFlexScannerSetExtraFunc) (void *extra, gfsmFlexScanner yyscanner);
64 
66 typedef void* (*gfsmFlexScannerGetExtraFunc) (gfsmFlexScanner yyscanner);
67 
68 //------------------------------------------------------
70 typedef char* (*gfsmFlexScannerGetTextFunc) (gfsmFlexScanner yyscanner);
71 
72 //------------------------------------------------------
74 typedef void (*gfsmFlexScannerScanFileFunc) (FILE *in, gfsmFlexScanner yyscanner);
75 
77 typedef void (*gfsmFlexScannerScanBytesFunc) (const char *str, int len, gfsmFlexScanner yyscanner);
78 
80 typedef void (*gfsmFlexScannerScanPopFunc) (gfsmFlexScanner yyscanner);
81 
82 
83 //------------------------------------------------------
84 
90 typedef struct {
91  gfsmFlexScanner yyscanner;
92  void *data;
93  char *name;
94  FILE *infile;
95  char *filename;
96  gfsmError *err;
97  gboolean emit_warnings;
98 
99  //-- funcs: init, free
100  gfsmFlexScannerFreeFunc yyfree_func;
101 
102  //-- funcs & data: buffer switching
103  gfsmFlexScannerScanFileFunc yyscan_file_func;
104  gfsmFlexScannerScanBytesFunc yyscan_bytes_func;
105  gfsmFlexScannerScanPopFunc yyscan_pop_func;
106 
107  //-- funcs: text
108  gfsmFlexScannerGetTextFunc yyget_text_func;
109 
110  //-- funcs: position
111  gfsmFlexScannerGetPosFunc yyget_lineno_func;
112  gfsmFlexScannerSetPosFunc yyset_lineno_func;
113 
114  //-- funcs: extra data
115  gfsmFlexScannerSetExtraFunc yyset_extra_func;
116 
117 } gfsmScanner;
118 
119 
120 /*======================================================================
121  * Constants
122  */
124 extern const char *gfsmScannerDefaultName;
125 
127 extern const char *gfsmScannerDefaultFilename;
128 
129 /*======================================================================
130  * gfsmScanner: Constructors etc.
131  */
132 
134 
135 
136 
140 #define gfsm_scanner_init(scanner,name,PREFIX) \
141  gfsm_scanner_init_full((scanner), \
142  (name), \
143  (gfsmFlexScannerInitFunc) ( PREFIX ## lex_init ), \
144  (gfsmFlexScannerFreeFunc) ( PREFIX ## lex_destroy ), \
145  (gfsmFlexScannerScanFileFunc) ( PREFIX ## restart ), \
146  (gfsmFlexScannerScanBytesFunc) ( PREFIX ## _scan_bytes ), \
147  (gfsmFlexScannerScanPopFunc) ( PREFIX ## pop_buffer_state ), \
148  (gfsmFlexScannerGetTextFunc) ( PREFIX ## get_text ), \
149  (gfsmFlexScannerGetPosFunc) ( PREFIX ## get_lineno ), \
150  (gfsmFlexScannerSetPosFunc) ( PREFIX ## set_lineno ), \
151  (gfsmFlexScannerSetExtraFunc) ( PREFIX ## set_extra ) )
152 
156 #define gfsm_scanner_new(name,PREFIX) \
157  gfsm_scanner_init( gfsm_slice_new0(gfsmScanner), (name), PREFIX )
158 
159 
163 gfsmScanner *gfsm_scanner_new_full(const char *name,
164  gfsmFlexScannerInitFunc yyinit_func,
165  gfsmFlexScannerFreeFunc yyfree_func,
166  gfsmFlexScannerScanFileFunc yyscan_file_func,
167  gfsmFlexScannerScanBytesFunc yyscan_bytes_func,
168  gfsmFlexScannerScanPopFunc yyscan_pop_func,
169  gfsmFlexScannerGetTextFunc yyget_text_func,
170  gfsmFlexScannerGetPosFunc yyget_lineno_func,
171  gfsmFlexScannerSetPosFunc yyset_lineno_func,
172  gfsmFlexScannerSetExtraFunc yyset_extra_func);
173 
174 
175 
177 gfsmScanner *gfsm_scanner_init_full(gfsmScanner *scanner,
178  const char *name,
179  gfsmFlexScannerInitFunc yyinit_func,
180  gfsmFlexScannerFreeFunc yyfree_func,
181  gfsmFlexScannerScanFileFunc yyscan_file_func,
182  gfsmFlexScannerScanBytesFunc yyscan_bytes_func,
183  gfsmFlexScannerScanPopFunc yyscan_pop_func,
184  gfsmFlexScannerGetTextFunc yyget_text_func,
185  gfsmFlexScannerGetPosFunc yyget_lineno_func,
186  gfsmFlexScannerSetPosFunc yyset_lineno_func,
187  gfsmFlexScannerSetExtraFunc yyset_extra_func);
188 
192 void gfsm_scanner_free(gfsmScanner *scanner);
193 
194 
195 /*======================================================================
196  * gfsmScanner: I/O Selection
197  */
198 
200 
201 
203 void gfsm_scanner_close(gfsmScanner *scanner);
204 
206 void gfsm_scanner_scan_file(gfsmScanner *scanner, FILE *f);
207 
209 void gfsm_scanner_scan_filename(gfsmScanner *scanner, const char *filename);
210 
212 void gfsm_scanner_scan_bytes(gfsmScanner *scanner, const char *bytes, int len);
213 
215 void gfsm_scanner_scan_gstring(gfsmScanner *scanner, GString *gstr);
216 
218 void gfsm_scanner_scan_string(gfsmScanner *scanner, const char *str);
219 
221 
222 /*======================================================================
223  * Scanner Methods: Flex scanner utilities
224  */
226 
227 
229 int gfsm_scanner_yywrap(gfsmScanner *scanner);
230 
232 #define GFSM_SCANNER_YYWRAP(PREFIX) \
233  int PREFIX ## wrap(gfsmFlexScanner yyscanner) \
234  { return gfsm_scanner_yywrap( yyscanner ); }
235 
237 
238 /*======================================================================
239  * Scanner Methods: Errors
240  */
242 
243 
245 void gfsm_scanner_carp(gfsmScanner *scanner, const char *fmt, ...);
246 
248 void gfsm_scanner_carp_full(gfsmScanner *scanner,
249  GQuark domain,
250  gint code,
251  const char *fmt,
252  ...);
253 
255 void gfsm_scanner_carp_full_v(gfsmScanner *scanner,
256  GQuark domain,
257  gint code,
258  const char *fmt,
259  va_list ap);
261 
262 #endif /* _GFSM_SCANNER_H */