#define yyalloc M4_YY_PREFIX[[alloc]]
#define yyrealloc M4_YY_PREFIX[[realloc]]
#define yyfree M4_YY_PREFIX[[free]]
+m4_ifdef( [[M4_YY_CHARSET]], [[
+#define yycharset M4_YY_PREFIX[[charset]]
+#define yycharset_handler M4_YY_PREFIX[[charset_handler]]
+]])
)
%endif
%endif
[[
M4_GEN_PREFIX(`get_column')
M4_GEN_PREFIX(`set_column')
+ m4_ifdef( [[M4_YY_CHARSET]], [[
+ M4_GEN_PREFIX(`get_charset')
+ M4_GEN_PREFIX(`set_charset')
+ M4_GEN_PREFIX(`get_charset_handler')
+ M4_GEN_PREFIX(`set_charset_handler')
+ ]])
]])
M4_GEN_PREFIX(`wrap')
%endif
#define yytext YY_G(yytext_r)
#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno)
#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column)
+m4_ifdef( [[M4_YY_CHARSET]], [[
+#define yycharset YY_G(yycharset_r)
+#define yycharset_handler YY_G(yycharset_handler_r)
+]])
#define yy_flex_debug YY_G(yy_flex_debug_r)
m4_define( [[M4_YY_INCR_LINENO]],
$3 $4; [[\]]
$5 $6; [[\]]
M4_YY_DECL_LAST_ARG]])
+ m4_define( [[YYFARGS4]], [[($2,$4,$6,$8 M4_YY_DEF_LAST_ARG) [[\]]
+ $1 $2; [[\]]
+ $3 $4; [[\]]
+ $5 $6; [[\]]
+ $7 $8; [[\]]
+ M4_YY_DECL_LAST_ARG]])
+ m4_define( [[YYFARGS5]], [[($2,$4,$6,$8,$10 M4_YY_DEF_LAST_ARG) [[\]]
+ $1 $2; [[\]]
+ $3 $4; [[\]]
+ $5 $6; [[\]]
+ $7 $8; [[\]]
+ $9 $10; [[\]]
+ M4_YY_DECL_LAST_ARG]])
]],
[[
%# Generate C99 function defs.
m4_define( [[YYFARGS1]], [[($1 $2 M4_YY_DEF_LAST_ARG)]])
m4_define( [[YYFARGS2]], [[($1 $2, $3 $4 M4_YY_DEF_LAST_ARG)]])
m4_define( [[YYFARGS3]], [[($1 $2, $3 $4, $5 $6 M4_YY_DEF_LAST_ARG)]])
+ m4_define( [[YYFARGS4]], [[($1 $2, $3 $4, $5 $6, $7 $8
+ M4_YY_DEF_LAST_ARG)]])
+ m4_define( [[YYFARGS5]], [[($1 $2, $3 $4, $5 $6, $7 $8, $9 $10
+ M4_YY_DEF_LAST_ARG)]])
]])
m4_ifdef( [[M4_YY_NOT_IN_HEADER]],
%if-c-only
%if-not-reentrant
extern FILE *yyin, *yyout;
+m4_ifdef( [[M4_YY_CHARSET]], [[
+extern char *yycharset;
+]])
%endif
%endif
int yy_fill_buffer;
int yy_buffer_status;
+
+m4_ifdef( [[M4_YY_CHARSET]],[[
+ char *yy_input_buffer;
+ size_t yy_input_buffer_length;
+]])
+
m4_ifdef( [[M4_YY_NOT_IN_HEADER]],
[[
#define YY_BUFFER_NEW 0
YYLTYPE * yylloc_r;
]])
+m4_ifdef( [[M4_YY_CHARSET]], [[
+ char *yycharset_r; /** current charset name */
+ yycharset_handler_t yycharset_handler_r; /** charset handle function */
+]])
+
}; /* end struct yyguts_t */
]])
]])
]])
+m4_ifdef( [[M4_YY_REENTRANT]],[[
+m4_ifdef( [[M4_YY_CHARSET]],[[
+m4_ifdef( [[M4_YY_NO_GET_CHARSET]],,[[
+char *yyget_charset M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG );
+yycharset_handler_t yyget_charset_handler M4_YY_PARAMS( M4_YY_PROTO_ONLY_ARG );
+]])
+]])
+]])
+
+m4_ifdef( [[M4_YY_REENTRANT]],[[
+/* YY_REENTRANT */
+m4_ifdef( [[M4_YY_CHARSET]], [[
+/* YY_CHARSET */
+m4_ifdef( [[M4_YY_NO_SET_CHARSET]],,[[
+/* !YY_NO_SET_CHARSET */
+void yyset_charset M4_YY_PARAMS( char *charset M4_YY_PROTO_LAST_ARG );
+void yyset_charset_handler M4_YY_PARAMS( yycharset_handler_t charset_handler M4_YY_PROTO_LAST_ARG );
+]])
+]])
+]])
+
%if-bison-bridge
m4_ifdef( [[M4_YY_NO_GET_LVAL]],,
[[
*/
#ifndef YY_INPUT
#define YY_INPUT(buf,result,max_size) \
+do {\
%% [5.0] fread()/read() definition of YY_INPUT goes here unless we're doing C++ \
\
%if-c++-only C++ definition \
- if ( (int)(result = LexerInput( (char *) buf, max_size )) < 0 ) \
- YY_FATAL_ERROR( "input in flex scanner failed" );
-%endif
-
+ if ( (result = LexerInput( (char *) buf, max_size )) < 0 ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+%endif \
+} while(0)
#endif
]])
%ok-for-header
%endif
+m4_ifdef( [[M4_YY_NOT_IN_HEADER]],[[
+m4_ifdef( [[M4_YY_CHARSET]],[[
+/* yycharset_convert - convert incoming data from arbitrary
+ * charset into internal representation
+ */
+static size_t yycharset_convert YYFARGS5(
+ char*, source, size_t, source_bytes,
+ YY_CHAR*, target, size_t, target_length,
+ size_t*, converted_bytes) {
+ M4_YY_DECL_GUTS_VAR();
+ if(strcmp(yycharset, "M4_YY_CHARSET_SOURCE")==0) {
+ if(target_length < source_bytes)
+ YY_FATAL_ERROR("Too small buffer");
+ strncpy((char*)target, source, source_bytes);
+ *converted_bytes = source_bytes;
+ return source_bytes;
+ } else if(yycharset_handler)
+ return yycharset_handler(yycharset, source, source_bytes,
+ target, target_length, converted_bytes M4_YY_CALL_LAST_ARG);
+ else {
+ char msg[256];
+ snprintf(msg, sizeof(msg),
+ "Unsupported character encoding: %s", yycharset);
+ YY_FATAL_ERROR(msg);
+ }
+ return 0;
+}
+]])
+]])
+
m4_ifdef( [[M4_YY_NOT_IN_HEADER]],
[[
/* yy_get_next_buffer - try to read in a new buffer
num_to_read = YY_READ_BUF_SIZE;
/* Read in more data. */
+m4_ifdef([[M4_YY_CHARSET]],[[
+ if(yycharset) {
+ const size_t max_size = YY_READ_BUF_SIZE * sizeof(YY_CHAR);
+ char buffer[max_size];
+ memcpy(buffer, YY_CURRENT_BUFFER_LVALUE->yy_input_buffer,
+ YY_CURRENT_BUFFER_LVALUE->yy_input_buffer_length);
+
+ size_t read_bytes, converted_characters;
+ YY_INPUT(
+ (&buffer[YY_CURRENT_BUFFER_LVALUE->yy_input_buffer_length]),
+ (read_bytes),
+ (max_size-YY_CURRENT_BUFFER_LVALUE->yy_input_buffer_length)
+ );
+ size_t converted_bytes = 0;
+ converted_characters = yycharset_convert(
+ buffer,
+ YY_CURRENT_BUFFER_LVALUE->yy_input_buffer_length+read_bytes,
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move],
+ num_to_read,
+ &converted_bytes M4_YY_CALL_LAST_ARG);
+ if(converted_characters == 0 && read_bytes != 0)
+ YY_FATAL_ERROR("Could not convert input characters");
+ YY_G(yy_n_chars) = converted_characters;
+
+ /* store left bytes in yy_input_buffer */
+ YY_CURRENT_BUFFER_LVALUE->yy_input_buffer_length +=
+ read_bytes-converted_bytes;
+
+ YY_CURRENT_BUFFER_LVALUE->yy_input_buffer = (char*)yyrealloc(
+ (void*) YY_CURRENT_BUFFER_LVALUE->yy_input_buffer,
+ YY_CURRENT_BUFFER_LVALUE->yy_input_buffer_length
+ M4_YY_CALL_LAST_ARG);
+ memcpy(YY_CURRENT_BUFFER_LVALUE->yy_input_buffer,
+ &buffer[converted_bytes],
+ YY_CURRENT_BUFFER_LVALUE->yy_input_buffer_length);
+ } else
+]])
YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
YY_G(yy_n_chars), num_to_read );
b->yy_is_interactive = 0;
%endif
errno = oerrno;
+
+m4_ifdef([[M4_YY_CHARSET]],[[
+ b->yy_input_buffer = NULL;
+ b->yy_input_buffer_length = 0;
+]])
}
/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
]])
]])
+m4_ifdef( [[M4_YY_REENTRANT]],[[
+m4_ifdef( [[M4_YY_CHARSET]], [[
+m4_ifdef( [[M4_YY_NO_GET_CHARSET]],,[[
+/** Get the currently set charset name
+ * M4_YY_DOC_PARAM
+ */
+char *yyget_charset YYFARGS0(void)
+{
+ M4_YY_DECL_GUTS_VAR();
+ return yycharset;
+}
+]])
+
+m4_ifdef( [[M4_YY_NO_GET_CHARSET_HANDLER]],,[[
+/** Get the currently set charset handler
+ * M4_YY_DOC_PARAM
+ */
+yycharset_handler_t yyget_charset_handler YYFARGS0(void)
+{
+ M4_YY_DECL_GUTS_VAR();
+ return yycharset_handler;
+}
+]])
+]])
+]])
+
m4_ifdef( [[M4_YY_NO_GET_IN]],,
[[
/** Get the input stream.
]])
]])
+m4_ifdef( [[M4_YY_REENTRANT]],[[
+m4_ifdef( [[M4_YY_CHARSET]], [[
+m4_ifdef( [[M4_YY_NO_SET_CHARSET]],,[[
+/** Set the current charset name
+ * @param charset charset name
+ * M4_YY_DOC_PARAM
+ */
+void yyset_charset YYFARGS1( char*, charset)
+{
+ M4_YY_DECL_GUTS_VAR();
+ yycharset = strdup(charset);
+}
+]])
+
+m4_ifdef( [[M4_YY_NO_SET_CHARSET_HANDLER]],,[[
+/** Set the current charset handler
+ * @param charset_handler handler function
+ * M4_YY_DOC_PARAM
+ */
+void yyset_charset_handler YYFARGS1( yycharset_handler_t, charset_handler)
+{
+ M4_YY_DECL_GUTS_VAR();
+ yycharset_handler = charset_handler;
+}
+]])
+]])
+]])
+
m4_ifdef( [[M4_YY_NO_SET_IN]],,
[[
YY_G(yy_prev_more_offset) = 0;
]])
+m4_ifdef( [[M4_YY_CHARSET]],[[
+ yycharset = NULL;
+ yycharset_handler = NULL;
+]])
+
/* Defined in main.c */
#ifdef YY_STDINIT
yyin = stdin;
jmp_buf flex_main_jmp_buf;
bool *rule_has_nl, *ccl_has_nl;
int nlch = '\n';
-bool ansi_func_defs, ansi_func_protos;
+bool ansi_func_defs, ansi_func_protos, charset_enabled = false;
+char *charset_source = NULL;
bool tablesext, tablesverify, gentables;
char *tablesfilename=0,*tablesname=0;
if (do_yylineno)
buf_m4_define (&m4defs_buf, "M4_YY_USE_LINENO", NULL);
+ if(charset_enabled)
+ buf_m4_define(&m4defs_buf, "M4_YY_CHARSET", NULL);
+
+ if(charset_source)
+ buf_m4_define(&m4defs_buf, "M4_YY_CHARSET_SOURCE", charset_source);
+
/* Create the alignment type. */
buf_strdefine (&userdef_buf, "YY_INT_ALIGNED",
long_align ? "long int" : "short int");
static char character_type_char[] = "typedef char YY_CHAR;";
static char character_defined[] = "#define YY_CHAR_DEFINED";
+ static char charset_handler_t[] = "typedef size_t(*yycharset_handler_t)(char*,char*,size_t,YY_CHAR*,size_t,size_t*);\n";
+ static char charset_handler_t_reentrant[] = "typedef size_t(*yycharset_handler_t)(char*,char*,size_t,YY_CHAR*,size_t,size_t*,yyscan_t);\n";
+
+
line_directive_out ((FILE *) 0, 1);
if (yyparse ()) {
outn ("extern YY_CHAR yytext[];\n");
}
else {
+ /* This prevents warning of "already defined macro" in multiple
+ * non-reentrant scanners */
+ outn("#ifdef yytext_ptr");
+ outn("#undef yytext_ptr");
+ outn("#endif");
+
if (reentrant) {
outn ("#define yytext_ptr yytext_r");
}
("%option yyclass only meaningful for C++ scanners"));
}
+ outn("");
+
+ if(charset_enabled) {
+ if(!reentrant)
+ outn(charset_handler_t);
+ else
+ outn(charset_handler_t_reentrant);
+
+ OUT_BEGIN_CODE ();
+ if(!C_plus_plus && !reentrant) {
+ outn("char *yycharset = NULL;");
+ outn("yycharset_handler_t yycharset_handler = NULL;");
+ }
+ OUT_END_CODE ();
+ }
+
if (useecs)
numecs = cre8ecs (nextecm, ecgroup, csize);
else