BSD 2 development
[unix-history] / .ref-BSD-1 / ex-1.1 / ex_unix.c
#
/*
* Ex - a text editor
* Bill Joy UCB September, 1977
*/
#include "ex.h"
#define UXBSZ 100
char uxb[UXBSZ + 2];
unix()
{
register char *up, *fp;
register c;
char printub, puxb[UXBSZ + 2];
setnoaddr();
printub = 0;
strcpy(puxb, uxb);
c = getchar();
if (c == '\n' || c == EOF)
error("Incomplete shell escape command@- use 'shell' to get a shell");
up = uxb;
do {
switch (c) {
case '\\':
if (any(peekchar(), "%`!"))
c = getchar();
default:
if (up >= &uxb[UXBSZ]) {
tunix:
uxb[0] = 0;
error("Command too long@- limit 100 characters");
}
*up++ = c;
break;
case '!':
fp = puxb;
if (*fp == 0) {
uxb[0] = 0;
error("No previous command@to substitute for !");
}
printub++;
while (*fp) {
if (up >= &uxb[UXBSZ])
goto tunix;
*up++ = *fp++;
}
break;
case '`':
fp = altfile;
if (*fp == 0) {
uxb[0] = 0;
error("No alternate filename@to substitute for `");
}
goto uexp;
case '%':
fp = savedfile;
if (*fp == 0) {
uxb[0] = 0;
error("No filename@to substitute for %%");
}
uexp:
printub++;
while (*fp) {
if (up >= &uxb[UXBSZ])
goto tunix;
*up++ = *fp++ | QUOTE;
}
break;
}
c = getchar();
} while (c == '|' || !endcmd(c));
*up = 0;
up = uxb;
unix2("-c", printub, uxb);
}
unix2(opt, printub, up)
char *opt, printub, *up;
{
register int savint;
if (chngflag && xchngflag != chngflag) {
xchngflag = chngflag;
if (!value(FORK))
error("No write@since last change");
dingdong();
printf(mesg("[No write]\n|[No write since last change]\n"));
flush();
}
if (value(HUSH) == 0 && printub) {
if (uxb[0] == 0)
error("No previous command@to repeat");
lprintf("!%s\n", uxb);
flush();
}
savint = signal(INTR, 1);
pid = fork();
if (pid < 0) {
signal(INTR, savint);
error("No more processes");
}
if (pid == 0) {
/*
if (io)
close(io);
if (tfile)
close(tfile);
close(erfile);
*/
signal(HUP, oldhup);
signal(QUIT, oldquit);
execl(value(SHELL), "sh", opt, up, 0);
die++;
error("No %s!\n", value(SHELL));
}
waitfor();
signal(INTR, savint);
if (value(HUSH) == 0)
printf("!\n");
flush();
termreset();
gettmode();
}