ast@cs.vu.nl (Andy Tanenbaum) (06/05/88)
: This is a shar archive. Extract with sh, not csh.
: This archive ends with exit, so do not worry about trailing junk.
: --------------------------- cut here --------------------------
PATH=/bin:/usr/bin:/usr/ucb
echo Extracting 'LISTING'
sed 's/^X//' > 'LISTING' << '+ END-OF-FILE ''LISTING'
Xtotal 15
X-rw-rw-rw- 1 ast 0 Jun 4 22:33 LISTING
X-rw-rw-rw- 1 ast 78 Jun 4 22:32 makefile.diff
X-rw-rw-rw- 1 ast 668 Jun 4 22:32 sh.h.diff
X-rw-rw-rw- 1 ast 322 Jun 4 22:32 sh1.c.diff
X-rw-rw-rw- 1 ast 338 Jun 4 22:32 sh2.c.diff
X-rw-rw-rw- 1 ast 440 Jun 4 22:32 sh3.c.diff
X-rw-rw-rw- 1 ast 730 Jun 4 22:32 sh4.c.diff
X-rw-rw-rw- 1 ast 8254 Jun 4 22:32 sh5.c.diff
+ END-OF-FILE LISTING
chmod 'u=rw,g=rw,o=rw' 'LISTING'
set `wc -c 'LISTING'`
count=$1
case $count in
456) :;;
*) echo 'Bad character count in ''LISTING' >&2
echo 'Count should be 456' >&2
esac
echo Extracting 'makefile.diff'
sed 's/^X//' > 'makefile.diff' << '+ END-OF-FILE ''makefile.diff'
X2c2
X< l=../../lib
X---
X> l=/lib
X7c7
X< @chmem =8000 sh
X---
X> @chmem =20000 sh
+ END-OF-FILE makefile.diff
chmod 'u=rw,g=rw,o=rw' 'makefile.diff'
set `wc -c 'makefile.diff'`
count=$1
case $count in
78) :;;
*) echo 'Bad character count in ''makefile.diff' >&2
echo 'Count should be 78' >&2
esac
echo Extracting 'sh.h.diff'
sed 's/^X//' > 'sh.h.diff' << '+ END-OF-FILE ''sh.h.diff'
X113,116c113
X< union {
X< char *io_name; /* file name */
X< struct block *io_here; /* here structure pointer */
X< } io_un;
X---
X> char *io_name; /* file name */
X261,263c258
X< #define XIO 4 /* file IO */
X< #define XHERE 0x80 /* Any of the above inside a here document */
X< #define XMASK 0x7f /* Get the actual task */
X---
X> #define XIO 3 /* file IO */
X266c261
X< #define INSUB() ((e.iop->task&XMASK)==XGRAVE||(e.iop->task&XMASK)==XDOLL)
X---
X> #define INSUB() (e.iop->task == XGRAVE || e.iop->task == XDOLL)
X273a269
X> int herechar();
X301c297
X< struct io *setbase(/* struct io * */);
X---
X> struct io *setbase(/* struct io * */);
X329a326
X> int getarea(/* char *obj */);
+ END-OF-FILE sh.h.diff
chmod 'u=rw,g=rw,o=rw' 'sh.h.diff'
set `wc -c 'sh.h.diff'`
count=$1
case $count in
668) :;;
*) echo 'Bad character count in ''sh.h.diff' >&2
echo 'Count should be 668' >&2
esac
echo Extracting 'sh1.c.diff'
sed 's/^X//' > 'sh1.c.diff' << '+ END-OF-FILE ''sh1.c.diff'
X145c145
X< if (name[0] == '-') {
X---
X> if (name && name[0] == '-') {
X213c213,215
X< freearea(areanum = 1);
X---
X> areanum = 1;
X> freehere(areanum);
X> freearea(areanum);
X221a224
X> setjmp(failpt = m1); /* Bruce Evans' fix */
X905a909,915
X> }
X>
X> int
X> getarea(cp)
X> char *cp;
X> {
X> return ((struct region*)cp-1)->area;
+ END-OF-FILE sh1.c.diff
chmod 'u=rw,g=rw,o=rw' 'sh1.c.diff'
set `wc -c 'sh1.c.diff'`
count=$1
case $count in
322) :;;
*) echo 'Bad character count in ''sh1.c.diff' >&2
echo 'Count should be 322' >&2
esac
echo Extracting 'sh2.c.diff'
sed 's/^X//' > 'sh2.c.diff' << '+ END-OF-FILE ''sh2.c.diff'
X124a125,126
X> if((peeksym = yylex(0)) == '&')
X> t = block(TASYNC, t, NOBLOCK, NOWORDS);
X126,127d127
X< if (c == '&')
X< t = block(TASYNC, t, NOBLOCK, NOWORDS);
X129a130,131
X> if((peeksym = yylex(0)) == '&')
X> p = block(TASYNC, p, NOBLOCK, NOWORDS);
X136a139
X>
X559c562
X< iop->io_un.io_name = cp;
X---
X> iop->io_name = cp;
+ END-OF-FILE sh2.c.diff
chmod 'u=rw,g=rw,o=rw' 'sh2.c.diff'
set `wc -c 'sh2.c.diff'`
count=$1
case $count in
338) :;;
*) echo 'Bad character count in ''sh2.c.diff' >&2
echo 'Count should be 338' >&2
esac
echo Extracting 'sh3.c.diff'
sed 's/^X//' > 'sh3.c.diff' << '+ END-OF-FILE ''sh3.c.diff'
X177a178
X> freehere(areanum);
X216c217
X< else
X---
X> else if (cp != NULL)
X270,271d270
X< if (t->type == TPAREN)
X< exit(execute(t->left, NOPIPE, NOPIPE, FEXEC));
X275a275,276
X> if (t->type == TPAREN)
X> exit(execute(t->left, NOPIPE, NOPIPE, FEXEC));
X322c323
X< cp = iop->io_un.io_name;
X---
X> cp = iop->io_name;
X343c344
X< u = herein(iop->io_un.io_here, iop->io_flag&IOXHERE);
X---
X> u = herein(iop->io_name, iop->io_flag&IOXHERE);
+ END-OF-FILE sh3.c.diff
chmod 'u=rw,g=rw,o=rw' 'sh3.c.diff'
set `wc -c 'sh3.c.diff'`
count=$1
case $count in
440) :;;
*) echo 'Bad character count in ''sh3.c.diff' >&2
echo 'Count should be 440' >&2
esac
echo Extracting 'sh4.c.diff'
sed 's/^X//' > 'sh4.c.diff' << '+ END-OF-FILE ''sh4.c.diff'
X2,5c2,7
X< #include "signal.h"
X< #include "errno.h"
X< #include "setjmp.h"
X< #include "stat.h"
X---
X> #include <signal.h>
X> #include <errno.h>
X> #include <setjmp.h>
X> #include <sys/types.h>
X> #include <sys/stat.h>
X> #include <sys/dir.h>
X350,354c352,354
X<
X< /* jrp debug */
X< scraphere();
X<
X< freearea(areanum = 1); /* free old space */
X---
X> areanum = 1;
X> freehere(areanum);
X> freearea(areanum); /* free old space */
X379,384d378
X< #define DIRSIZ 14
X< struct direct
X< {
X< unsigned short d_ino;
X< char d_name[DIRSIZ];
X< };
X725a720,732
X> }
X>
X> char *
X> memcpy(ato, from, nb)
X> register char *ato, *from;
X> register int nb;
X> {
X> register char *to;
X>
X> to = ato;
X> while (--nb >= 0)
X> *to++ = *from++;
X> return(ato);
+ END-OF-FILE sh4.c.diff
chmod 'u=rw,g=rw,o=rw' 'sh4.c.diff'
set `wc -c 'sh4.c.diff'`
count=$1
case $count in
730) :;;
*) echo 'Bad character count in ''sh4.c.diff' >&2
echo 'Count should be 730' >&2
esac
echo Extracting 'sh5.c.diff'
sed 's/^X//' > 'sh5.c.diff' << '+ END-OF-FILE ''sh5.c.diff'
X29c29
X< if ((ec != '"') && (ec != '\'')) {
X---
X> if (ec != '\'') {
X237a238,255
X> * Return the characters from a here temp file.
X> */
X> int
X> herechar(ap)
X> register struct ioarg *ap;
X> {
X> char c;
X>
X>
X> if (read(ap->afile, &c, sizeof(c)) != sizeof(c)) {
X> close(ap->afile);
X> c = 0;
X> }
X> return (c);
X>
X> }
X>
X> /*
X413,419d430
X< } *herelist;
X<
X< struct block {
X< char *b_linebuf;
X< char *b_next;
X< char b_tmpfile[50];
X< int b_fd;
X422c433,434
X< static struct block *readhere();
X---
X> static struct here *inhere; /* list of hear docs while parsing */
X> static struct here *acthere; /* list of active here documents */
X424c436
X< #define NCPB 2048 /* here text block allocation unit */
X---
X> static char *readhere();
X425a438,439
X> #define NCPB 100 /* here text block allocation unit */
X>
X439d452
X< h->h_iop->io_un.io_here = NULL;
X441,442c454,455
X< if (herelist == 0)
X< herelist = h;
X---
X> if (inhere == 0)
X> inhere = h;
X444c457
X< for (lh = herelist; lh!=NULL; lh = lh->h_next)
X---
X> for (lh = inhere; lh!=NULL; lh = lh->h_next)
X462,465c475,480
X< for (h = herelist; h != NULL; h = h->h_next) {
X< h->h_iop->io_un.io_here =
X< readhere(h->h_tag, h->h_dosub? 0: '\'',
X< h->h_iop->io_flag & IOXHERE);
X---
X> for (h = inhere; h != NULL; h = inhere) {
X> h->h_iop->io_name = readhere(h->h_tag, h->h_dosub? 0: '\'');
X> /* relink from inhere to acthere list */
X> inhere = h->h_next;
X> h->h_next = acthere;
X> acthere = h;
X467c482
X< herelist = NULL;
X---
X> inhere = h;
X470,471c485,486
X< static struct block *
X< readhere(s, ec, nolit)
X---
X> static char *
X> readhere(s, ec)
X474c489,490
X< register struct block *bp;
X---
X> int tf;
X> char tname[30];
X476a493,494
X> char line [LINELIM+1];
X> char *next;
X478,484c496,504
X< bp = (struct block *) space(sizeof(*bp));
X< if (bp == 0)
X< return(0);
X< bp->b_linebuf = (char *)space(NCPB);
X< if (bp->b_linebuf == 0) {
X< /* jrp - should release bp here... */
X< return(0);
X---
X> tempname(tname);
X> tf = creat(tname, 0600);
X> if (tf < 0)
X> return (0);
X> if (newenv(setjmp(errpt = ev)) != 0)
X> return (0);
X> if (e.iop == iostack && e.iop->iofn == filechar) {
X> pushio(e.iop->arg, filechar);
X> e.iobase = e.iop;
X486,507c506,514
X< if (newenv(setjmp(errpt = ev)) == 0) {
X< if (e.iop == iostack && e.iop->iofn == filechar) {
X< pushio(e.iop->arg, filechar);
X< e.iobase = e.iop;
X< }
X<
X< /* jrp changes */
X< bp->b_linebuf[0] = 0;
X< bp->b_next = bp->b_linebuf;
X< bp->b_tmpfile[0] = 0;
X< bp->b_fd = -1;
X< for (;;) {
X< while ((c = getc(ec)) != '\n' && c) {
X< if (ec == '\'')
X< c &= ~ QUOTE;
X< if (savec(c, bp, nolit) == 0) {
X< c = 0;
X< break;
X< }
X< }
X< savec(0, bp, nolit);
X< if (strcmp(s, bp->b_linebuf) == 0 || c == 0)
X---
X> for (;;) {
X> if (talking && e.iop <= iostack)
X> prs(cprompt->value);
X> next = line;
X> while ((c = getc(ec)) != '\n' && c) {
X> if (ec == '\'')
X> c &= ~ QUOTE;
X> if (next >= &line[LINELIM]) {
X> c = 0;
X509c516,517
X< savec('\n', bp, nolit);
X---
X> }
X> *next++ = c;
X511,515c519,523
X< *bp->b_linebuf = 0;
X< if (c == 0) {
X< prs("here document `"); prs(s); err("' unclosed");
X< }
X< quitenv();
X---
X> *next = 0;
X> if (strcmp(s, line) == 0 || c == 0)
X> break;
X> *next++ = '\n';
X> write (tf, line, (int)(next-line));
X517,558c525,526
X< return(bp);
X< }
X<
X< static
X< savec(c, bp, nolit)
X< register struct block *bp;
X< {
X< /* jrp - gutted routine completely, modified to use temp file. */
X<
X< /* If the file is not open, see if a filename needs to be
X< * created. If so, create one. Then create the file.
X< */
X< char * lp;
X< char * cp;
X< static int inc;
X< int len;
X<
X< if(bp->b_fd < 0) {
X< if(bp->b_tmpfile[0] == 0) {
X< /* Key this by the PID plus a tag... */
X< for (cp = bp->b_tmpfile, lp = "/tmp/shtm";
X< (*cp = *lp++) != '\0'; cp++)
X< ;
X<
X< inc = (inc + 1) % 100;
X< lp = putn(getpid()*100 + inc);
X< for (; (*cp = *lp++) != '\0'; cp++)
X< ;
X< }
X<
X< /* Create the file, then open it for
X< * read/write access. After opening the
X< * file, unlink it to it'll go away when
X< * we're through using it.
X< */
X< bp->b_fd = creat(bp->b_tmpfile, 0600);
X< close(bp->b_fd);
X< bp->b_fd = open(bp->b_tmpfile, 2);
X< unlink(bp->b_tmpfile);
X< if(bp->b_fd < 0) {
X< return(0);
X< }
X---
X> if (c == 0) {
X> prs("here document `"); prs(s); err("' unclosed");
X560,586c528,531
X<
X< /* Stuff the character into the line buffer. If it's a
X< * newline, then insert it before the trailing null, write
X< * out the line, and reset the line buffer.
X< */
X< if(c == '\n') {
X< bp->b_next[-1] = '\n';
X< bp->b_next[0] = '\0';
X< len = strlen(bp->b_linebuf);
X<
X< /* Write this out, unless the line ended
X< * with a backslash...
X< */
X< if((len > 1) && (bp->b_next[-2] != '\\')) {
X< write_linebuf(bp, nolit);
X< }
X<
X< return(1);
X< }
X< else {
X< if(bp->b_next == &(bp->b_linebuf[NCPB - 1])) {
X< prs("here: line buffer full\n");
X< return(0);
X< }
X< *(bp->b_next++) = c;
X< return(1);
X< }
X---
X> close(tf);
X> quitenv();
X> /* correct area? */
X> return (strsave(tname, areanum));
X589,590c534,539
X< write_linebuf(bp, nolit)
X< struct block * bp;
X---
X> /*
X> * open here temp file.
X> * if unquoted here, expand here temp file into second temp file.
X> */
X> herein(hname, xdoll)
X> char *hname;
X591a541
X> register hf, tf;
X593,594c543,551
X< char c;
X< jmp_buf ev;
X---
X> if (hname == 0)
X> return(-1);
X> hf = open(hname, 0);
X> if (hf < 0)
X> return (-1);
X> if (xdoll) {
X> char c;
X> char tname[30];
X> jmp_buf ev;
X596c553,555
X< if(nolit) {
X---
X> tempname(tname);
X> if ((tf = creat(tname, 0600)) < 0)
X> return (-1);
X598c557
X< PUSHIO(aword, bp->b_linebuf, strchar);
X---
X> PUSHIO(afile, hf, herechar);
X600d558
X< e.iop->task |= XHERE;
X603c561
X< write(bp->b_fd, &c, sizeof c);
X---
X> write(tf, &c, sizeof c);
X606,615c564,571
X<
X< }
X< }
X< else {
X< write(bp->b_fd, bp->b_linebuf, strlen(bp->b_linebuf));
X< }
X<
X< /* Zap the line buffer for next time... */
X< bp->b_next = bp->b_linebuf;
X< bp->b_linebuf[0] = 0;
X---
X> } else
X> unlink(tname);
X> close(tf);
X> tf = open(tname, 0);
X> unlink(tname);
X> return (tf);
X> } else
X> return (hf);
X618,619c574
X< herein(bp, xdoll)
X< struct block *bp;
X---
X> scraphere()
X621,639c576
X< int ret_fd;
X<
X< if (bp == 0)
X< return(-1);
X<
X< /* If we have a temp file, then rewind it to the beginning */
X< if(bp->b_fd < 0) {
X< return(-1);
X< }
X<
X< lseek(bp->b_fd, 0L, 0);
X<
X< /* Free up this block pointer, as we're
X< * not going to need it anymore.
X< */
X< xfree(bp->b_linebuf);
X< xfree(bp);
X<
X< return(bp->b_fd);
X---
X> inhere = NULL;
X642c579,581
X< scraphere()
X---
X> /* unlink here temp files before a freearea(area) */
X> freehere(area)
X> int area;
X644,646c583
X< struct here * h;
X< struct here * nexth;
X< struct block * bp;
X---
X> register struct here *h, *hl;
X648,661c585,593
X<
X< /* Close and unlink any files associated with
X< * heres in progress, and free up all the
X< * associated structures.
X< */
X< h = herelist;
X< while(h != NULL) {
X< nexth = h->h_next;
X< bp = (struct block *)h->h_iop->io_un.io_here;
X< if(bp != NULL) {
X< if(bp->b_fd >= 0) { close(bp->b_fd); }
X< if(*bp->b_tmpfile) { unlink(bp->b_tmpfile); }
X< xfree(bp->b_linebuf);
X< xfree(bp);
X---
X> hl = NULL;
X> for (h = acthere; h != NULL; hl = h, h = h->h_next)
X> if (getarea(h) >= area) {
X> if (h->h_iop->io_name != NULL)
X> unlink(h->h_iop->io_name);
X> if (hl == NULL)
X> acthere = h->h_next;
X> else
X> hl->h_next = h->h_next;
X663,667d594
X< xfree(h);
X< h = nexth;
X< }
X<
X< herelist = NULL;
X670,673c597,598
X< char *
X< memcpy(ato, from, nb)
X< register char *ato, *from;
X< register int nb;
X---
X> tempname(tname)
X> char *tname;
X675c600,601
X< register char *to;
X---
X> static int inc;
X> register char *cp, *lp;
X677,680c603,607
X< to = ato;
X< while (--nb >= 0)
X< *to++ = *from++;
X< return(ato);
X---
X> for (cp = tname, lp = "/tmp/shtm"; (*cp = *lp++) != '\0'; cp++)
X> ;
X> lp = putn(getpid()*1000 + inc++);
X> for (; (*cp = *lp++) != '\0'; cp++)
X> ;
+ END-OF-FILE sh5.c.diff
chmod 'u=rw,g=rw,o=rw' 'sh5.c.diff'
set `wc -c 'sh5.c.diff'`
count=$1
case $count in
8254) :;;
*) echo 'Bad character count in ''sh5.c.diff' >&2
echo 'Count should be 8254' >&2
esac
exit 0