|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ T t ┃
Length: 7303 (0x1c87) Types: TextFile Names: »te_rdcmd.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─ ⟦this⟧ »EUUGD11/euug-87hel/sec1/teco/te_rdcmd.c«
/* TECO for Ultrix Copyright 1986 Matt Fichtenbaum */ /* This program and its components belong to GenRad Inc, Concord MA 01742 */ /* They may be copied if this copyright notice is included */ /* te_rdcmd.c read in the command string 12/20/85 */ #include "te_defs.h" int ccount; /* count of chars read in */ int read_cmdstr() { char c; /* temporary character */ int i; /* temporary */ goto prompt; restart: /* prompt again: new line */ if (!eisw && !inp_noterm) crlf(); /* if input not from a file */ prompt: /* issue prompt */ if (!eisw && !inp_noterm) { reset_ctlo(); /* reset any ^O */ type_char('*'); } ccount = 0; lastc = ' '; reline: /* continue reading */ for (;;) /* loop to read command string chars */ { if (!eisw && !inp_noterm) /* if terminal input */ { if ((c = gettty()) == DEL) /* process rubout */ { if (!ccount) goto restart; /* if at beginning, ignore */ --ccount; /* decrement char count */ backc(&cmdstr); /* back up the command-string pointer */ /* look at the character just deleted */ if (((c = cmdstr.p->ch[cmdstr.c]) < ' ') && (c != ESC)) /* control chars: set c to char erased */ { if (c == LF) vt(VT_LINEUP); /* line up */ else if ((c == CR) || (c == TAB)) { i = find_lasteol(); /* back up to previous line */ type_char(CR); /* erase current line */ vt(VT_EEOL); if (i == ccount) type_char('*'); /* if this was line with prompt, retype the prompt */ for (; (t_qp.p != cmdstr.p) || (t_qp.c != cmdstr.c); fwdc(&t_qp)) type_char(t_qp.p->ch[t_qp.c]); /* retype line: stop before deleted position */ } else { vt(VT_BS2); /* erase ordinary ctrl chars */ char_count -= 2; } } \f else { vt(VT_BS1); /* erase printing chars */ char_count--; } lastc = ' '; /* disable dangerous last chars */ continue; } /* end 'rubout' processing */ else if (c == CTL(U)) /* process "erase current line" */ { type_char(CR); /* erase line */ vt(VT_EEOL); if ((ccount -= find_lasteol()) <= 0) goto prompt; /* back up to last eol: if beginning, restart */ cmdstr.p = t_qp.p; /* put command pointer back to this point */ cmdstr.c = t_qp.c; lastc = ' '; continue; /* and read it again */ } else /* not a rubout or ^U */ { if (!ccount) /* if at beginning of line */ { if (c == '*') /* save old command string */ { type_char('*'); /* echo character */ type_char(c = gettty()); /* read reg spec and echo */ i = getqspec(0, c); free_blist(qreg[i].f); /* return its previous contents */ qreg[i].f = cbuf.f; /* put the old command string in its place */ qreg[i].f->b = (struct buffcell *) &qreg[i]; qreg[i].z = cbuf.z; cbuf.f = NULL; /* no old command string */ err = 0; /* no previous error */ goto restart; } else if ((c == '?') && (err)) /* echo previous command string up to error */ { type_char('?'); /* echo ? */ for (aa.p = cptr.p; aa.p->b->b != NULL; aa.p = aa.p->b); /* find beginning */ for (aa.c = 0; (aa.p != cptr.p) || (aa.c < cptr.c); fwdc(&aa)) type_char(aa.p->ch[aa.c]); type_char('?'); /* a final ? */ err = 0; /* reset error switch */ goto restart; } else if ((c == LF) || (c == CTL (H))) /* line feed, backspace */ { dot += lines( (c == LF) ? 1 : -1); /* pointer up or down one line */ window(WIN_LINE); /* display one line */ goto restart; } \f else /* first real command on a line */ { make_buffer(&cbuf); /* start a command string if need be */ cmdstr.p = cbuf.f; /* set cmdstr to point to start of command string */ cmdstr.c = 0; cbuf.z = 0; /* no chars in command string now */ err = 0; /* clear last error flag */ } } /* end of "if first char on line" */ /* check ^G-something */ if (lastc == CTL (G)) { if (c == CTL(G)) { cbuf.z = ccount; /* save count for possible "save in q-reg" */ goto restart; } if ((c == '*') || (c == ' ')) { backc(&cmdstr); /* remove the previous ^G from buffer */ --ccount; crlf(); retype_cmdstr(c); /* retype appropriate part of command string */ lastc = ' '; continue; } /* end of ^G* and ^G<sp> processing */ } /* end of "last char was ^G" */ } /* end of "not rubout or ^U */ } /* end of "if !eisw" */ \f else /* if input from indirect file or redirected std input */ { if (!ccount) /* first command? */ { if (!cbuf.f) /* start a command string if need be */ { cbuf.f = get_bcell(); cbuf.f->b = (struct buffcell *) &cbuf; } cmdstr.p = cbuf.f; /* point cmdstr to start of command string */ cbuf.z = cmdstr.c = 0; } c = (eisw) ? getc(eisw) : gettty() ; /* get char */ if (eisw && (c == EOF)) /* if this is end of the indirect command file */ { fclose(eisw); /* close the input file */ eisw = 0; /* reset the switch */ lastc = ' '; continue; /* and go read more chars */ } else { if ((c == LF) && (lastc != CR) && !(ez_val & EZ_CRLF)) /* LF: store implied CR first */ { cmdstr.p->ch[cmdstr.c] = CR; ++ccount; fwdcx(&cmdstr); } } } /* end of "if redirected std in or eisw" */ /* store character in command string */ cmdstr.p->ch[cmdstr.c] = c; /* store the character */ ++ccount; /* keep count of chars */ if (!eisw && !inp_noterm) type_char(c); /* echo the character */ fwdcx(&cmdstr); /* next char pos'n; extend command string if nec */ if ((c == ESC) && (lastc == ESC)) break; /* stop on 2nd ESC */ if ((c == CTL (C)) && (lastc == CTL (C))) return(-1); /* immediate exit */ lastc = c; /* keep track of last char */ } /* end of read-char loop */ cbuf.z = ccount; /* indicate number of chars in command string */ if (!eisw && !inp_noterm) crlf(); /* final new-line */ return(0); } /* end of read_cmdstr() */ \f /* back up to find most recent CR or LF in entered command string */ /* return number of chars backed up */ int find_lasteol() { int i; for (i = 0, t_qp.p = cmdstr.p, t_qp.c = cmdstr.c; (backc(&t_qp)) ; i++) /* look for beg. of line */ { if ((t_qp.p->ch[t_qp.c] == CR) || (t_qp.p->ch[t_qp.c] == LF)) { fwdc(&t_qp); /* stop short of previous eol */ break; } } char_count = 0; /* reset tab count */ return(i); } /* retype command string: entirely (arg = '*') or most recent line (arg = ' ') */ retype_cmdstr(c) char c; { int i; if (!inp_noterm) /* if input is really from terminal */ { if (c == ' ') /* look for beginning of this line */ i = ccount - find_lasteol(); /* to last eol, and count char's backed up */ else { t_qp.p = cbuf.f; /* retype whole command string */ i = t_qp.c = 0; } if (!i) type_char('*'); /* if from beginning, retype prompt */ for (; i < ccount; i++) /* type command string from starting point */ { type_char(t_qp.p->ch[t_qp.c]); fwdc(&t_qp); } } }