3 Extension module for the rfxswf library.
4 Part of the swftools package.
6 Copyright (c) 2008 Matthias Kramm <kramm@quiss.org>
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
28 static int verbose = 0;
29 static void dbg(const char*format, ...)
36 va_start(arglist, format);
37 vsprintf(buf, format, arglist);
40 while(l && buf[l-1]=='\n') {
44 printf("(includefilehandler) ");
50 typedef struct _include_dir {
52 struct _include_dir*next;
57 char* current_filename=0;
58 char* current_filename_short=0;
59 include_dir_t* current_include_dirs=0;
61 #define MAX_INCLUDE_DEPTH 16
63 void*include_stack[MAX_INCLUDE_DEPTH];
64 int line_stack[MAX_INCLUDE_DEPTH];
65 int column_stack[MAX_INCLUDE_DEPTH];
66 char* filename_stack[MAX_INCLUDE_DEPTH];
67 char* shortfilename_stack[MAX_INCLUDE_DEPTH];
68 include_dir_t* includedir_stack[MAX_INCLUDE_DEPTH];
69 int include_stack_ptr = 0;
71 void add_include_dir(char*dir)
73 include_dir_t*d = malloc(sizeof(include_dir_t));
74 memset(d , 0, sizeof(include_dir_t));
76 d->next = current_include_dirs;
77 current_include_dirs = d;
79 char*get_path(char*file)
81 char*path = strdup(file);
82 char*r1 = strrchr(path, '/');
83 char*r2 = strrchr(path, '\\');
94 char* concat_paths(const char*base, const char*add)
96 int l1 = strlen(base);
100 while(l1 && base[l1-1] == '/')
102 while(pos < l2 && add[pos] == '/')
104 n = (char*)malloc(l1 + (l2-pos) + 2);
107 memcpy(&n[l1+1],&add[pos],l2-pos+1);
110 char is_absolute(char*filename)
112 if(!filename || !filename[0])
114 if(filename[0]=='/' || filename[0]=='\\')
116 if(filename[1]==':' && filename[1]=='/')
118 if(filename[1]==':' && filename[1]=='\\')
122 char*find_file(char*filename)
124 include_dir_t*i = current_include_dirs;
126 if(is_absolute(filename)) {
127 FILE*fi = fopen(filename, "rb");
130 return strdup(filename);
135 as3_warning("Include directory stack is empty, while looking for file %s", filename);
138 char*p = concat_paths(i->path, filename);
149 char*enter_file(char*filename, void*state)
151 filename = strdup(filename);
153 if(include_stack_ptr >= MAX_INCLUDE_DEPTH) {
154 as3_error("Includes nested too deeply");
157 char*fullfilename = find_file(filename);
159 as3_error("Couldn't find file %s", filename);
160 include_dir_t*i = current_include_dirs;
162 fprintf(stderr, "include dir: %s\n", i->path);
167 include_stack[include_stack_ptr] = state;
168 line_stack[include_stack_ptr] = current_line;
169 column_stack[include_stack_ptr] = current_column;
170 shortfilename_stack[include_stack_ptr] = current_filename_short;
171 filename_stack[include_stack_ptr] = current_filename;
172 includedir_stack[include_stack_ptr] = current_include_dirs;
173 add_include_dir(get_path(fullfilename));
176 dbg("entering file %s", fullfilename);
180 current_filename = fullfilename;
181 current_filename_short = filename;
187 dbg("leaving file %s", current_filename);
188 if(--include_stack_ptr<=0) {
191 free(current_filename);current_filename = filename_stack[include_stack_ptr];
192 free(current_filename_short);current_filename_short = shortfilename_stack[include_stack_ptr];
193 current_column = column_stack[include_stack_ptr];
194 current_line = line_stack[include_stack_ptr];
195 current_include_dirs = includedir_stack[include_stack_ptr];
196 return include_stack[include_stack_ptr];