#include <stdio.h>
#include <string.h>
#include <stdlib.h>

extern char __argv;
extern char __path;

const char* getfullpath(const char *path){

        int i,j,relpath_pos,localpath_size;
        int filename_size;
        char local_path;
        char *programpath;
        char *newpath;

        i=0;
        local_path=1; //enable local path
        while((*(path+i)!='\0') || (*(path+i)!=0))
        {
                if (*(path+i)=='.')
                {
                        if (*(path+i+1)=='/')
                        {       //detected relative path
                                relpath_pos=i+2;
                                local_path=0;
                                break;
                        }
                }
                if (*(path+i)=='/')
                {       //disabple local path
                        local_path=0;
                        return(path);
                }
                i++;
        }
        filename_size=i;

        programpath=&__path;

        if (local_path==1)
        {
                i=0x400;
                //find local path of program
                while(*(programpath+i)!='/')
                {
                        i--;
                }
                localpath_size=i;
                newpath=malloc(0x400);
                //copy local path to the new path
                for(i=0;i<=localpath_size;i++)
                {
                        *(newpath+i)=*(programpath+i);
                }
                //copy filename to the new path
                for(i=0;i<filename_size;i++)
                {
                        *(newpath+localpath_size+1+i)=*(path+i);
                }
                return(newpath);
        }

       //if we here than path is a relative
       i=0x400;
       //find local path of program
       while(*(programpath+i)!='/')
       {
                i--;
       }
       localpath_size=i;
       i=0;
       //find file name size
       while((*(path+relpath_pos+i)!='\0') || (*(path+relpath_pos+i)!=0))
       {
                i++;
       }
       filename_size=i;
       newpath=malloc(0x400);
        //copy local path to the new path
       for(i=0;i<=localpath_size;i++)
       {
                *(newpath+i)=*(programpath+i);
       }
       //copy filename to the new path
       for(i=0;i<filename_size;i++)
       {
                *(newpath+localpath_size+1+i)=*(path+relpath_pos+i);
       }
       return(newpath);
}


FILE* fopen(const char* filename, const char *mode)
{
        FILE* res;
        int imode;
        imode=0;
        if (*mode=='r')
        {
                imode=FILE_OPEN_READ;
                mode++;
        }else if (*mode=='w')
        {
                imode=FILE_OPEN_WRITE;
                mode++;
        }else if (*mode=='a')
        {
                imode=FILE_OPEN_APPEND;
                mode++;
        }else
                return 0;
        if (*mode=='t')
        {
                imode|=FILE_OPEN_TEXT;
                mode++;
        }else if (*mode=='b')
                mode++;
        if (*mode=='+')
        {
                imode|=FILE_OPEN_PLUS;
                mode++;
        }
        if (*mode!=0)
                return 0;
        res=malloc(sizeof(FILE));
        res->buffer=malloc(256);
        res->buffersize=256;
        res->filesize=0;
        res->filepos=0;
        res->mode=imode;
        res->filename=getfullpath(filename);

	if ((imode==FILE_OPEN_READ) || (imode==FILE_OPEN_APPEND))
	{
		res->filesize=_ksys_get_filesize(res->filename);
	}
        return res;
}