1,5 → 1,56 |
#include "stdio.h" |
#include "string.h" |
#include <stdio.h> |
#include <string.h> |
|
|
extern struct{int argc; char** argv;} __ARGS; |
|
char* getfullpath(const char* relpath){ |
byte prev_is_slash=0; |
int len=0, depth=0, i; |
char* buff; |
buff = malloc(strlen(__ARGS.argv[0]) + strlen(relpath)); |
if(*relpath == '/') buff[0] = '\0'; |
else { |
len = strrchr(__ARGS.argv[0], '/') - __ARGS.argv[0] + 1; |
strncpy(buff, __ARGS.argv[0], len); |
prev_is_slash = 1; |
buff[len] = 0; |
for(i=0; buff[i]; i++) |
if(buff[i] == '/' && i < len-1) depth++; |
} |
for (; *relpath; relpath++){ |
switch (*relpath){ |
case '/': |
prev_is_slash = 1; |
buff[len++] = '/'; |
break; |
case '.': |
if(*(relpath+1) == '.' && *(relpath+2) == '/' && prev_is_slash){ |
if(!depth) return 0; |
buff[len-1] = 0; |
len = strrchr(buff, '/') + 1 - buff; |
buff[len] = 0; |
depth--; |
relpath += 2; |
} else { |
depth++; |
buff[len++] = '.'; |
} |
break; |
default: |
if(prev_is_slash){ |
depth++; |
prev_is_slash = 0; |
} |
buff[len++] = *relpath; |
break; |
} |
} |
buff[len]= '\0'; |
return buff; |
} |
|
|
FILE* fopen(const char* filename, const char *mode) |
{ |
FILE* res; |
37,20 → 88,22 |
res->buffersize=0; |
res->filesize=0; |
res->filepos=0; |
res->filename=0; |
res->mode=imode; |
res->filename=getfullpath(filename); |
//check if file exists |
res=_msys_read_file(filename, 0, 0, 0, &res->filesize); |
res=_msys_read_file(res->filename, 0, 0, 0, &res->filesize); |
if (res==5) |
{ |
if ((imode & 3) == FILE_OPEN_READ) |
{ |
free(res->filename); |
free(res); |
return 0; |
} |
res=_msys_create_file(filename); |
res=_msys_create_file(res->filename); |
if (res!=0) |
{ |
free(res->filename); |
free(res); |
return 0; |
} |
62,6 → 115,7 |
res->buffer=malloc(res->buffersize); |
if (res->buffer=0) |
{ |
free(res->filename); |
free(res); |
return 0; |
} |
75,7 → 129,7 |
free(res); |
return 0; |
} |
res=_msys_read_file(filename,0,res->filesize,res->buffer,0); |
res=_msys_read_file(res->filename,0,res->filesize,res->buffer,0); |
if (res!=0) |
{ |
free(res->buffer); |
84,6 → 138,5 |
if (imode & 3==FILE_OPEN_APPEND) |
res->filepos=res->filesize; |
} |
res->filename=strdup(filename); |
return res; |
} |