#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <proto/dddoor.h>
#include <libraries/dddoor.h>
#include <proto/exec.h>
#include <proto/dos.h>
#include <daydream.h>
#include <exec/memory.h>
#include <dos.h>

struct FakerDataFile {
	WORD df_Type;
	char df_FileName[32];
	ULONG df_FileSize;
	WORD  df_CreditFactor;
};

char * ExamineCfg( char *, char *);

void CloseMe(void);
void CpyToEOL(char *, char *);
void CpyToLAINA(char *, char *);
int ProcessLine(char *);
void __saveds __asm ActivateFile(register __a0 char *path, register __a1 char *filename, register __d0 ULONG fsize, register __d1 ULONG unused);
void ProcessFile(void);
void FmtDirName(char *dirikka);
char *Fnd(char *, char *);
int FindFile(char *);
char * GetFe(char *);
void GenComline(char *source, char *dest);
void SaveDir(char *dirikka);
void Delete(int);
void FreeFile(void);
void NukeFile(void);
void copytonuke(char *);
void CommentFile(void);
void ReturnCreds(void);

char username[40];

int userlen;

int quitme=0;
char *fptr;
char *feptr;
char * DirMem =0;
int DirSize;
char * CfgMem =0;
struct	Library	*DDBase;
struct	DIFace	*d;
struct	DDPointers *Pointers;
int ConfigSize=0;

struct StringMem {
	char descbuffer[10000];
	char comline1[200];
	char comline2[200];
	char comline3[200];
	char delline[500];
	char freeline[100];
	char credline[500];
	struct DD_UploadLog logbuffer[401];
	};

struct FileInfoBlock *FBlock = NULL;

char BUFFER[2048];
char BUFFER2[2048];
UWORD SysOpAccess;
char CurrFile[40];
char CurrPath[260];
ULONG CurrSize;

int updatedir;

struct StringMem *st;

int main(int argc, char *argv[])
{
	BPTR CfgHandle;
	char cmdline[512];
	int i;
	char *CfgPtr;
	int goon=1;
	struct FakerDataFile dfentry;

	DDBase=(struct Library *)OpenLibrary("dreamdoor.library",1);
	if(DDBase==NULL) {
		PutStr("Needs DreamDoor.library V1.00+ to run\n");
		exit(10);
	}
	d=InitDoor(argv[1]);		/* Establish link with DD */

	if(d==NULL) {
		PutStr("Hey Asswipe, this program requires DayDream BBS!\n");
		CloseLibrary(DDBase);
	        exit(10);
        }

	Pointers = AllocMem(sizeof(struct DDPointers),MEMF_PUBLIC|MEMF_CLEAR);
	InquirePointers(d,Pointers);
	strcpy(cmdline,Pointers->dp_DoorParams);

	atexit(CloseMe);

	if (argc==3) {
		sprintf(BUFFER,"DayDream:Users/%ld/Faker.DAT",Pointers->dp_CurrUser->user_account_id);
		if (CfgHandle=Open(BUFFER,MODE_OLDFILE)) { 
			SendString(d,"\n[0mYour up/download status has changed since the last call!\n\n[36mFilename               Size  Credits  U/L bytes change  D/L bytes change\n[35m========================================================================\n");
			while (Read(CfgHandle,&dfentry,sizeof(struct FakerDataFile)))
			{
				if (dfentry.df_Type==0) {
					sprintf(BUFFER,"[36m%-18s %8ld      %3ld          %8ld          %8ld\n",dfentry.df_FileName,dfentry.df_FileSize,dfentry.df_CreditFactor,dfentry.df_CreditFactor*dfentry.df_FileSize,0); 
				} else {
					sprintf(BUFFER,"[36m%-18s %8ld      %3ld          %8ld          %8ld\n",dfentry.df_FileName,dfentry.df_FileSize,0,0,-dfentry.df_FileSize); 
				}
				SendString(d,BUFFER);
			}
			Close (CfgHandle);
			SendString(d,"[35m========================================================================\n[34m                                                         DreamFaker V3.0[0m\n");
			Pause(d);
			SendString(d,"\n");
			sprintf(BUFFER,"DayDream:Users/%ld/Faker.DAT",Pointers->dp_CurrUser->user_account_id);
			DeleteFile(BUFFER);			
		}
		exit(0);
	}

	SendString(d,"\n                    [36mDreamFaker [0mV3.0 [36m- Code by Hydra[0m/[36mInsane\n\n");

	ChangeActivity(d,"Faking files");

	if (Pointers->dp_CurrConf->CONF_FILEAREAS==0) {
		SendString(d,"[37mNo files in this conference!\n\n");
		exit(0);
	}

	if (!(CfgHandle=Open("ENV:DREAMUTILS",MODE_OLDFILE))) {
		SendString(d,"[37mCan't open ENV:DREAMUTILS!\n\n");
		exit(0);
	}

	i=Read(CfgHandle,BUFFER,300);
	Close(CfgHandle);
	BUFFER[i]=0;
	strcat(BUFFER,"DreamFaker.CFG");

	FBlock=AllocDosObject(DOS_FIB,0);

	if (!(CfgHandle=Lock(BUFFER,ACCESS_READ))) {
		SendString(d,"[37mCan't open configfile!\n\n");
		exit(0);
	}
	
	Examine(CfgHandle,FBlock);
	ConfigSize = FBlock->fib_Size;

	UnLock(CfgHandle);

	if (!(CfgMem=AllocMem(ConfigSize+2,MEMF_CLEAR))) {
		SendString(d,"[37mCan't allocate memory for configfile!\n\n");
		exit(0);
	}

	CfgHandle=Open(BUFFER,MODE_OLDFILE);
	Read(CfgHandle,CfgMem,ConfigSize);
	Close(CfgHandle);

	if (!(CfgPtr=ExamineCfg(CfgMem,"ACCESS "))) {
		SendString(d,"[37mCan't find ACCESS-variable in configfile!\n\n");
	}
	
	CpyToEOL(CfgPtr,BUFFER2);
	SysOpAccess=atoi(BUFFER2);

	st=AllocMem(sizeof(struct StringMem),MEMF_CLEAR);

	strcpy(username,Pointers->dp_CurrUser->user_handle);
	strupr(username);
	username[14]=0;
	userlen=strlen(username);

	ProcessLine(cmdline);
	if (quitme) exit(0);

	while (goon) {
		SendString(d,"[36mEnter Filename(s) to Fake[34m: [0m");

		if (!(Prompt(d,cmdline,80,DPF_FILENAME,0))) goon=0; else {
			if (cmdline[0]) {
				SendString(d,"\n");
				ProcessLine(cmdline);
				if (quitme) goon=0;
			} else goon=0;
		}
	}
	exit(0);		
}

void FmtDirName(char *dirikka)
{
	char * p;

	p=FilePart(dirikka);

	while (*p)
	{
		if (*p==' ') *p='0';
		p++;
	}

}

int ProcessLine(char *line)
{
	char *token;

	token=strtok(line," ");
 	while(token != NULL) {

		CurrFile[0]=0;
		ScanFileDirs(d,Pointers->dp_CurrConf->CONF_NUMBER,token,ActivateFile,0);
		if (CurrFile[0]) ProcessFile(); else {
			SendString(d,"\n[35mFile not found!\n\n"); }
		if (quitme) return 0;
	  	token=strtok(0," ");
 	}
	return 0;
}

void ProcessFile(void)
{
	int currdir;
	int dirsleft;

	updatedir=0;
	st->comline1[0]=0;
	st->comline2[0]=0;
	st->comline3[0]=0;
	st->delline[0]=0;
	st->credline[0]=0;

	dirsleft=Pointers->dp_CurrConf->CONF_FILEAREAS;
	currdir=dirsleft;
	sprintf(BUFFER,"%sData/Directory.%03.ld",Pointers->dp_CurrConf->CONF_PATH,Pointers->dp_CurrConf->CONF_UPLOADAREA);
	FmtDirName(BUFFER);
	
	if (FindFile(BUFFER)) return;

	while(dirsleft)
	{
		if (currdir==Pointers->dp_CurrConf->CONF_UPLOADAREA) {
			currdir--; dirsleft--;
		} else {
			sprintf(BUFFER,"%sData/Directory.%03d",Pointers->dp_CurrConf->CONF_PATH,currdir);
			FmtDirName(BUFFER);
			if (FindFile(BUFFER)) return;
			currdir--; dirsleft--;
		}						
	}
}

int FindFile(char * dirikka)
{
	BPTR dirhandle;
	char fndbuf[40];
	int  Hot;
	int nukeloop=1;

	if (!(dirhandle=Lock(dirikka,ACCESS_READ))) return 0;

	Examine(dirhandle,FBlock);
	UnLock(dirhandle);

	DirSize=FBlock->fib_Size;

	if (!(DirMem=AllocMem(DirSize+2,MEMF_CLEAR))) {
		SendString (d,"\n[35mOut of memory!\n\n");
		return 0;
	}

	dirhandle=Open(dirikka,MODE_OLDFILE);
	Read(dirhandle,&DirMem[1],DirSize);
	Close(dirhandle);
	DirMem[0]=10;

	strupr(CurrFile);

	sprintf(fndbuf,"\n%s ",CurrFile);
	if (fptr=Fnd(fndbuf,DirMem)) {
		fptr++;
		feptr=GetFe(fptr);

		strcpy(st->descbuffer,fptr);

		SendString(d,"[0m\n");
		SendString(d,fptr);
		SendString(d,"\n\n");
		FreeMem(DirMem,DirSize+2);

		if (SysOpAccess > Pointers->dp_CurrUser->user_securitylevel) {
			CommentFile();
		} else {
			nukeloop=1;
			while (nukeloop) {
				SendString(d,"[0mWhat shall I do for this file [35m[[36mn/d/r/c/f/W/s/q/?[35m] [0m?: ");
uglycoding:
				Hot=GetKey(d,0);
				switch (Hot)
				{
					case 13:
					case 10:
					case 'w':
					case 'W':
						SendString(d,"Write it!\n\n");
						nukeloop=0;
						break;
					case 'N':
					case 'n':
						SendString(d,"Nuke it!\n\n");
						NukeFile();
						break;
					case 'R':
					case 'r':
						SendString(d,"Return credits!\n\n");
						ReturnCreds();
						break;
					case 's':
					case 'S':
						SendString(d,"Skip it!\n\n");
						updatedir=0;
						nukeloop=0;
						break;
					case 0:
					case 'q':
					case 'Q':
						SendString(d,"Quit!\n\n");
						nukeloop=0;
						quitme=1;
						break;
					case '?':
						SendString(d,"Help!\n\n[36mN [35m- [0m Nuke file. Use this to reward/punish user.\n[36md [35m- [0m Delete file (Uppercase D to rm)\n[36mR [35m- [0m Return credits to downloaders.\n[36mC [35m- [0m Comment file.\n[36mF [35m- [0m Make file free download.\n[36mW [35m- [0m Write file. (Saves modifications)\n[36mS [35m- [0m Skip current file. (Abandon changes)\n[36mQ [35m- [0m Quit.\n\n");
						break;
					case 'c':
					case 'C':
						SendString(d,"Comment!\n\n");
						CommentFile();
						break;
					case 'D':
						SendString(d,"Delete!\n\n");
						Delete(1);
						break;
					case 'd':
						SendString(d,"Delete!\n\n");
						Delete(0);
						break;
					case 'f':
					case 'F':
						SendString(d,"Free it!\n\n");
						FreeFile();
						break;
					default:
						goto uglycoding;
				}
			}
		}
		SaveDir(dirikka);
		return 1;
	}
	else {
		FreeMem(DirMem,DirSize+2);
		return 0;
	}
}

void ReturnCreds(void)
{
	BPTR NukeHandle;
	BPTR LogHandle;
	char nukebuf[256];
	int  loglen;
	struct DD_UploadLog *dllogentry;
	struct DayDream_User NukeUser;
	struct FakerDataFile dfentry;

	SendString(d,"[0mLooking for downloaders...");

	if (!(LogHandle=Open("DayDream:LogFiles/DownloadLog.DAT",MODE_OLDFILE))) {
		SendString(d,"[31m Error! Could not access log file!!\n\n");
		return;
	}

	while (loglen=Read(LogHandle,st->logbuffer,20000))
	{
		dllogentry=st->logbuffer+loglen;		
		dllogentry->UL_SLOT=65535;

		dllogentry=st->logbuffer;

		while (dllogentry->UL_SLOT!=65535)
		{
			if (!(stricmp(dllogentry->UL_FILENAME,CurrFile)))
			{
				if (!(NukeHandle=Open("DayDream:Data/UserBase.DAT",MODE_READWRITE))) {
					SendString(d,"[31mCouldn't access userbase!!\n\n");
					return;
				}
				Seek(NukeHandle,300*dllogentry->UL_SLOT,OFFSET_BEGINNING);
				Read(NukeHandle,&NukeUser,300);
				Close(NukeHandle);

				sprintf(nukebuf,"\n\n[36mHandle   [35m:[0m %-23s     [36mOrg.  [35m:[0m %s\n",NukeUser.user_handle,NukeUser.user_organization);
				SendString(d,nukebuf);
				sprintf(nukebuf,"\n[36mUploads  [35m:[0m %8ld kB (%5ld files)   [36mFakes [35m:[0m %7ld kB (%5ld files)\n",NukeUser.user_ulbytes/1024,NukeUser.user_ulfiles,NukeUser.user_fakedbytes/1024,NukeUser.user_fakedfiles);
				SendString(d,nukebuf);
				sprintf(nukebuf,"[36mDownloads[35m:[0m %8ld kB (%5ld files)   [36mRatios[35m:[0m 1:%ld (byte), 1:%ld (file)\n\n",NukeUser.user_dlbytes/1024,NukeUser.user_dlfiles,NukeUser.user_byteratio,NukeUser.user_fileratio);
				SendString(d,nukebuf);

				SendString(d,"[36mReturn credits? [35m(Yes/no) [0m: ");

				if (YesNo(d,1)) {

					sprintf(nukebuf,"\n[36mDownloaded bytes           [35m:[0m %12ld   [36mDownloaded files           [35m:[0m %5ld \n",NukeUser.user_dlbytes,NukeUser.user_dlfiles);
					SendString(d,nukebuf);
					sprintf(nukebuf,"[36m   Changed bytes           [35m:[0m %12ld   [36m   Changed files           [35m:[0m %5ld \n",dllogentry->UL_FILESIZE,1);
					SendString(d,nukebuf);
					SendString(d,"                             [35m------------                                -----\n");
					sprintf(nukebuf,"[36m     Bytes after           [35m:[0m %12ld   [36m     Files after           [35m:[0m %5ld \n\n",NukeUser.user_dlbytes-dllogentry->UL_FILESIZE,NukeUser.user_dlfiles-1);
					SendString(d,nukebuf);

					NukeUser.user_dlbytes=NukeUser.user_dlbytes-dllogentry->UL_FILESIZE;

					NukeUser.user_dlfiles--;

					if (!(NukeHandle=Open("DayDream:Data/UserBase.DAT",MODE_READWRITE))) {
						SendString(d,"[31mCouldn't access userbase!!\n\n");
						return;
					}
					Seek(NukeHandle,300*dllogentry->UL_SLOT,OFFSET_BEGINNING);
					Write(NukeHandle,&NukeUser,300);
					Close(NukeHandle);

					sprintf(nukebuf,"DayDream:Users/%ld/Faker.DAT",dllogentry->UL_SLOT);
					if (NukeHandle=Open(nukebuf,MODE_READWRITE)) { 

						dfentry.df_Type=1;
						strcpy(dfentry.df_FileName,CurrFile);
						dfentry.df_FileSize=dllogentry->UL_FILESIZE;
						Seek(NukeHandle,0,OFFSET_END);
						Write(NukeHandle,&dfentry,sizeof(struct FakerDataFile));
						Close (NukeHandle);
					}

				}
			}
			dllogentry++;
		}		
	}
	Close(LogHandle);
	SendString(d,"\n\n");
}


void NukeFile(void)
{
	BPTR NukeHandle;
	char nukebuf[256];
	int  loglen;
	struct DD_UploadLog *ullogentry;
	struct DayDream_User NukeUser;
	int creditfaktor;
	ULONG newbytes;
	struct FakerDataFile dfentry;

	char *cptr;

	SendString(d,"[0mLooking for uploader...");

	if (!(NukeHandle=Open("DayDream:LogFiles/UploadLog.DAT",MODE_OLDFILE))) {
		SendString(d,"[31m Error! Could not access log file!!\n\n");
		return;
	}

	while (loglen=Read(NukeHandle,st->logbuffer,20000))
	{
		ullogentry=st->logbuffer+loglen;		
		ullogentry->UL_SLOT=65535;

		ullogentry=st->logbuffer;

		while (ullogentry->UL_SLOT!=65535)
		{
			if (!(stricmp(ullogentry->UL_FILENAME,CurrFile)))
			{
				Close(NukeHandle);
				if (!(NukeHandle=Open("DayDream:Data/UserBase.DAT",MODE_READWRITE))) {
					SendString(d,"[31mCouldn't access userbase!!\n\n");
					return;
				}
				Seek(NukeHandle,300*ullogentry->UL_SLOT,OFFSET_BEGINNING);
				Read(NukeHandle,&NukeUser,300);
				Close(NukeHandle);

				sprintf(nukebuf,"\n\n[36mHandle   [35m:[0m %-23s     [36mOrg.  [35m:[0m %s\n",NukeUser.user_handle,NukeUser.user_organization);
				SendString(d,nukebuf);
				sprintf(nukebuf,"\n[36mUploads  [35m:[0m %8ld kB (%5ld files)   [36mFakes [35m:[0m %7ld kB (%5ld files)\n",NukeUser.user_ulbytes/1024,NukeUser.user_ulfiles,NukeUser.user_fakedbytes/1024,NukeUser.user_fakedfiles);
				SendString(d,nukebuf);
				sprintf(nukebuf,"[36mDownloads[35m:[0m %8ld kB (%5ld files)   [36mRatios[35m:[0m 1:%ld (byte), 1:%ld (file)\n\n",NukeUser.user_dlbytes/1024,NukeUser.user_dlfiles,NukeUser.user_byteratio,NukeUser.user_fileratio);
				SendString(d,nukebuf);

				SendString(d,"[36mGive how many times extra credits [35m(Negative=deduct) [0m: ");
				if (!(Prompt(d,nukebuf,3,0,0))) return;
				creditfaktor=atoi(nukebuf);

				if (!creditfaktor) { SendString(d,"\n"); return; }

				sprintf(nukebuf,"\n[36m  Uploaded bytes           [35m:[0m %12ld   [36m  Uploaded files           [35m:[0m %5ld \n",NukeUser.user_ulbytes,NukeUser.user_ulfiles);
				SendString(d,nukebuf);
				sprintf(nukebuf,"[36m   Changed bytes           [35m:[0m %12ld   [36m   Changed files           [35m:[0m %5ld \n",ullogentry->UL_FILESIZE*creditfaktor,creditfaktor);
				SendString(d,nukebuf);
				SendString(d,"                             [35m------------                                -----\n");
				sprintf(nukebuf,"[36m     Bytes after           [35m:[0m %12ld   [36m     Files after           [35m:[0m %5ld \n\n",NukeUser.user_ulbytes+ullogentry->UL_FILESIZE*creditfaktor,NukeUser.user_ulfiles+creditfaktor);
				SendString(d,nukebuf);

				if (cptr=ExamineCfg(CfgMem,"CREDSTRING '")) {
					CpyToLAINA(cptr,st->credline);
				}

				if (creditfaktor > 0 ) sprintf(nukebuf,"%ld * EXTRA CREDITS!!!",creditfaktor);
				if (creditfaktor > 9 ) sprintf(nukebuf,"%ld * EXTRA CREDITS!!",creditfaktor);

				if (creditfaktor < 0 ) sprintf(nukebuf,"%ld * CREDITS TAKEN!!!",creditfaktor);
				if (creditfaktor < -9 ) sprintf(nukebuf,"%ld * CREDITS TAKEN!!",creditfaktor);

				if (creditfaktor > 0) copytonuke(nukebuf); else copytonuke(&nukebuf[1]);
								
				if (creditfaktor < 0) {
					NukeUser.user_fakedbytes=NukeUser.user_fakedbytes+ullogentry->UL_FILESIZE;
					newbytes= - (creditfaktor * ullogentry -> UL_FILESIZE);
					if (newbytes > NukeUser.user_ulbytes) newbytes=0; else newbytes= NukeUser.user_ulbytes+creditfaktor * ullogentry -> UL_FILESIZE;
				} else newbytes= NukeUser.user_ulbytes+creditfaktor * ullogentry -> UL_FILESIZE;

				NukeUser.user_ulbytes=newbytes;

				if (creditfaktor < 0) {
					NukeUser.user_fakedfiles++;
					newbytes= - (creditfaktor);
					if (newbytes > NukeUser.user_ulfiles) newbytes=0; else newbytes= NukeUser.user_ulfiles+creditfaktor;
				} else newbytes= NukeUser.user_ulfiles+creditfaktor;

				NukeUser.user_ulfiles=newbytes;

				if (!(NukeHandle=Open("DayDream:Data/UserBase.DAT",MODE_READWRITE))) {
					SendString(d,"[31mCouldn't access userbase!!\n\n");
					return;
				}
				Seek(NukeHandle,300*ullogentry->UL_SLOT,OFFSET_BEGINNING);
				Write(NukeHandle,&NukeUser,300);
				Close(NukeHandle);
				
				sprintf(nukebuf,"DayDream:Users/%ld/Faker.DAT",ullogentry->UL_SLOT);
				if (NukeHandle=Open(nukebuf,MODE_READWRITE)) { 
					dfentry.df_Type=0;
					strcpy(dfentry.df_FileName,CurrFile);
					dfentry.df_FileSize=ullogentry->UL_FILESIZE;
					dfentry.df_CreditFactor=creditfaktor;
					Seek(NukeHandle,0,OFFSET_END);
					Write(NukeHandle,&dfentry,sizeof(struct FakerDataFile));
					Close (NukeHandle);
				}
				updatedir=1;
				return;
			}
			ullogentry++;
		}		
	}
	Close(NukeHandle);
}

void copytonuke(char *src)
{
	char *dest;

	dest=&st->credline[12];

	while (*src) *dest++=*src++;
}

void FreeFile(void)
{
	BPTR FreeHandle;
	char freebuf[256];

	sprintf(freebuf,"%sData/FreeDownloads.DAT",Pointers->dp_CurrConf->CONF_PATH,CurrFile);

	if (FreeHandle=Open(freebuf,MODE_READWRITE)) {
		Seek(FreeHandle,0,OFFSET_END);
		sprintf(freebuf,"%s\n",CurrFile);
		FPuts(FreeHandle,freebuf);
		Close(FreeHandle);
	}

	if (Pointers->dp_CurrConf->CONF_ATTRIBUTES & (1<<3)) {
	st->descbuffer[20]='F'; } else { st->descbuffer[14]='F'; }

	strcpy(st->freeline,Pointers->dp_DayDream->CFG_FREEDLLINE);
	updatedir=1;
}

void Delete(int tapa)
{
	BPTR DelHandle;
	char delbuf[256];
	char *cptr;

	sprintf(delbuf,"%s%s",CurrPath,CurrFile);

	if (DelHandle=Open(delbuf,MODE_NEWFILE)) {
		Write(DelHandle,"NUKED!\n",7);
		Close(DelHandle);

		if (tapa) DeleteFile(delbuf);

		if (Pointers->dp_CurrConf->CONF_ATTRIBUTES & (1<<3)) {
		st->descbuffer[20]='D'; } else { st->descbuffer[14]='D'; }

		if (cptr=ExamineCfg(CfgMem,"DELLINE '")) {
			CpyToLAINA(cptr,st->delline);
		}			
		updatedir=1;
	}
}

void SaveDir(char *dirikka)
{
	BPTR dirhandle;
	char fndbuf[40];

	if (!updatedir) return;

	if (!(dirhandle=Lock(dirikka,ACCESS_READ))) return;

	Examine(dirhandle,FBlock);
	UnLock(dirhandle);

	DirSize=FBlock->fib_Size;

	if (!(DirMem=AllocMem(DirSize+2,MEMF_CLEAR))) {
		SendString (d,"\n[35mOut of memory!\n\n");
		return;
	}

	if (dirhandle=Open(dirikka,MODE_READWRITE)) {

		Read(dirhandle,&DirMem[1],DirSize);
		DirMem[0]=10;

		sprintf(fndbuf,"\n%s ",CurrFile);
		if (fptr=Fnd(fndbuf,DirMem)) {
			fptr++;
			feptr=GetFe(fptr);

			Seek(dirhandle,(fptr-1)-DirMem,OFFSET_BEGINNING);
			Write(dirhandle,st->descbuffer,strlen(st->descbuffer));
			Write(dirhandle,"\n",1);
			if (st->comline1[0]) {
				sprintf(BUFFER2,"                                   %s",st->comline1);
				Write(dirhandle,BUFFER2,strlen(BUFFER2));
			}
			if (st->comline2[0]) {
				sprintf(BUFFER2,"                                   %s",st->comline2);
				Write(dirhandle,BUFFER2,strlen(BUFFER2));
			}
			if (st->comline3[0]) {
				sprintf(BUFFER2,"                                   %s",st->comline3);
				Write(dirhandle,BUFFER2,strlen(BUFFER2));
			}
			if (st->credline[0]) {
				sprintf(BUFFER2,"                                   %s\n",st->credline);
				Write(dirhandle,BUFFER2,strlen(BUFFER2));
			}
			if (st->delline[0]) {
				sprintf(BUFFER2,"                                   %s\n",st->delline);
				Write(dirhandle,BUFFER2,strlen(BUFFER2));
			}
			if (st->freeline[0]) {
				sprintf(BUFFER2,"                                   %s\n",st->freeline);
				Write(dirhandle,BUFFER2,strlen(BUFFER2));
			}
			Write(dirhandle,feptr+1,strlen(feptr+1));
		}
	Close(dirhandle);
	}
	FreeMem(DirMem,DirSize+2);
}

void CommentFile(void)
{
	char combuff[200];
	char *cptr;
	int i=0;

	SendString(d,"[36mPlease enter your comment now. You have three lines.\nMacros [35m: [0mA[35m)[36mncient [0mB[35m)[36mroken [0mC[35m)[36mrap [0mF[35m)[36make [0mL[35m)[36mame [0mO[35m)[36mld [0mR[35m)[36menamed\n[0m");

	cptr=combuff;

	for (i=0;i!=34;i++) *cptr++ =' ';
	*cptr++ ='[';
	for (i=0;i!=35-userlen;i++) *cptr++ ='-';
	*cptr++ =']'; *cptr++=10; *cptr++=0;

	SendString(d,combuff);

	SendString(d,"                                  [0m:[35m");
	Prompt(d,combuff,35-userlen,0,0);
	if (combuff[0]==0) return;

	if (strlen(combuff)==1)
	{
		switch (*combuff)
		{
		case 'a':
		case 'A':
			GenComline("Ancient!",st->comline1);
			return;
		break;
		case 'b':
		case 'B':
			GenComline("Broken!",st->comline1);
			return;
		break;
		case 'c':
		case 'C':
			GenComline("Crap!",st->comline1);
			return;
		break;
		case 'f':
		case 'F':
			GenComline("Fake!",st->comline1);
			return;
		break;
		case 'o':
		case 'O':
			GenComline("Old!",st->comline1);
			return;
		break;
		case 'r':
		case 'R':
			GenComline("Rename!",st->comline1);
			return;
		break;
		}
	}
	GenComline(combuff,st->comline1);
	SendString(d,"                                  [0m:[35m");
	Prompt(d,combuff,35-userlen,0,0);
	if (combuff[0]==0) return;
	GenComline(combuff,st->comline2);
	SendString(d,"                                  [0m:[35m");
	Prompt(d,combuff,35-userlen,0,0);
	if (combuff[0]==0) return;
	GenComline(combuff,st->comline3);

}

void GenComline(char *source, char *dest)
{
	int i=0;
	int j=0;

	if (i=strlen(source))
	{
		updatedir=1;

		strcpy(dest,"``                                        ''\n");
		j=23-(3+(userlen+i)/2);
		i=0;
		while (username[i])
		{
			dest[j]=username[i]; j++; i++;
		}
		i=0;
		dest[j]=' '; j++;
		dest[j]=':'; j++;
		dest[j]=' '; j++;

		while (source[i])
		{
			dest[j]=source[i]; j++; i++;
		}
		if (ExamineCfg(CfgMem,"UPPERCASE")) strupr(dest);
	}
	else dest[0]=0;
}

char * GetFe(char *entry)
{
	for (;;)
	{
		while (*entry!=10) entry++;
		entry++;
		switch (*entry)
		{
			case ' ':
				break;
			default:
				entry--;
				*entry=0;
				return entry;
				break;
		}
	}
}

void __saveds __asm ActivateFile(register __a0 char *path, register __a1 char *filename, register __d0 ULONG fsize, register __d1 ULONG unused)
{
	strcpy(CurrPath,path);
	strcpy(CurrFile,filename);
	CurrSize=fsize;
}

void CpyToEOL(char *src, char *dest)
{
int i=0;

	while (src[i]!=10) {
		dest[i]=src[i];
		i++;
	}
	dest[i]=0;
}

void CpyToLAINA(char *src, char *dest)
{
int i=0;

	while (src[i]!=39) {
		dest[i]=src[i];
		i++;
	}
	dest[i]=0;
}

void CloseMe(void)
{
	if (st) FreeMem(st,sizeof(struct StringMem));
	if (CfgMem) FreeMem(CfgMem,ConfigSize+2);
	if (FBlock) FreeDosObject(DOS_FIB,FBlock);
        FreeMem(Pointers,sizeof(struct DDPointers));
	CloseDoor(d);
	CloseLibrary(DDBase);
}

