#include <direct.h>
#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ext2/winb.h>
#include <ext2/te.h>
#include <ext2/fntb.h>
#include <ext2/gui.h>
#include <ext2/file_dlg.h>
#include "sftlib.h"


PROTO int AMI_cd( char *path ) PROTOEND
{
	AMI_PATH_t  ps;
	char p[_MAX_PATH];
	int ret, i, l;

	strcpy(p,path);
	l=strlen(p);
	for(i=0;i<l;i++) if( p[i]=='/' ) p[i]='\\';
	_splitpath( p, &(ps.drive[0]), &(ps.dir[0]), &(ps.fname[0]), &(ps.ext[0]));
	if( (ps.drive)[0]!='\0' )	FM_SelectDisk(p[0]);

	strcpy(p, ps.dir);
	strcat(p, ps.fname );
	strcat(p, ps.ext );
	l=strlen(p);
	if( p[l-1]=='\\' )  strcat( p, "." ) ;
	if (*p!=0 ) ret=FM_SetCurrentDir( p ); else ret=0;
	return ret;
}

PROTO int AMI_pathsplit( AMI_PATH_t *ps, char *path) PROTOEND
{
	AMI_PATH_t cps;
	unsigned int ret, atr;
	char cpath[_MAX_PATH];
	char p[_MAX_PATH];
	int  i, l;

	strcpy(p, path);
	l=strlen(p);
	if (l==0) {
		ps->drive[0]='\0';
		ps->dir[0]='\0';
		ps->fname[0]='\0';
		ps->ext[0]='\0';
		ps->attr=0xffffffff;
		return -1;
		}
	for(i=0;i<l;i++) if( p[i]=='/' ) p[i]='\\';
	if( p[l-1]=='\\' )  strcat( p, "." ) ;
	_splitpath( p, ps->drive, ps->dir, ps->fname, ps->ext);
	_getcwd( cpath, _MAX_PATH );
	_splitpath( cpath, &cps.drive[0], &cps.dir[0], &cps.fname[0], &cps.ext[0]);
	if( (ps->drive)[0]=='\0' ) strcpy(ps->drive,cps.drive);
	if( (ps->dir)[0]=='\0' ) strcpy(ps->dir,cps.dir);
	ret=_dos_getfileattr( p, &atr );
	if(ret != 0 ) ps->attr=0xffffffff; else	ps->attr=atr;
	return 0;
}

PROTO int AMI_FILED_getpath( char path[], char *title,
PROTO 		char *execstr, char *cnclstr, int base ) PROTOEND
{

	int ret;
	unsigned int InfSw;
	static char *ExtStr[]={"*.*",NULL};
	unsigned int MSlctCnt;
	int Atr;
	int pptr;
	AMI_PATH_t ap;
	char cddir[_MAX_PATH];
	char filename[_MAX_PATH];

	MG_PushPtr( 81, &pptr);
	MG_mosDisp(2);

	FDG_SaveCurDir();
	AMI_pathsplit( &ap, path) ;
	strcpy( cddir, ap.drive );
	strcat( cddir, ap.dir );
	AMI_cd( cddir );
	strcpy( filename, ap.fname );
	strcat( filename, ap.ext );
	if( strcmp(filename, ".")==0 ) filename[0]='\0';
	ret=FDG_InitFileDlg();
	if ( ret< 0 ) {	goto RETURN ;}
	MG_mosDisp(3);
	FDG_SetTitle( title, execstr, cnclstr );
	MG_PopPtr( pptr);

	MG_PushPtr( 80, &pptr);
	InfSw = FDG_TEXT;
	FDG_SetFileText( filename );

	ret= FDG_DspFileDlg( base, InfSw, NULL, ExtStr, &MSlctCnt );
	if( ret==1 )
	{
		FDG_GetPathName( path, &Atr, 0);
	}
	FDG_FreeFileDlg();

RETURN:
	MG_PopPtr( pptr);
	FDG_RecovCurDir();
	return ret;
}


PROTO void *AMI_malloc( size_t sz ) PROTOEND
{
	char *ret;
	ret=TL_malloc( sz+8 );
	if( ret==NULL ) return NULL;
		else return ret+4;
}

PROTO void AMI_free( void *ptr ) PROTOEND
{
	char *workp;
	workp=(char *)ptr;
	if( workp==NULL ) return ;
		else TL_free( workp-4 );
	return ;
}

PROTO int AMI_FILED_fread( char *fname, char *ptr) PROTOEND
{
	FILE *fp;
	int fsz, ret;
	char *p;
	size_t sret;

	fp=fopen( fname, "rb" );
	if( fp==NULL ) { ret=-1; goto RETURN1 ;}
	fseek(fp, 0, SEEK_END );
	fsz=ftell(fp);
	if( fsz==-1 ) { ret=-2; goto RETURN2;}
	fseek(fp, 0, SEEK_SET );
	p=AMI_malloc( fsz );
	if( p==NULL ) { ret=-3; goto RETURN2;}
	sret=fread( p, fsz, 1, fp );
	if( sret==0 ) { AMI_free(p); ret=-4; goto RETURN2; }
	ptr=p;
	ret=0;
RETURN2:
	fclose( fp );
RETURN1:
	return ret;
}
