added support for mem input
authorMatthias Kramm <kramm@quiss.org>
Sat, 7 Feb 2009 19:53:22 +0000 (20:53 +0100)
committerMatthias Kramm <kramm@quiss.org>
Sat, 7 Feb 2009 19:53:22 +0000 (20:53 +0100)
lib/as3/tokenizer.h
lib/as3/tokenizer.lex

index 149ccd0..67458ca 100644 (file)
@@ -80,6 +80,9 @@ void as3_error(const char*format, ...);
 void as3_warning(const char*format, ...);
 void as3_softwarning(const char*format, ...);
 
+void as3_buffer_input(void*buffer, int len);
+void as3_file_input(FILE*fi);
+
 #define T_EOF 0
 
 extern int avm2_lex();
index 54d04c5..63f586d 100644 (file)
@@ -95,12 +95,43 @@ static void dbg(const char*format, ...)
     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;
@@ -123,7 +154,8 @@ void handleInclude(char*text, int len, char quotes)
         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);
@@ -276,7 +308,7 @@ static void handleString(char*s, int len)
 
 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);
@@ -495,7 +527,6 @@ static inline void c() {
 //uint                         {c();return m(KW_UINT);}
 //Number                       {c();return m(KW_NUMBER);}
 
-
 %}
 
 %s REGEXPOK
@@ -635,7 +666,7 @@ is                           {c();return m(KW_IS) ;}
 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]);}
@@ -738,3 +769,4 @@ void initialize_scanner()
     BEGIN(BEGINNING);
 }
 
+