1 /*
2  * $Id: filters.h,v 1.145 2020/01/18 01:54:32 tom Exp $
3  */
4 
5 #ifndef FILTERS_H
6 #define FILTERS_H 1
7 /* *INDENT-OFF* */
8 
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12 
13 #include <flt_defs.h>
14 
15 #define CharOf(c)   ((unsigned char)(c))
16 
17 /* win32 "enhanced" shell cannot echo '&', which we need for builtflt.h */
18 #undef ADDR
19 #define ADDR(value) &value
20 
21 #define MY_NAME "vile"
22 
23 /*
24  * Default attributes across all filters
25  */
26 #define ATTR_ACTION  "BC1"
27 #define ATTR_COMMENT "C1"
28 #define ATTR_ERROR   "RC2"
29 #define ATTR_IDENT   ""
30 #define ATTR_IDENT2  "C6"
31 #define ATTR_KEYWORD "B"	/* was C3 */
32 #define ATTR_KEYWRD2 "B"
33 #define ATTR_LITERAL "UC5"	/* was C4 */
34 #define ATTR_NUMBER  "C6"	/* was C5 */
35 #define ATTR_PREPROC "C2"
36 #define ATTR_TYPES   "C4"
37 
38 /*
39  * Common/Special token types
40  */
41 #define NAME_ACTION  "Action"
42 #define NAME_COMMENT "Comment"
43 #define NAME_ERROR   "Error"
44 #define NAME_IDENT   "Ident"
45 #define NAME_IDENT2  "Ident2"
46 #define NAME_KEYWORD "Keyword"
47 #define NAME_KEYWRD2 "Keyword2"
48 #define NAME_LITERAL "Literal"
49 #define NAME_NUMBER  "Number"
50 #define NAME_PREPROC "Preproc"
51 #define NAME_TYPES   "Type"
52 
53 /*
54  * Our magic characters.
55  */
56 #define CTL_A	'\001'
57 #define CTL_V	'\026'
58 
59 /*
60  * Useful character definitions
61  */
62 #define BQUOTE  '`'
63 #define SQUOTE  '\''
64 #define DQUOTE  '"'
65 
66 #define L_ANGLE '<'
67 #define R_ANGLE '>'
68 #define L_CURLY '{'
69 #define R_CURLY '}'
70 #define L_PAREN '('
71 #define R_PAREN ')'
72 #define L_BLOCK '['
73 #define R_BLOCK ']'
74 
75 /*
76  * Pathname definitions
77  */
78 #ifndef PATHCHR			/* may be defined in estruct.h */
79 #if defined(VMS) || defined(__VMS) /* predefined by DEC's VMS compilers */
80 # define PATHCHR ','
81 # define PATHSEP '/'		/* this will work only with Unix-style names */
82 #elif defined(_WIN32) || defined(__GO32__) || defined(__EMX__)
83 # define PATHCHR ';'
84 # define PATHSEP '\\'
85 #else
86 # define PATHCHR ':'
87 # define PATHSEP '/'
88 #endif
89 #endif
90 
91 #if defined(VMS) || defined(__VMS) /* predefined by DEC's VMS compilers */
92 # define PATHDOT "[]"
93 # define DOT_HIDES_FILE 0
94 #else
95 # define PATHDOT "."
96 # if defined(_WIN32) || defined(__GO32__) || defined(__EMX__)
97 #  define DOT_HIDES_FILE 0
98 # else
99 #  define DOT_HIDES_FILE 1
100 # endif
101 #endif
102 
103 #if defined(_WIN32)
104 #define HAVE_LONG_FILE_NAMES 1
105 #endif
106 
107 typedef void (*EachKeyword)(const char *name, int size, const char *attr);
108 
109 /*
110  * Declared in the language-specific lex file
111  */
112 typedef struct {
113 	const char *filter_name;
114 	int loaded;
115 	void (*InitFilter)(int before);
116 	void (*DoFilter)(FILE *in);
117 	const char *options;
118 #if NO_LEAKS
119 	void (*FreeFilter)(void);
120 #define DCL_LEXFREE static void free_filter(void);
121 #define REF_LEXFREE ,free_filter
122 #else
123 #define DCL_LEXFREE /* nothing */
124 #define REF_LEXFREE /* nothing */
125 #endif
126 } FILTER_DEF;
127 
128 #ifdef LEX_IS_FLEX
129 #ifndef YY_CURRENT_BUFFER
130 #define YY_CURRENT_BUFFER yy_current_buffer
131 #endif
132 #ifndef YY_CURRENT_BUFFER_LVALUE
133 #define YY_CURRENT_BUFFER_LVALUE YY_CURRENT_BUFFER
134 #endif
135 #define USE_LEXFREE { yy_delete_buffer(YY_CURRENT_BUFFER); YY_CURRENT_BUFFER_LVALUE = 0; yy_init = 1; }
136 #else
137 #define USE_LEXFREE if (yytext) { free(yytext); yytext = 0; yytextsz = 0; }
138 #endif
139 
140 #ifdef FLEX_DEBUG
141 #define FLEX_PRINTF(param) if (yy_flex_debug) fprintf param
142 #else
143 #define FLEX_PRINTF(param) /* nothing */
144 #endif
145 
146 /*
147  * This is redefinable so we can make a list of all built-in filter definitions
148  */
149 extern FILTER_DEF filter_def;
150 
151 /*
152  * Use flex's parser-specific wrap-function.
153  */
154 #if defined(FLEX_SCANNER)
155 #undef yywrap
156 #endif
157 
158 /*
159  * Workaround for incompatibilities between "new" flex versus flex/reflex.
160  * One of the problems with "new" flex is that it reverses the order of
161  * definitions for yywrap.
162  */
163 #if defined(FLEX_SCANNER) && defined(YY_FLEX_SUBMINOR_VERSION)
164 #define YY_SKIP_YYWRAP
165 #define yywrap() private_yywrap()
166 #define USE_LEXWRAP static int private_yywrap(void) { return 1; }
167 #else
168 #define USE_LEXWRAP /* nothing */
169 #endif
170 
171 /*
172  * We'll put a DefineFilter() in each filter program.  To handle special cases
173  * such as c-filt.c, use DefineOptFilter().
174  */
175 #define DefineOptFilter(name,options) \
176 USE_LEXWRAP \
177 static void init_filter(int before); \
178 static void do_filter(FILE *Input); \
179 DCL_LEXFREE \
180 FILTER_DEF filter_def = { #name, 1, init_filter, do_filter, options REF_LEXFREE }
181 
182 #define DefineFilter(name) DefineOptFilter(name,0)
183 
184 #if NO_LEAKS
185 #define LoadableFilter(name) \
186 	extern FILTER_DEF define_##name; \
187 	FILTER_DEF define_##name = { #name, 0, 0, 0, 0, 0 }
188 #else
189 #define LoadableFilter(name) \
190 	extern FILTER_DEF define_##name; \
191 	FILTER_DEF define_##name = { #name, 0, 0, 0, 0 }
192 #endif
193 
194 #if defined(FLEX_SCANNER)
195 #if defined(filter_def)
196 #define ECHO flt_echo(yytext, yyleng);		/* in builtflt.c */
197 #define YY_INPUT(buf,result,max_size) result = flt_input(buf,max_size)
198 #define YY_FATAL_ERROR(msg) flt_failed(msg);
199 #else
200 #define ECHO flt_puts(yytext, yyleng, "");	/* in filterio.c */
201 #endif
202 /* quiet "gcc -Wunused" warnings */
203 #define YY_NEVER_INTERACTIVE 1
204 #define YY_ALWAYS_INTERACTIVE 0
205 #define YY_MAIN 0
206 #define YY_NO_UNPUT 1
207 #define YY_STACK_USED 0
208 #endif
209 
210 /*
211  * lex should declare these:
212  */
213 #ifndef FLEX_SCANNER
214 extern FILE *yyin;
215 #endif
216 
217 /*
218  * flex "-+" option provides a C++ class for the lexer, which has a different
219  * interface.  Allow this to compile (FIXME - the streams do not connect, so
220  * it does not run yet - 2008/11/19).
221  */
222 #ifdef __FLEX_LEXER_H
223 #define InitLEX(theInput) \
224 	yyFlexLexer lexer
225 #define RunLEX() if (flt_succeeds()) while (lexer.yylex() > 0)
226 #else
227 #define InitLEX(theInput) yyin = theInput
228 #define RunLEX() if (flt_succeeds()) while (yylex() > 0)
229 #endif
230 
231 #if defined(__GNUC__) || defined(__INTEL_COMPILER)
232 extern int yylex(void);
233 #ifndef yywrap
234 extern int yywrap(void);
235 #endif
236 #endif /* __GNUC__ */
237 
238 /*
239  * 2003/5/20 - "new" flex 2.5.31:
240  * workaround for "developers" who don't use compiler-warnings...
241  * perhaps by the time "new" flex merits the term "beta", they'll fix this:
242  */
243 #if defined(FLEX_BETA)
244 extern FILE *yyget_in (void);
245 extern FILE *yyget_out (void);
246 extern char *yyget_text (void);
247 extern int yyget_debug (void);
248 extern int yyget_lineno (void);
249 extern int yylex_destroy (void);
250 extern void yyset_debug (int bdebug);
251 extern void yyset_in (FILE * in_str);
252 extern void yyset_lineno (int line_number);
253 extern void yyset_out (FILE * out_str);
254 #if !defined(YY_FLEX_SUBMINOR_VERSION)
255 extern int yyget_leng (void);
256 #elif (YY_FLEX_MINOR_VERSION < 6) && (YY_FLEX_SUBMINOR_VERSION < 37)
257 extern yy_size_t yyget_leng (void);
258 #elif (YY_FLEX_MINOR_VERSION < 6)
259 extern yy_size_t yyget_leng (void);
260 #endif
261 /* there's also warnings for unused 'yyunput()', but I don't see a fix */
262 /* flex's skeleton includes <unistd.h> - no particular reason apparent */
263 #endif
264 
265 #define YY_NO_INPUT 1		/* get rid of 'input()' function */
266 
267 /*
268  * Declared in the filters.c file.
269  */
270 
271 typedef struct _keyword KEYWORD;
272 
273 extern char *default_attr;
274 extern char *default_table;
275 extern int zero_or_more;
276 extern int zero_or_all;
277 extern int eqls_ch;
278 extern int meta_ch;
279 extern int vile_keywords;
280 extern int flt_options[256];
281 
282 #if defined(__GNUC__) && defined(_FORTIFY_SOURCE)
283 extern int ignore_unused;
284 #endif
285 
286 #define FltOptions(c) flt_options[CharOf(c)]
287 
288 extern KEYWORD *is_class(const char *name);
289 extern KEYWORD *is_keyword(const char *name);
290 extern KEYWORD *keyword_data(const char *name);
291 extern char *class_attr(const char *name);
292 extern const char *ci_keyword_attr(const char *name);
293 extern const char *ci_keyword_flag(const char *name);
294 extern const char *get_keyword_attr(const char *text);
295 extern const char *get_symbol_table(void);
296 extern const char *keyword_attr(const char *name);
297 extern const char *keyword_flag(const char *name);
298 extern const char *lowercase_of(const char *name);
299 extern char *readline(FILE *fp, char **ptr, size_t *len);
300 extern char *skip_ident(char *src);
301 extern int ci_compare(const char *a, const char *b);
302 extern int flt_bfr_length(void);
303 extern int set_symbol_table(const char *classname);
304 extern long hash_function(const char *id);
305 extern void *flt_alloc(void *ptr, size_t need, size_t *have, size_t size);
306 extern void flt_bfr_append(const char *text, int length);
307 extern void flt_bfr_begin(const char *attr);
308 extern void flt_bfr_embed(const char *text, int length, const char *attr);
309 extern void flt_bfr_error(void);
310 extern void flt_bfr_finish(void);
311 extern void flt_dump_symtab(const char *table_name);
312 extern void flt_free(char **p, size_t *len);
313 extern void flt_free_keywords(const char *classname);
314 extern void flt_free_symtab(void);
315 extern void flt_init_attr(const char *attr_name);
316 extern void flt_init_table(const char *table_name);
317 extern void flt_initialize(const char *classname);
318 extern void flt_make_symtab(const char *classname);
319 extern void flt_read_keywords(const char *classname);
320 extern void flt_setup_symbols(const char *table_name);
321 extern void insert_keyword(const char *ident, const char *attribute, int classflag);
322 extern void parse_keyword(char *name, int classflag);
323 
324 #define type_alloc(type, ptr, need, have) (type*)flt_alloc(ptr, need, have, sizeof(type))
325 #define do_alloc(ptr, need, have) type_alloc(char, ptr, need, have)
326 
327 /*
328  * Declared in filterio.c and/or builtflt.c
329  */
330 #ifndef VILE_PROTO_H
331 
332 extern char *skip_blanks(char *src);
333 extern char *vile_getenv(const char *name);
334 extern int vl_lookup_color(const char *name);
335 extern int vl_lookup_func(const char *name);
336 extern int vl_lookup_xcolor(const char *name);
337 extern void mlforce(const char *fmt, ...) VILE_PRINTF(1,2);
338 
339 #ifndef strmalloc
340 extern char *strmalloc(const char *src);
341 #endif
342 
343 #endif
344 
345 extern char *flt_gets(char **ptr, size_t *len);
346 extern char *flt_put_blanks(char *string);
347 extern const char *flt_name(void);
348 extern const void *vl_lookup_cmd(const char *name);
349 extern int chop_newline(char *s);
350 extern int flt_get_col(void);
351 extern int flt_get_line(void);
352 extern int flt_input(char *buffer, int max_size);
353 extern int flt_lookup(char *name);
354 extern int flt_restart(char *name);
355 extern int flt_start(char *name);
356 extern int vl_check_cmd(const void *cmd, unsigned long flags);
357 extern int vl_is_majormode(const void *cmd);
358 extern int vl_is_setting(const void *cmd);
359 extern int vl_is_submode(const void *cmd);
360 extern int vl_is_xcolor(const void *cmd);
361 extern int vl_lookup_mode(const char *name);
362 extern int vl_lookup_var(const char *name);
363 extern int flt_succeeds(void);
364 extern void flt_echo(const char *string, int length);
365 extern void flt_error(const char *fmt, ...) VILE_PRINTF(1,2);
366 extern void flt_failed(const char *msg);
367 extern void flt_finish(void);
368 extern void flt_message(const char *fmt, ...) VILE_PRINTF(1,2);
369 extern void flt_putc(int ch);
370 extern void flt_puts(const char *string, int length, const char *attribute);
371 
372 /*
373  * declared in main.c or filters.c
374  */
375 
376 #define WriteToken(attr) flt_puts(yytext, yyleng, attr)
377 #define WriteToken2(attr,len) flt_puts(yytext + (len), yyleng - (len), attr)
378 #define WriteToken3(attr,len) flt_puts(yytext, (len), attr)
379 
380 #define BeginQuote(state, attr) \
381 			BEGIN(state); \
382 			flt_bfr_begin(attr); \
383 			flt_bfr_append(yytext, yyleng)
384 
385 #define FinishQuote(state) \
386 			flt_bfr_append(yytext, yyleng);\
387 			flt_bfr_finish();\
388 			BEGIN(state)
389 
390 /* see fltstack.h */
391 #define PushQuote(state, attr) \
392 			push_state(state); \
393 			flt_bfr_begin(attr); \
394 			flt_bfr_append(yytext, yyleng)
395 
396 #define PopQuote() \
397 			flt_bfr_append(yytext, yyleng);\
398 			flt_bfr_finish();\
399 			pop_state()
400 
401 #if CAN_TRACE && NO_LEAKS
402 #include <trace.h>
403 #endif
404 
405 #ifdef __cplusplus
406 }
407 #endif
408 
409 /* *INDENT-ON* */
410 
411 #endif /* FILTERS_H */
412