/*
	e screen editor

	(C) G. Nigel Gilbert, MICROLOGY, 1981

	August-December 1981

	FILE: e1

	FUNCTIONS:  printdirectory, envir, files, putonoff, getnumb, getlow

	PURPOSE:  environment; change files.

*/

#include "e.h"

#define EXTENT 12
#define D0 16
#define DN 31

printdirectory(drive)
int drive;
{
	int y, *dsm, *drm, cols, loc, i;
	unsigned blsr, used;
	char c, pos, entriesonline, *wildname, *bsh;
	sint dmabuf[128];

	putclr();
	if (errmess != NULL) {
		gotoxy(EMPOS,0);
		puts(errmess);
		}
	wildname="\0??????????????";
	wildname[0]=drive+1;
	bdos(SETDMA,dmabuf);
	gotoxy(0,6); 
	puts("Directory of "); 
	putch(drive+'A'); 
	putch(':');
	if (curdsk != drive && seldisk(drive) != FAIL) {
		puts("  |(default drive is ");
		putch(curdsk+'A');
		puts(":|)");
		}
	used=0;
	bsh=bdos(DSKPARAMS)+2; 
	dsm=bsh+3; 
	drm=dsm+1;
	blsr= (1 << *bsh)/8; /*block size in kbytes*/
	entriesonline=0; 
	begdim(); 
	deleteline(2,(y=8));
	pos=bdos(SEARCH1,wildname);
	while (pos != 0xff) {
		loc= pos << 5;
		for (i=D0; i <= DN; i++)
			if (dmabuf[loc+i]) used+=blsr;
		if (dmabuf[loc+EXTENT] <= 1) {
			for (i=1, cols=0; i < 12; i++) {
				c= dmabuf[loc+i] & 0x7f;
				if (i == 9 && c != ' ') {
					cols++;
					putch('.');
					}
				if (c != ' ') {
					cols++;
					putch( (i >= 9 ? tolower(c) : c));
					}
				}
			while (cols++ < 12) putch(' ');
			if (++entriesonline == 5) {
				deleteline(2,++y);
				if (y == SHEIGHT) { 
					puts("etc"); 
					goto incomplete; 
					}
				entriesonline=0;
				}
			else puts(" :  ");
			}
		pos=bdos(SEARCHN,wildname);
		}
	gotoxy(50,SHEIGHT); 
	puts("Free space = "); 
	uspr(((*dsm+1)*blsr-(*drm+1)/32)-used); 
	putchar('k');
incomplete:
	if (curdsk != drive) seldisk(curdsk);
	enddim(); 
	gotoxy(0,0);
}

envir()
{
	char c;
	struct addr anaddr;

	puttext();
	do {
		putclr();
		putstatusline(cline);
		gotoxy(0,4);
		puts("Edit context:\n\n");
		puts("  |enter |F| for file context\n\n");
		puts("A|uto indent:                    "); 
		putonoff(autoin);
		puts("|make |B|ackup of original file:   "); 
		putonoff(backup);
		puts("T|ab stops every                  "); 
		uspr(tabwidth);
		puts("\nS|trip trailing blanks,tabs      ");
		putonoff(!trail);
		puts("|display cursor |L|ine and column  ");
		putonoff(displaypos);
		puts("H|orizontal scroll whole page    ");
		putonoff(blockscroll);
		puts("\n|Memory allows for no more than ");
		uspr( (slotsinmem-2)*PAGESIZE/sizeof(anaddr) ); 
		puts("| lines of text");

		puts("\n\n\nTo change, enter capital letter, or enter |Q| to return: ");
		switch((c=getlow())) {
		case 'a': 
			autoin= !autoin; 
			break;
		case 'b': 
			backup= !backup; 
			break;
		case 'l':
			displaypos=!displaypos;
			break;
		case 'h':
			blockscroll=!blockscroll;
			break;
		case 't': 
			puts("\n\n|Enter new |tab width|: ");
			if (!(tabwidth=getnumb())) tabwidth=0;
			break;
		case 's':
			trail=!trail; 
			break;
		case 'f': 
			if(files()) goto escape; 
			break;
		case 'q': 
		case ESCKEY:
			goto escape;
			}
		} 
	while (YES);
escape:
	putclr();
	topline=1; 
	if (helpon) dohelp();
	putpage();
}

files()
{
	char oldname[15], newname[15], c;
	int dir, warn;

	dir=curdsk;
	do {
		printdirectory(dir);
		putstatusline(cline);
newcomm: 
		errmess=NULL;
		gotoxy(0,1);
		puts("|Enter |Q| to return to Edit context     |D| to delete a file\n");
		puts("      R| to rename a file     |V| to view another directory  \n");
		deleteline(0,3);
		puts("      C| to change the name of the edited file "); 
		puts(filename);
		deleteline(0,4); 
		deleteline(0,5);
		gotoxy(6,4); 
		c=getlow();
		putstatusline(cline);
		switch (c) {
		case ESCKEY:
			return YES;
		case 'q':	
			return NO;
		case 'v':	
			deleteline(6,4);
			puts("Enter drive letter |(A to P): ");
			if ( (dir=getlow()-'a') < 0 || dir >= 16) dir=curdsk;
			continue;
		default:	
			if (c == 'r' || c == 'd' || c == 'c') {
				deleteline(6,4);
				puts("Name of file: "); 
				scans(oldname,15);
				if (!oldname[0]) goto newcomm;
				format(oldname);
				}
			switch (c) {
			case 'd':	
				if (funlink(oldname) == FAIL) {
					error("Can't delete");
					goto newcomm;
					}
				break;
			case 'r' :	
				deleteline(6,5);
				puts("New name:     "); 
				scans(newname,15);
				format(newname);
				if (!newname[0] || frename(oldname,newname) == FAIL) {
					error("Can't rename"); 
					goto newcomm;
					}
				break;
			case 'c'  :	
				strcpy(filename,oldname); 
				putstatusline(cline);
			default:
				goto newcomm;
				}
			}

		} 
	while (YES);
}

putonoff(flag)
int flag;
{
	puts(flag?"ON\n":"OFF\n");
}

getnumb()
{
	int i, n;
	char c, numb[5];

	scans(numb,5);
	n=0;
	for (i=0; (c=numb[i]); i++)
		if (c >= '0' && c <= '9') n=n*10+c-'0';
	return n;
}
\n\n|Enter new |tab width|: ");
