|
|
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: 5458 (0x1552)
Types: TextFile
Names: »te_exec0.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦this⟧ »EUUGD11/euug-87hel/sec1/teco/te_exec0.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_exec0.c execute command string 11/31/86 */
#include "te_defs.h"
#include <sys/time.h>
exec_cmdstr()
{
char c;
int digit_sw;
struct tm *timeptr;
char *timestring, *asctime();
struct timeval timevalue, tzvalue;
exitflag = 0; /* set flag to "executing" */
cmdstr.p = cbuf.f; /* cmdstr to start of command string */
cmdstr.z = cbuf.z;
cmdstr.flag = cmdstr.dot = cmdstr.c = 0; /* clear char ptr and iteration flag */
msp = &cmdstr; /* initialize macro stack pointer */
esp = &estack[0]; /* initialize expression stack pointer */
qsp = &qstack[-1]; /* initialize q-reg stack pointer */
atflag = colonflag = 0; /* clear flags */
esp->flag2 = esp->flag1 = 0; /* initialize expression reader */
esp->op = OP_START;
trace_sw = 0; /* start out with trace off */
digit_sw = 0; /* and no digits read */
while (!exitflag) /* until end of command string */
{
if (getcmdc0(trace_sw) == '^') /* interpret next char as corresp. control char */
cmdc = getcmdc(trace_sw) & 0x1f;
if (isdigit(cmdc)) /* process number */
{ /* this works lousy for hex but so does TECO-11 */
if (cmdc - '0' >= ctrl_r) ERROR(E_ILN); /* invalid digit */
if (!(digit_sw++)) esp->val1 = cmdc - '0'; /* first digit */
else esp->val1 = esp->val1 * ctrl_r + cmdc - '0'; /* other digits */
esp->flag1++; /* indicate a value read in */
}
/* not a digit: dispatch on character */
else
{
digit_sw = 0;
switch (mapch_l[cmdc])
{
/* characters ignored */
case CR:
case LF:
case VT:
case FF:
case ' ':
break;
\f
/* ESC: one absorbs argument, two terminate current level */
case ESC:
if (peekcmdc(ESC)) /* if next char is an ESC */
{
if (msp <= &mstack[0]) exitflag = 1; /* pop stack; if empty, terminate */
else --msp;
}
else
{
esp->flag1 = 0; /* else consume argument */
esp->op = OP_START;
}
break;
/* skip comments */
case '!':
while (getcmdc(trace_sw) != '!');
break;
/* modifiers */
case '@':
atflag++;
break;
case ':':
if (peekcmdc(':')) /* is it "::" ? */
{
getcmdc(trace_sw); /* yes, skip 2nd : */
colonflag = 2; /* and set flag to show 2 */
}
else colonflag = 1; /* otherwise just 1 colon */
break;
/* trace control */
case '?':
trace_sw = !(trace_sw);
break;
/* values */
case '.':
esp->val1 = dot;
esp->flag1 = 1;
break;
case 'z':
esp->val1 = z;
esp->flag1 = 1;
break;
case 'b':
esp->val1 = 0;
esp->flag1 = 1;
break;
\f
case 'h':
esp->val1 = z;
esp->val2 = 0;
esp->flag2 = esp->flag1 = 1;
esp->op = OP_START;
break;
case CTL (S): /* -length of last insert, etc. */
esp->val1 = ctrl_s;
esp->flag1 = 1;
break;
case CTL (Y): /* .-^S, . */
esp->val1 = dot + ctrl_s;
esp->val2 = dot;
esp->flag1 = esp->flag2 = 1;
esp->op = OP_START;
break;
case '(':
if (++esp > &estack[ESTACKSIZE-1]) ERROR(E_PDO);
esp->flag2 = esp->flag1 = 0;
esp->op = OP_START;
break;
case CTL (E): /* form feed flag */
esp->val1 = ctrl_e;
esp->flag1 = 1;
break;
case CTL (N): /* eof flag */
esp->val1 = infile->eofsw;
esp->flag1 = 1;
break;
case CTL (^): /* value of next char */
esp->val1 = getcmdc(trace_sw);
esp->flag1 = 1;
break;
/* date, time */
case CTL (B):
case CTL (H):
gettimeofday(&timevalue, &tzvalue);
timeptr = localtime(&timevalue.tv_sec);
esp->val1 = (cmdc == CTL (B)) ?
timeptr->tm_year * 512 + timeptr->tm_mon * 32 + timeptr->tm_mday :
timeptr->tm_hour * 1800 + timeptr->tm_min * 30 + timeptr->tm_sec/2;
esp->flag1 = 1;
make_buffer(&timbuf); /* make a time buffer */
timestring = asctime(timeptr);
for (timbuf.z = 0; timbuf.z < 24; timbuf.z++) /* copy character string */
timbuf.f->ch[timbuf.z] = *(timestring + timbuf.z);
break;
\f
/* number of characters to matching ( ) { } [ ] */
case CTL (P):
do_ctlp();
break;
/* none of the above: incorporate the last value into the expression */
default:
if (esp->flag1) /* if a value entered */
{
switch (esp->op)
{
case OP_START:
break;
case OP_ADD:
esp->val1 += esp->exp;
esp->op = OP_START;
break;
case OP_SUB:
esp->val1 = esp->exp - esp->val1;
esp->op = OP_START;
break;
case OP_MULT:
esp->val1 *= esp->exp;
esp->op = OP_START;
break;
case OP_DIV:
esp->val1 = (esp->val1) ? esp->exp / esp->val1 : 0;
esp->op = OP_START;
break;
case OP_AND:
esp->val1 &= esp->exp;
esp->op = OP_START;
break;
case OP_OR:
esp->val1 |= esp->exp;
esp->op = OP_START;
break;
}
} /* end of "if a new value" */
exec_cmds1(); /* go do the command */
} /* end of command dispatch */
} /* end of "not a digit" */
} /* end of "while" command loop */
return;
} /* end of exec_cmdstr */