along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+#include "common.h"
#include "tokenizer.h"
#include "files.h"
#include "parser.h"
#include "parser.tab.h"
#include "compiler.h"
+#include "registry.h"
+#include "assets.h"
#include "../os.h"
#ifdef HAVE_SYS_STAT_H
#include <sys/stat.h>
extern int as3_lex();
extern int as3_lex_destroy();
+static char config_recurse = 0;
+
void as3_setverbosity(int level)
{
as3_verbosity=level;
{
add_include_dir(dir);
}
+void as3_set_option(const char*key, const char*value)
+{
+ if(!strcmp(key, "recurse")) {
+ config_recurse=atoi(value);
+ }
+}
static char registry_initialized = 0;
static char parser_initialized = 0;
//#define DEBUG
#define DEBUG if(0)
-#ifdef STORE_TOKENS
-static mem_t tokens;
-#endif
-
int a3_lex()
{
as3_tokencount++;
-#ifdef STORE_TOKENS
- if(as3_pass==1) {
- int token = as3_lex();
- /* FIXME: current_file needs to be stored, too */
- mem_put(&tokens, &token, sizeof(token));
- mem_put(&tokens, &a3_lval, sizeof(a3_lval));
- mem_put(&tokens, ¤t_line, sizeof(current_line));
- mem_put(&tokens, ¤t_column, sizeof(current_column));
- return token;
- } else {
- int token;
- mem_get(&tokens, &token, sizeof(token));
- mem_get(&tokens, &a3_lval, sizeof(a3_lval));
- mem_get(&tokens, ¤t_line, sizeof(current_line));
- mem_get(&tokens, ¤t_column, sizeof(current_column));
- return token;
- }
-#else
return as3_lex();
-#endif
}
-static void as3_parse_file_or_array(int pass, const char*name, const char*filename, const void*mem, int length)
+typedef struct _compile_list {
+ const char*name;
+ const char*filename;
+ struct _compile_list*next;
+} compile_list_t;
+static compile_list_t*compile_list=0;
+
+static void as3_parse_file_or_array(const char*name, const char*filename, const void*mem, int length)
{
if(!registry_initialized) {
registry_initialized = 1;
if(!parser_initialized) {
parser_initialized = 1;
initialize_parser();
-#if defined(STORE_TOKENS)
- mem_init(&tokens);
-#endif
}
- as3_pass=pass;
FILE*fi = 0;
if(filename) {
- DEBUG printf("[pass %d] parse file %s %s\n", pass, name, filename);
+ if(as3_pass==1 && !mem) {
+ // record the fact that we compiled this file
+ compile_list_t*c = rfx_calloc(sizeof(compile_list_t));
+ c->next = compile_list;
+ c->name = strdup(name);
+ c->filename = strdup(filename);
+ compile_list = c;
+ }
+ DEBUG printf("[pass %d] parse file %s %s\n", as3_pass, name, filename);
fi = enter_file2(name, filename, 0);
as3_file_input(fi);
} else {
- DEBUG printf("[pass %d] parse bytearray %s (%d bytes)\n", pass, name, length);
+ DEBUG printf("[pass %d] parse bytearray %s (%d bytes)\n", as3_pass, name, length);
enter_file(name, name, 0);
as3_buffer_input((void*)mem, length);
}
a3_parse();
as3_lex_destroy();
finish_file();
+ if(fi) fclose(fi);
}
typedef struct _scheduled_file {
static scheduled_file_t*scheduled=0;
dict_t*scheduled_dict=0;
-void as3_parse_scheduled(int pass)
+void as3_parse_scheduled()
{
- DEBUG printf("[pass %d] parse scheduled\n", pass);
+ DEBUG printf("[pass %d] parse scheduled\n", as3_pass);
while(scheduled) {
scheduled_file_t*s = scheduled;
scheduled = 0;
while(s) {
scheduled_file_t*old = s;
- as3_parse_file_or_array(pass, s->name, s->filename, 0,0);
+ as3_parse_file_or_array(s->name, s->filename, 0,0);
s = s->next;
free(old->filename);
}
filename = normalize_path(filename);
-
+
if(dict_contains(scheduled_dict, filename)) {
return; //already processed
} else {
scheduled = f;
}
+void as3_parse_list()
+{
+ while(compile_list) {
+ as3_parse_file_or_array(compile_list->name, compile_list->filename, 0,0);
+ compile_list = compile_list->next;
+ }
+}
+
void as3_parse_bytearray(const char*name, const void*mem, int length)
{
- as3_parse_file_or_array(1, name, 0, mem, length);
- as3_parse_scheduled(1);
+ as3_pass = 1;
+ as3_parse_file_or_array(name, 0, mem, length);
+ as3_parse_scheduled();
+
+ registry_resolve_all();
- as3_parse_file_or_array(2, name, 0, mem, length);
- as3_parse_scheduled(2);
+ as3_pass = 2;
+ as3_parse_file_or_array(name, 0, mem, length);
+ as3_parse_list();
}
void as3_parse_file(const char*filename)
{
- char*fullfilename = find_file(filename);
+ char*fullfilename = find_file(filename, 1);
if(!fullfilename)
return; // not found
+
+ compile_list = 0;
+ as3_pass = 1;
+ as3_schedule_file(filename, fullfilename);
+ as3_parse_scheduled();
- as3_parse_file_or_array(1, filename, fullfilename, 0,0);
- as3_parse_scheduled(1);
+ registry_resolve_all();
- as3_parse_file_or_array(2, filename, fullfilename, 0,0);
- as3_parse_scheduled(2);
+ as3_pass = 2;
+ as3_parse_list();
free(fullfilename);
}
void as3_parse_directory(const char*dir)
{
- as3_pass=1;
+ compile_list = 0;
+
+ as3_pass = 1;
as3_schedule_directory(dir);
if(!scheduled)
as3_warning("Directory %s doesn't contain any ActionScript files", dir);
- as3_parse_scheduled(1);
- as3_pass=2;
- as3_schedule_directory(dir);
- as3_parse_scheduled(2);
+ as3_parse_scheduled();
+
+ registry_resolve_all();
+
+ as3_pass = 2;
+ as3_parse_list();
}
char as3_schedule_directory(const char*dirname)
char*dirname = strdup(package);
int s=0;
while(dirname[s]) {
- if(dirname[s]=='.') dirname[s]='/';
+ if(dirname[s]=='.')
+ dirname[s] = path_seperator;
s++;
};
- if(!as3_schedule_directory(package))
+ if(!as3_schedule_directory(dirname))
as3_softwarning("Could not find package %s in file system", package);
}
-void as3_schedule_class(const char*package, const char*cls)
+static void schedule_class(const char*package, const char*cls, char error)
{
- DEBUG printf("[pass %d] schedule class %s.%s\n", as3_pass, package, cls);
+ if(error) {
+ DEBUG printf("[pass %d] schedule class %s.%s\n", as3_pass, package, cls);
+ }
if(!cls) {
as3_schedule_package(package);
return;
strcpy(filename+t, cls);
strcpy(filename+t+l2, ".as");
- char*f=0;
- if(!(f=find_file(filename))) {
+ char*f=find_file(filename, error);
+ if(!f) {
int i;
- /* try lower case filename (not packagename!), too */
- for(i=t;i<t+l2;i++) {
- if(filename[i]>='A' && filename[i]<='Z')
- filename[i] += 'a'-'A';
- }
- if(!(f=find_file(filename))) {
- strcpy(filename+t, cls);
- strcpy(filename+t+l2, ".as");
- as3_warning("Could not open file %s", filename);
- return;
- }
+ filename = filename_to_lowercase(filename);
+ f=find_file(filename, error);
+ }
+ if(!f) {
+ if(error) {
+ strcpy(filename+t, cls);
+ strcpy(filename+t+l2, ".as");
+ as3_warning("Could not open file %s", filename);
+ }
+ return;
}
as3_schedule_file(filename, f);
}
+void as3_schedule_class(const char*package, const char*cls)
+{
+ schedule_class(package, cls, 1);
+}
+
+void as3_schedule_class_noerror(const char*package, const char*cls)
+{
+ if(config_recurse) {
+ schedule_class(package, cls, 0);
+ }
+}
+
+
static void*as3code = 0;
void* as3_getcode()
{
}
return as3code;
}
+void* as3_getassets(void*t)
+{
+ return swf_AssetsToTags((TAG*)t, registry_getassets());
+}
char* as3_getglobalclass()
{
return as3_globalclass;