#include "files.h"
int as3_pass = 0;
-
int as3_verbosity = 1;
+unsigned int as3_tokencount = 0;
+
void as3_error(const char*format, ...)
{
char buf[1024];
fflush(stdout);
}
-
-
#ifndef YY_CURRENT_BUFFER
#define YY_CURRENT_BUFFER yy_current_buffer
#endif
+static void*as3_buffer=0;
+static int as3_buffer_pos=0;
+static int as3_buffer_len=0;
+void as3_file_input(FILE*fi)
+{
+ as3_in = fi;
+ as3_buffer = 0;
+}
+void as3_buffer_input(void*buffer, int len)
+{
+ as3_buffer = buffer;
+ as3_buffer_len = len;
+ as3_buffer_pos = 0;
+ as3_in = 0;
+}
+
+#define YY_INPUT(buf,result,max_size) { \
+ if(!as3_buffer) { \
+ errno=0; \
+ while((result = fread(buf, 1, max_size, as3_in))==0 && ferror(as3_in)) \
+ { if(errno != EINTR) {YY_FATAL_ERROR("input in flex scanner failed"); break;} \
+ errno=0; clearerr(as3_in); \
+ } \
+ } else { \
+ int to_read = max_size; \
+ if(to_read + as3_buffer_pos > as3_buffer_len) \
+ to_read = as3_buffer_len - as3_buffer_pos; \
+ memcpy(buf, as3_buffer+as3_buffer_pos, to_read); \
+ as3_buffer_pos += to_read; \
+ result=to_read; \
+ } \
+}
+
void handleInclude(char*text, int len, char quotes)
{
char*filename = 0;
filename = strdup(&text[i1]);
}
- char*fullfilename = enter_file(filename, YY_CURRENT_BUFFER);
+ char*fullfilename = find_file(filename);
+ enter_file2(filename, fullfilename, YY_CURRENT_BUFFER);
yyin = fopen(fullfilename, "rb");
if (!yyin) {
syntaxerror("Couldn't open include file \"%s\"\n", fullfilename);
return out;
}
+static void handleCData(char*s, int len)
+{
+ a3_lval.str.str = s+9; // <![CDATA[
+ a3_lval.str.len = len-9-3;// ]]>
+ a3_lval.str.str = strdup_n(a3_lval.str.str, a3_lval.str.len);
+}
+
static void handleString(char*s, int len)
{
+ if(as3_pass < 2) {
+ // don't bother decoding strings in pass 1
+ memset(&a3_lval, 0, sizeof(a3_lval));
+ return;
+ }
+
if(s[0]=='"') {
if(s[len-1]!='"') syntaxerror("String doesn't end with '\"'");
s++;len-=2;
char start_of_expression;
-static inline int mkid(int type)
+static inline int handleIdentifier(int type)
{
char*s = malloc(yyleng+1);
memcpy(s, yytext, yyleng);
//uint {c();return m(KW_UINT);}
//Number {c();return m(KW_NUMBER);}
-
%}
%s REGEXPOK
INTWITHSIGN [+-]?({INT})
FLOATWITHSIGN [+-]?({FLOAT})
+CDATA <!\[CDATA\[([^]]|\][^]]|\]\][^>])*\]*\]\]\>
STRING ["](\\[\x00-\xff]|[^\\"\n])*["]|['](\\[\x00-\xff]|[^\\'\n])*[']
S [ \n\r\t]
MULTILINE_COMMENT [/][*]+([*][^/]|[^/*]|[^*][/]|[\x00-\x1f])*[*]+[/]
^include{S}+{STRING}{S}*/\n {l();handleInclude(yytext, yyleng, 1);}
^include{S}+[^" \t\r\n][\x20-\xff]*{S}*/\n {l();handleInclude(yytext, yyleng, 0);}
{STRING} {l(); BEGIN(INITIAL);handleString(yytext, yyleng);return T_STRING;}
+{CDATA} {l(); BEGIN(INITIAL);handleCData(yytext, yyleng);return T_STRING;}
<BEGINNING,REGEXPOK>{
{REGEXP} {c(); BEGIN(INITIAL);return handleregexp();}
in {c();return m(KW_IN) ;}
if {c();return m(KW_IF) ;}
as {c();return m(KW_AS);}
-{NAME} {c();BEGIN(INITIAL);return mkid(T_IDENTIFIER);}
+{NAME} {c();BEGIN(INITIAL);return handleIdentifier(T_IDENTIFIER);}
[+-\/*^~@$!%&\(=\[\]\{\}|?:;,<>] {c();BEGIN(REGEXPOK);return m(yytext[0]);}
[\)\]] {c();BEGIN(INITIAL);return m(yytext[0]);}
-. {char c1=yytext[0];
+. {/* ERROR */
+ char c1=yytext[0];
char buf[128];
buf[0] = yytext[0];
int t;
BEGIN(BEGINNING);
}
+