home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Fish 1
/
GoldFishApril1994_CD1.img
/
d1xx
/
d107
/
csh
/
rawconsole.c
< prev
next >
Wrap
C/C++ Source or Header
|
1987-10-31
|
5KB
|
250 lines
/*
* RawConsole.c
*
* Shell 2.07M 17-Jun-87
* console handling, command line editing support for Shell
* using new console packets from 1.2.
* Written by Steve Drew. (c) 14-Oct-86.
* 16-Dec-86 Slight mods to rawgets() for Disktrashing.
*
*/
#if RAW_CONSOLE
extern int aux; /* for use with aux: */
#include "shell.h"
void
setraw(onoff)
{
if (onoff) set_raw();
else set_con();
}
char *
rawgets(line,prompt)
char *line, *prompt;
{
char *get_var();
char *gets();
register int n, pl;
register int max, i;
unsigned char c1,c2,c3;
char fkeys[5];
char *s, *tyahdptr;
char *ps;
int fkey, savn;
int insert = 1;
char rep[20];
char typeahd[256];
static int width;
int recall = -1;
struct HIST *hist;
if (aux) {
printf("%s",prompt);
fflush(stdout);
}
if (!IsInteractive(Input()) || aux ) return(gets(line));
if (WaitForChar((long)Input(), 100L) || /* don't switch to 1L ...*/
stdin->_bp < stdin->_bend) { /* else causes read err's*/
/* printf("%s",prompt); */
gets(line);
return(line);
}
setraw(1);
printf("\015%s\2336n",prompt);
savn = pl = n = 0;
tyahdptr = typeahd;
while((typeahd[n]=getchar()) != 'R') {
if ((unsigned char)typeahd[n] == 155) savn = n;
n++;
}
/* typeahd now contains possible type a head chars
followed by <CSI> cursor position report.
*/
typeahd[savn] = '\0';
if (typeahd[n-2] != ';') {
pl = (typeahd[n-2] - 48) * 10;
}
pl += typeahd[n-1] - 49;
ps = line + pl;
line[max = i = pl] = '\0';
if (!width) width = 77;
if (s = get_var (LEVEL_SET, "_insert"))
insert = atoi(s) ? 1 : 0;
while( (c1 = *tyahdptr) != '\0' || (c1 = getchar()) != 255) {
if (*tyahdptr) ++tyahdptr;
switch(c1) {
case 155:
c2 = getchar();
switch(c2) {
case 'A': /* up arrow */
n = ++recall;
case 'B': /* down arrow */
line[pl] = '\0';
if (recall >= 0 || c2 == 'A') {
if (c2 == 'B') n = --recall;
if (recall >= 0) {
for(hist = H_head; hist && n--;
hist = hist->next);
if (hist) strcpy(&line[pl],hist->line);
else recall = H_len;
}
}
if (i != pl)
printf("\233%dD",i);
printf("\015\233J%s%s",prompt,ps);
i = max = strlen(ps) + pl;
break;
case 'C': /* right arrow*/
if (i < max) {
i++;
printf("\233C");
}
break;
case 'D': /* left arrow */
if (i > pl) {
i--;
printf("\233D");
}
break;
case 'T': /* shift up */
case 'S': /* shift down */
break;
case ' ': /* shift -> <-*/
c3 = getchar();
break;
default:
c3 = getchar();
if (c3 == '~') {
fkey = c2;
fkeys[0] = 'f';
if (c2 == 63) {
strcpy(ps,"help");
goto done;
}
}
else if (getchar() != '~') { /* window was resized */
while(getchar() != '|');
printf("\2330 q"); /* get window bounds */
n = 0;
while((rep[n] = getchar()) != 'r' && n++ < 20);
width = (rep[n-3] - 48) * 10 + rep[n-2] - 48;
rep[n-1] = '\0';
set_var (LEVEL_SET, "_width", &rep[n-3]);
break;
}
else {
fkey = c3;
fkeys[0] = 'F';
}
sprintf(fkeys+1,"%d",fkey - 47);
if (!(s = get_var(LEVEL_SET, fkeys))) break;
tyahdptr = strcpy(typeahd,s);
break;
}
break;
case 8:
if (i > pl) {
i--;
printf("\010");
}
else break;
case 127:
if (i < max) {
int j,t,l = 0;
movmem(&line[i+1],&line[i],max-i);
--max;
printf("\233P");
j = width - i % width - 1; /* amount to end */
t = max/width - i/width; /* no of lines */
for(n = 0; n < t; n++) {
l += j; /* no. of char moved */
if (j) printf("\233%dC",j); /* goto eol */
printf("%c\233P",line[width*(i/width+n+1)-1]);
j = width-1;
}
if (t)
printf("\233%dD",l+t); /* get back */
}
break;
case 18:
n = i/width;
if (n) printf("\233%dF",n);
printf("\015\233J%s%s",prompt,ps);
i = max;
break;
case 27:
break;
case 1:
insert ^= 1;
break;
case 21:
case 24:
case 26:
if (i > pl)
printf("\233%dD",i-pl);
i = pl;
if (c1 == 26) break;
printf("\233J");
max = i;
line[i] = '\0';
break;
case 11: /* ^K */
printf("\233J");
max = i;
line[i] = '\0';
break;
case 28: /* ^\ */
setraw(0);
return(NULL);
case 5:
printf("\233%dC",max - i);
i = max;
break;
case 10:
case 13:
line[max] = '\0';
done: printf("\233%dC\n",max - i);
setraw(0);
strcpy(line, ps);
return(line);
default:
c1 &= 0x7f;
if (c1 == 9) c1 = 32;
if (c1 > 31 & i < 256) {
if (i < max && insert) {
int j,t,l = 0;
movmem(&line[i], &line[i+1], max - i);
printf("\233@%c",c1);
t = max/width - i/width;
j = width - i % width - 1;
for(n = 0; n < t; n++) {
l += j;
if (j) printf("\233%dC",j);
printf("\233@%c",line[width*(i/width+n+1)]);
j = width-1;
}
if (t) printf("\233%dD",l + t);
++max;
}
else {
if(i == pl && max == i) printf("\015%s%s",prompt,ps);
putchar(c1);
}
line[i++] = c1;
if (max < i) max = i;
line[max] = '\0';
}
}
}
setraw(0);
return(NULL);
}
#endif