Metropoli BBS
VIEWER: gettcom.c MODE: TEXT (ASCII)
/*Copyright (C) 1992, 1996 by Thomas Glen Smith.	All Rights Reserved.*/
/* gettcom APL2 V1.0.0 *************************************************
* Called by both gettext to handle input line editing.                 *
***********************************************************************/
#define INCLUDES STDIO+STRING
#include "includes.h"
int gettcom(line,linelen,maxline,cursor,insert)
char line[]; /* line stored here.*/ 	int linelen;/* curlength(line)*/
int maxline; /* maxlength(line). */	int cursor; /* cursor position*/
int insert;  /* 1=input inserted, 0=overlaid. */
{	Aplgetc; Aplnewl; Aplprint; Aplputch; Edlinf; Edling;
	int cc, ii, jj, lim;
#if APL_DOS
	static int aa=0;
#endif

	lim = maxline - linelen;
	while (--lim > 0 && (cc = aplgetc()) != EOF) {
#if APL_DOS
		if (cc == '\n' || cc == '\r') {
			if (aa == cc) { /* It's two consecutive empty lines. */
				cursor = linelen;
				break; /* all done */
			}
			if (aa == '\n' || aa == '\r') {
				aa = cc = aplgetc(); /* Throw away reduncancy. */
				if (EOF == cc) break;
				if (cc == '\n' || cc == '\r') { /* Two empty lines. */
					cursor = linelen;
					break; /* all done */
				}
			} else {
				cursor = linelen;
				break; /* all done */
			}
		} else aa=0;
#else
		if (cc == '\n' || cc == '\r') {
			cursor = linelen;
			break; /* all done */
		}
#endif
		switch (cc) {
		case '\b': /* backspace */
			if (cursor) { /* del, reprint */
				edling(line,&cursor,1,--linelen);
				lim++;
			}
			break;
		case '\0': /* potential left/right arrow, delete key */
			switch(aplgetc()) { /* get the real code */
			case 71: while (cursor) /* home */
				edlinf(line,&cursor,1); /* backspace */ break;
			case 75: if (cursor) /* left arrow */
				edlinf(line,&cursor,1); /* backspace */ break;
			case 77: if ( linelen > cursor ) /* right arrow */
				aplputch(line[cursor++]); break;
			case 79: while ( linelen > cursor ) /* end */
				aplputch(line[cursor++]); break;
			case 83: if (cursor < linelen) /* delete */ {
				cursor++;
				edling(line,&cursor,1,--linelen); } break;
			} /* end switch */
			break;
		default: if (cursor >= maxline) break;
			if (insert) for ( jj = linelen++; jj >= cursor; jj-- )
				line[jj+1] = line[jj];
			aplputch(line[cursor++]=cc);
			if (insert) {
				aplprint(line+cursor); /* print again */
				ii = linelen; /* cursor is at end of line */
				edlinf(line,&ii,linelen - cursor); /* backspace */
			} else if (cursor > linelen) line[linelen=cursor] = '\0';
			break;
	}	} /* end switch */
	aplnewl(); /* Start a new output line. */
	line[cursor] = '\0';
	if (cursor == 0 && cc == EOF) return(-1); /* indicate end-of-file */
	return(cursor);
}
[ RETURN TO DIRECTORY ]