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