|
|
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 - metrics - downloadIndex: T t
Length: 5907 (0x1713)
Types: TextFile
Names: »te_main.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦this⟧ »EUUGD11/euug-87hel/sec1/teco/te_main.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_main.c main program 1/14/87 */
/*
* This is TECO for Ultrix on a Vax. It is mostly compatible with DEC TECO
* as explained in the DEC TECO manual. It was written from a manual for
* TECO-11 version 34, and so adheres most closely to that version.
*
* This program consists of several source files, as follows:
*
* te_main.c (this file) Main program - initialize, read command line and
* startup file, handle errors, high-level read and
* execute command strings.
*
* te_defs.h Definitions file, to be #included with other files
*
* te_data.c Global variables
*
* te_rdcmd.c Read in a command string
*
* te_exec0.c First-level command execution - numbers, values,
* assemble expressions
*
* te_exec1.c Most commands
*
* te_exec2.c "E" and "F" commands, and file I/O
*
* te_srch.c routines associated with "search" commands
*
* te_subs.c higher-level subroutines
*
* te_utils.c lower-level subroutines
*
* te_chario.c keyboard (stdin), typeout (stdout), suspend
*
* te_window.c display window and display special functions
*
* These routines should be compiled and linked to form the TECO executable.
*/
\f
#include "te_defs.h"
main(argc, argv)
int argc; /* arg count */
char *argv[]; /* array of string pointers */
{
int i;
save_args(argc, argv, &qreg[36]); /* copy command line to Qz */
read_startup(); /* read startup file */
setup_tty(TTY_ON); /* set tty to CBREAK, no echo, asynch mode */
window(WIN_INIT); /* initialize screen-image buffer */
get_term_par(); /* set terminal screen-size parameters */
/* set up error restart */
if (err = setjmp(xxx))
{
if (err == E_EFI) goto quit; /* EOF from standard input - clean up and exit */
printf("\015\012? %s", errors[err-1]);
if (err == E_SRH) print_string(SERBUF); /* print unfulfilled search string */
else if ((err == E_FNF) || (err == E_COF) || (err == E_AMB)) print_string(FILBUF); /* or file string */
crlf();
eisw = 0; /* stop indirect command execution */
et_val &= ~(ET_CTRLC | ET_NOWAIT | ET_CTRLO | ET_NOECHO); /* reset ^C trap, read w/o wait, ^O (unused), no echo */
if (et_val & ET_QUIT) /* if ET has "quit on error" set, exit (phone home) */
{
cleanup(); /* reset screen, keyboard, output files */
exit(1); /* and exit */
}
}
/* forever: read and execute command strings */
for (exitflag = 1; exitflag >= 0; ) /* "exit" sets exitflag to -1; ^C to -2; "hangup" to -3 */
{
window(WIN_REFR); /* display the buffer */
free_blist(insert_p); /* free any storage from failed insert */
free_blist(dly_freebuff); /* return any delayed cells */
insert_p = dly_freebuff = NULL;
et_val &= ~ET_QUIT; /* clear "abort on error" */
if (read_cmdstr()) goto quit;
exitflag = 0; /* enable ^C detector */
if (!WN_scroll) window(WIN_REDRAW); /* if not in scroll mode, force full redraw on first ^W or nW */
exec_cmdstr();
}
if (exitflag == -2) ERROR(E_XAB); /* ^C detected during execution */
else if (exitflag == -3) panic(); /* hangup during execution: save buffer and close files */
/* exit from program */
quit:
ev_val = es_val = 0; /* no last one-line window */
window(WIN_REFR); /* last display */
cleanup(); /* reset screen, terminal, output files */
exit(0); /* and quit */
}
\f
/* reset screen state, keyboard state; remove open output files */
cleanup()
{
window(WIN_OFF); /* restore screen */
setup_tty(TTY_OFF); /* restore terminal */
kill_output(&po_file); /* kill any open primary output file */
kill_output(&so_file); /* and secondary file */
}
/* print string for error message */
/* argument is subscript of a qreg qh, prints text from that buffer */
print_string(arg)
int arg;
{
int i, c;
struct buffcell *p;
type_char('"');
for (p = qreg[arg].f, c = 0, i = 0; i < qreg[arg].z; i++)
{
if (!p->ch[c]) break;
type_char(p->ch[c]);
if (++c > CELLSIZE-1)
{
p = p->f;
c = 0;
}
}
type_char('"');
}
\f
/* copy invocation command line to a text buffer */
save_args(argc, argv, q)
int argc;
char *argv[];
struct qh *q;
{
char c;
struct qp ptr;
make_buffer(q); /* attach a text buffer */
ptr.p = q->f; /* initialize pointer to output string */
ptr.c = q->z = 0; /* and output char count */
for (; argc > 0; argv++, argc--) /* for each arg */
{
while ( ((c = *((*argv)++)) != '\0') && (q->z < CELLSIZE-1) )
{
ptr.p->ch[ptr.c] = c; /* copy char to q-reg */
fwdcx(&ptr);
++q->z; /* count characters */
}
if (argc > 1) /* if not last argument... */
{
ptr.p->ch[ptr.c] = ' '; /* space to separate arguments */
fwdcx(&ptr);
}
}
}
/* routine to read startup file */
char startup_name[] = "/.tecorc"; /* name of startup file */
read_startup()
{
char *hp, *getenv();
char fn[CELLSIZE]; /* filename storage */
int i;
/* look for ".tecorc" in current directory first */
if (!(eisw = fopen(&startup_name[1], "r")))
{
if (hp = getenv("HOME")) /* if not found, look in home directory */
{
for (i = 0; i < CELLSIZE; i++) if (!(fn[i] = *(hp++))) break; /* copy until trailing null */
for (hp = &startup_name[0]; i < CELLSIZE; i++) if (!(fn[i] = *(hp++))) break;
eisw = fopen(fn, "r"); /* set eisw if file found, or not if not */
}
}
}
\f
/* routine to get terminal height and width from termcap */
get_term_par()
{
char buff[1024]; /* termcap buffer */
char *pname; /* pointer to name of terminal */
extern char *getenv();
if (pname = getenv("TERM")) /* read terminal name */
{
tgetent(buff, pname); /* get entry */
set_term_par(tgetnum("li"), tgetnum("co")); /* get #lines and #columns and set params */
}
}