}
-typedef struct _include_dir {
- char*path;
- struct _include_dir*next;
-} include_dir_t;
-
int current_line=1;
int current_column=0;
char* current_filename=0;
return strdup(".");
}
}
+char* normalize_path(const char*path)
+{
+ char*n = 0, *d = 0;
+ if(path[0] != '/') {
+ char buf[512];
+ char*c = getcwd(buf,512);
+ int l = strlen(buf);
+ d = n = malloc(l+strlen(path)+10);
+ strcpy(n, buf);d += l;
+ if(!l || n[l-1]!='/') {
+ *d='/';d++;
+ }
+ } else {
+ d = n = strdup(path);
+ }
+ const char*s=path;
+ char init = 1;
+
+ while(*s) {
+ if(init && s[0] == '.' && (s[1]=='/' || s[1]=='\0')) {
+ if(!s[1]) break;
+ s+=2;
+ init=1;
+ continue;
+ }
+ if(init && s[0] == '.' && s[1] == '.' && (s[2] == '/' || s[2]=='\0')) {
+ // step one down
+ char*last = 0;
+ if(d<=n)
+ return 0;
+ *--d = 0;
+ if(!(last=strrchr(n, '/'))) {
+ return 0;
+ }
+ d = last+1;
+ if(!s[2]) break;
+ s+=3;
+ init=1;
+ continue;
+ }
+
+ *d = *s;
+ if(*s=='/') init=1;
+ else init=0;
+ d++;s++;
+ }
+ if(d!=n && d[-1]=='/')
+ d--;
+ *d = 0;
+ return n;
+}
+static void testnormalize()
+{
+#define TEST(x) {printf("%s -> %s\n", (x), normalize_path(x));}
+ TEST(".");
+ TEST("../as3");
+ TEST("../as3/");
+ TEST("../as3/parser.y");
+ TEST("../as3/ok/../ok/scope.as");
+ TEST("ok/scope.as");
+ TEST("ok/./scope.as");
+ TEST("./ok/scope.as");
+ TEST("./");
+ TEST("/tmp/");
+ TEST("/./tmp/");
+ TEST("../");
+ TEST("/");
+ TEST("/tmp");
+ TEST("/tmp/../usr/");
+}
+
+
char* concat_paths(const char*base, const char*add)
{
int l1 = strlen(base);
memcpy(&n[l1+1],&add[pos],l2-pos+1);
return n;
}
-char is_absolute(char*filename)
+char is_absolute(const char*filename)
{
if(!filename || !filename[0])
return 0;
return 0;
}
-char*find_file(char*filename)
+char*find_file(const char*filename)
{
include_dir_t*i = current_include_dirs;
FILE*fi = 0;
if(fi) {
fclose(fi);
return p;
+ } else {
+ free(p);
}
i = i->next;
}
shortfilename_stack[include_stack_ptr] = current_filename_short;
filename_stack[include_stack_ptr] = current_filename;
includedir_stack[include_stack_ptr] = current_include_dirs;
- char*dir = get_path(filename);
+
+ /*char*dir = get_path(filename);
add_include_dir(dir);
- free(dir);
+ free(dir);*/
+
include_stack_ptr++;
dbg("entering file %s", filename);