home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume1 / bourne / part2 < prev    next >
Encoding:
Internet Message Format  |  1986-11-30  |  54.6 KB

  1. Date: Fri, 7 Jun 85 13:58:43 edt
  2. From: Arnold Robbins <gatech!arnold>
  3. Subject: Bourne shell history + tilde + job control + more (Part 2 of 9)
  4. Newsgroups: mod.sources
  5.  
  6. This is part 2 of 9.  It contains the first set of code diffs for the BSD
  7. Bourne shell.
  8.  
  9. Arnold Robbins
  10. arnold@gatech.{UUCP, CSNET}
  11. ------------------- tear here --------------------
  12. :::::::: Makefile :::::::
  13. *** ../orig.u/Makefile    Wed May 15 17:13:43 1985
  14. --- Makefile    Tue Jun  4 17:30:08 1985
  15. ***************
  16. *** 1,6
  17.   #    Makefile    4.5    83/07/01
  18.   #
  19. ! CFLAGS = -O -w
  20.   
  21.   all:    sh
  22.   
  23.  
  24. --- 1,6 -----
  25.   #    Makefile    4.5    83/07/01
  26.   #
  27. ! CFLAGS = -O -w -DJOBS
  28.   
  29.   all:    sh
  30.   
  31. ***************
  32. *** 12,17
  33.       cmp sh /bin/sh
  34.       rm sh *.o
  35.   
  36.   sh:    setbrk.o
  37.   sh:    builtin.o blok.o stak.o
  38.   sh:    cmd.o fault.o main.o
  39.  
  40. --- 12,21 -----
  41.       cmp sh /bin/sh
  42.       rm sh *.o
  43.   
  44. + expand.o:    expand.c
  45. +     @echo ignore the redefiniton of MAX
  46. +     $(CC) $(CFLAGS) -c expand.c
  47.   sh:    setbrk.o
  48.   sh:    builtin.o blok.o stak.o
  49.   sh:    cmd.o fault.o main.o
  50. ***************
  51. *** 19,24
  52.   sh:    xec.o service.o error.o io.o
  53.   sh:    print.o macro.o expand.o
  54.   sh:    ctype.o msg.o
  55.   blok.o:        brkincr.h
  56.   fault.o:    brkincr.h
  57.   main.o:        brkincr.h
  58.  
  59. --- 23,29 -----
  60.   sh:    xec.o service.o error.o io.o
  61.   sh:    print.o macro.o expand.o
  62.   sh:    ctype.o msg.o
  63. + sh:    history.o homedir.o jobs.o signal.o # remove signal.o on pyramid
  64.   blok.o:        brkincr.h
  65.   fault.o:    brkincr.h
  66.   main.o:        brkincr.h
  67. :::::::: args.c :::::::
  68. *** ../orig.u/args.c    Wed May 15 17:13:43 1985
  69. --- args.c    Tue Jun  4 13:20:43 1985
  70. ***************
  71. *** 16,22
  72.   PROC STRING *copyargs();
  73.   LOCAL DOLPTR    dolh;
  74.   
  75. ! CHAR    flagadr[10];
  76.   
  77.   CHAR    flagchar[] = {
  78.       'x',    'n',    'v',    't',    's',    'i',    'e',    'r',    'k',    'u',    0
  79.  
  80. --- 16,26 -----
  81.   PROC STRING *copyargs();
  82.   LOCAL DOLPTR    dolh;
  83.   
  84. ! #if JOBS
  85. ! CHAR    flagadr[15];
  86. ! #else
  87. ! CHAR    flagadr[13];
  88. ! #endif
  89.   
  90.   CHAR    flagchar[] = {
  91.       'x',    'n',    'v',    't',    's',    'i',    'e',    'r',    'k',    'u',
  92. ***************
  93. *** 19,25
  94.   CHAR    flagadr[10];
  95.   
  96.   CHAR    flagchar[] = {
  97. !     'x',    'n',    'v',    't',    's',    'i',    'e',    'r',    'k',    'u',    0
  98.   };
  99.   INT    flagval[]  = {
  100.       execpr,    noexec,    readpr,    oneflg,    stdflg,    intflg,    errflg,    rshflg,    keyflg,    setflg,    0
  101.  
  102. --- 23,37 -----
  103.   #endif
  104.   
  105.   CHAR    flagchar[] = {
  106. !     'x',    'n',    'v',    't',    's',    'i',    'e',    'r',    'k',    'u',
  107. ! #if JOBS
  108. !     'I',
  109. !     'J',
  110. ! #endif
  111. !     'E',
  112. !     'H',
  113. !     'q',
  114. !     0
  115.   };
  116.   INT    flagval[]  = {
  117.       execpr,    noexec,    readpr,    oneflg,    stdflg,    intflg,    errflg,    rshflg,    keyflg,    setflg,
  118. ***************
  119. *** 22,28
  120.       'x',    'n',    'v',    't',    's',    'i',    'e',    'r',    'k',    'u',    0
  121.   };
  122.   INT    flagval[]  = {
  123. !     execpr,    noexec,    readpr,    oneflg,    stdflg,    intflg,    errflg,    rshflg,    keyflg,    setflg,    0
  124.   };
  125.   
  126.   /* ========    option handling    ======== */
  127.  
  128. --- 34,48 -----
  129.       0
  130.   };
  131.   INT    flagval[]  = {
  132. !     execpr,    noexec,    readpr,    oneflg,    stdflg,    intflg,    errflg,    rshflg,    keyflg,    setflg,
  133. ! #if JOBS
  134. !     infoflg,
  135. !     jobflg,
  136. ! #endif
  137. !     noeotflg,
  138. !     nohistflg,
  139. !     quickflg,
  140. !     0
  141.   };
  142.   
  143.   /* ========    option handling    ======== */
  144. ***************
  145. *** 38,45
  146.       STRING        flagp;
  147.   
  148.       IF argc>1 ANDF *argp[1]=='-'
  149. !     THEN    cp=argp[1];
  150. !         flags &= ~(execpr|readpr);
  151.           WHILE *++cp
  152.           DO    flagc=flagchar;
  153.   
  154.  
  155. --- 58,77 -----
  156.       STRING        flagp;
  157.   
  158.       IF argc>1 ANDF *argp[1]=='-'
  159. !     THEN
  160. !         IF argp[1][1] == '-'
  161. !         THEN    /* if first argument is "--" then options are not
  162. !                to be changed.  fix for problems getting $1
  163. !                starting with a "-"
  164. !             */
  165. !             argp[1] = argp[0]; argc--;
  166. !             return (argc);
  167. !         FI
  168. !         cp=argp[1];
  169. !         IF cp[1] == '\0' THEN flags &= ~(execpr|readpr) FI
  170. !         /* step along 'flagchar[]' looking for matches.
  171. !            'sicrq' are not legal with 'set' command.
  172. !         */
  173.           WHILE *++cp
  174.           DO    flagc=flagchar;
  175.   
  176. ***************
  177. *** 45,51
  178.   
  179.               WHILE *flagc ANDF *flagc != *cp DO flagc++ OD
  180.               IF *cp == *flagc
  181. !             THEN    flags |= flagval[flagc-flagchar];
  182.               ELIF *cp=='c' ANDF argc>2 ANDF comdiv==0
  183.               THEN    comdiv=argp[2];
  184.                   argp[1]=argp[0]; argp++; argc--;
  185.  
  186. --- 77,91 -----
  187.   
  188.               WHILE *flagc ANDF *flagc != *cp DO flagc++ OD
  189.               IF *cp == *flagc
  190. !             THEN    IF eq(argv[0], "set") ANDF any(*cp, "sicrq")
  191. !                 THEN    failed(argv[1], badopt);
  192. !                 ELSE
  193. ! #if JOBS
  194. !                     IF *cp == 'J' THEN j_init() FI
  195. ! #endif
  196. !                     flags |= flagval[flagc-flagchar];
  197. !                     IF flags & errflg THEN eflag = errflg FI
  198. !                 FI
  199.               ELIF *cp=='c' ANDF argc>2 ANDF comdiv==0
  200.               THEN    comdiv=argp[2];
  201.                   argp[1]=argp[0]; argp++; argc--;
  202. ***************
  203. *** 53,58
  204.               FI
  205.           OD
  206.           argp[1]=argp[0]; argc--;
  207.       FI
  208.   
  209.       /* set up $- */
  210.  
  211. --- 93,123 -----
  212.               FI
  213.           OD
  214.           argp[1]=argp[0]; argc--;
  215. +     ELIF argc > 1 ANDF *argp[1] == '+'    /* unset flags x, k , t, n, v, e, u */
  216. +     THEN    cp = argp[1];            /* or any other flags */
  217. +         WHILE *++cp
  218. +         DO
  219. +             flagc = flagchar;
  220. +             WHILE *flagc ANDF *flagc != *cp DO flagc++ OD
  221. +                 /* step through flags */
  222. +             IF !any(*cp, "sicrq") ANDF *cp == *flagc
  223. +             THEN
  224. +                 IF (flags&flagval[flagc-flagchar])
  225. +                 /* only turn off if already on */
  226. +                 THEN
  227. + #if JOBS
  228. +                     IF *cp != 'J' ORF !j_finish(FALSE)
  229. +                     THEN
  230. + #endif
  231. +                     flags &= ~(flagval[flagc-flagchar]);
  232. + #if JOBS
  233. +                     FI
  234. + #endif
  235. +                     IF *cp == 'e' THEN eflag = 0 FI
  236. +                 FI
  237. +             FI
  238. +         OD
  239. +         argp[1]=argp[0]; argc--;
  240.       FI
  241.   
  242.       /* set up $- */
  243. ***************
  244. *** 126,131
  245.   
  246.       /* clean up io files */
  247.       WHILE pop() DONE
  248.   }
  249.   
  250.   DOLPTR    useargs()
  251.  
  252. --- 191,198 -----
  253.   
  254.       /* clean up io files */
  255.       WHILE pop() DONE
  256. +     /* clean up temp files */
  257. +     WHILE poptemp() DONE
  258.   }
  259.   
  260.   DOLPTR    useargs()
  261. :::::::: blok.c :::::::
  262. No differences encountered
  263. :::::::: brkincr.h :::::::
  264. No differences encountered
  265. :::::::: builtin.c :::::::
  266. No differences encountered
  267. :::::::: cmd.c :::::::
  268. *** ../orig.u/cmd.c    Wed May 15 17:13:44 1985
  269. --- cmd.c    Thu May 30 13:53:25 1985
  270. ***************
  271. *** 93,98
  272.           case ';':
  273.           IF e=cmd(sym,flg|MTFLG)
  274.           THEN    i=makelist(TLST, i, e);
  275.           FI
  276.           break;
  277.   
  278.  
  279. --- 93,100 -----
  280.           case ';':
  281.           IF e=cmd(sym,flg|MTFLG)
  282.           THEN    i=makelist(TLST, i, e);
  283. +         ELIF    i == 0
  284. +         THEN    synbad();
  285.           FI
  286.           break;
  287.   
  288. ***************
  289. *** 326,332
  290.   
  291.       SWITCH wdval IN
  292.   
  293. !         case DOCSYM:
  294.           iof |= IODOC; break;
  295.   
  296.           case APPSYM:
  297.  
  298. --- 328,334 -----
  299.   
  300.       SWITCH wdval IN
  301.   
  302. !         case DOCSYM:    /* << */
  303.           iof |= IODOC; break;
  304.   
  305.           case APPSYM:    /* >> */
  306. ***************
  307. *** 329,335
  308.           case DOCSYM:
  309.           iof |= IODOC; break;
  310.   
  311. !         case APPSYM:
  312.           case '>':
  313.           IF wdnum==0 THEN iof |= 1 FI
  314.           iof |= IOPUT;
  315.  
  316. --- 331,337 -----
  317.           case DOCSYM:    /* << */
  318.           iof |= IODOC; break;
  319.   
  320. !         case APPSYM:    /* >> */
  321.           case '>':
  322.           IF wdnum==0 THEN iof |= 1 FI
  323.           iof |= IOPUT;
  324. ***************
  325. *** 341,346
  326.           IF (c=nextc(0))=='&'
  327.           THEN    iof |= IOMOV;
  328.           ELIF c=='>'
  329.           THEN    iof |= IORDW;
  330.           ELSE    peekc=c|MARK;
  331.           FI
  332.  
  333. --- 343,350 -----
  334.           IF (c=nextc(0))=='&'
  335.           THEN    iof |= IOMOV;
  336.           ELIF c=='>'
  337. +         /*    <> is open for read and write */
  338. +         /*    previously unadvertised feature */
  339.           THEN    iof |= IORDW;
  340.           ELSE    peekc=c|MARK;
  341.           FI
  342. :::::::: ctype.c :::::::
  343. *** ../orig.u/ctype.c    Wed May 15 17:13:44 1985
  344. --- ctype.c    Thu May 30 13:59:18 1985
  345. ***************
  346. *** 13,19
  347.   
  348.   #include    "defs.h"
  349.   
  350. ! char    _ctype1[] {
  351.   /*    000    001    002    003    004    005    006    007    */
  352.       _EOF,    0,    0,    0,    0,    0,    0,    0,
  353.   
  354.  
  355. --- 13,19 -----
  356.   
  357.   #include    "defs.h"
  358.   
  359. ! char    _ctype1[] = {
  360.   /*    000    001    002    003    004    005    006    007    */
  361.       _EOF,    0,    0,    0,    0,    0,    0,    0,
  362.   
  363. ***************
  364. *** 25,30
  365.       0,    0,    0,    0,    0,    0,    0,    0,
  366.   
  367.   /*    sp    !    "    #    $    %    &    '    */
  368.       _SPC,    0,    _DQU,    0,    _DOL1,    0,    _AMP,    0,
  369.   
  370.   /*    (    )    *    +    ,    -    .    /    */
  371.  
  372. --- 25,33 -----
  373.       0,    0,    0,    0,    0,    0,    0,    0,
  374.   
  375.   /*    sp    !    "    #    $    %    &    '    */
  376. + #if JOBS
  377. +     _SPC,    0,    _DQU,    0,    _DOL1,    _PCT,    _AMP,    0,
  378. + #else
  379.       _SPC,    0,    _DQU,    0,    _DOL1,    0,    _AMP,    0,
  380.   #endif
  381.   
  382. ***************
  383. *** 26,31
  384.   
  385.   /*    sp    !    "    #    $    %    &    '    */
  386.       _SPC,    0,    _DQU,    0,    _DOL1,    0,    _AMP,    0,
  387.   
  388.   /*    (    )    *    +    ,    -    .    /    */
  389.       _BRA,    _KET,    0,    0,    0,    0,    0,    0,
  390.  
  391. --- 29,35 -----
  392.       _SPC,    0,    _DQU,    0,    _DOL1,    _PCT,    _AMP,    0,
  393.   #else
  394.       _SPC,    0,    _DQU,    0,    _DOL1,    0,    _AMP,    0,
  395. + #endif
  396.   
  397.   /*    (    )    *    +    ,    -    .    /    */
  398.       _BRA,    _KET,    0,    0,    0,    0,    0,    0,
  399. ***************
  400. *** 62,68
  401.   };
  402.   
  403.   
  404. ! char    _ctype2[] {
  405.   /*    000    001    002    003    004    005    006    007    */
  406.       0,    0,    0,    0,    0,    0,    0,    0,
  407.   
  408.  
  409. --- 66,72 -----
  410.   };
  411.   
  412.   
  413. ! char    _ctype2[] = {
  414.   /*    000    001    002    003    004    005    006    007    */
  415.       0,    0,    0,    0,    0,    0,    0,    0,
  416.   
  417. ***************
  418. *** 95,101
  419.       _UPC,    _UPC,    _UPC,    _UPC,    _UPC,    _UPC,    _UPC,    _UPC,
  420.   
  421.   /*    X    Y    Z    [    \    ]    ^    _    */
  422. !     _UPC,    _UPC,    _UPC,    _SQB,    0,    0,    0,    _UPC,
  423.   
  424.   /*    `    a    b    c    d    e    f    g    */
  425.       0,    _LPC,    _LPC,    _LPC,    _LPC,    _LPC,    _LPC,    _LPC,
  426.  
  427. --- 99,105 -----
  428.       _UPC,    _UPC,    _UPC,    _UPC,    _UPC,    _UPC,    _UPC,    _UPC,
  429.   
  430.   /*    X    Y    Z    [    \    ]    ^    _    */
  431. !     _UPC,    _UPC,    _UPC,    0,    0,    0,    0,    _UPC,
  432.   
  433.   /*    `    a    b    c    d    e    f    g    */
  434.       0,    _LPC,    _LPC,    _LPC,    _LPC,    _LPC,    _LPC,    _LPC,
  435. :::::::: ctype.h :::::::
  436. *** ../orig.u/ctype.h    Wed May 15 17:13:44 1985
  437. --- ctype.h    Thu May 30 14:01:21 1985
  438. ***************
  439. *** 51,56
  440.   #define _BSL    (T_ESC)
  441.   #define _DQU    (T_QOT)
  442.   #define _DOL1    (T_SUB|T_ESC)
  443.   
  444.   #define _CBR    T_BRC
  445.   #define _CKT    T_DEF
  446.  
  447. --- 51,59 -----
  448.   #define _BSL    (T_ESC)
  449.   #define _DQU    (T_QOT)
  450.   #define _DOL1    (T_SUB|T_ESC)
  451. + #if JOBS
  452. + #define _PCT    (T_SUB|T_ESC)
  453. + #endif
  454.   
  455.   #define _CBR    T_BRC
  456.   #define _CKT    T_DEF
  457. ***************
  458. *** 68,74
  459.   #define _IDCH    (T_IDC|T_DIG)
  460.   #define _META    (T_SPC|T_DIP|T_MET|T_EOR)
  461.   
  462. ! char    _ctype1[];
  463.   
  464.   /* nb these args are not call by value !!!! */
  465.   #define    space(c)    (((c)"E)==0 ANDF _ctype1[c]&(T_SPC))
  466.  
  467. --- 71,77 -----
  468.   #define _IDCH    (T_IDC|T_DIG)
  469.   #define _META    (T_SPC|T_DIP|T_MET|T_EOR)
  470.   
  471. ! extern char    _ctype1[];
  472.   
  473.   /* nb these args are not call by value !!!! */
  474.   #define    space(c)    (((c)"E)==0 ANDF _ctype1[c]&(T_SPC))
  475. ***************
  476. *** 79,85
  477.   #define subchar(c)    (((c)"E)==0 ANDF _ctype1[c]&(T_SUB|T_QOT))
  478.   #define escchar(c)    (((c)"E)==0 ANDF _ctype1[c]&(T_ESC))
  479.   
  480. ! char    _ctype2[];
  481.   
  482.   #define    digit(c)    (((c)"E)==0 ANDF _ctype2[c]&(T_DIG))
  483.   #define fngchar(c)    (((c)"E)==0 ANDF _ctype2[c]&(T_FNG))
  484.  
  485. --- 82,88 -----
  486.   #define subchar(c)    (((c)"E)==0 ANDF _ctype1[c]&(T_SUB|T_QOT))
  487.   #define escchar(c)    (((c)"E)==0 ANDF _ctype1[c]&(T_ESC))
  488.   
  489. ! extern char    _ctype2[];
  490.   
  491.   #define    digit(c)    (((c)"E)==0 ANDF _ctype2[c]&(T_DIG))
  492.   #define dolchar(c)    (((c)"E)==0 ANDF _ctype2[c]&(T_AST|T_BRC|T_DIG|T_IDC|T_SHN|_PLS))
  493. ***************
  494. *** 82,89
  495.   char    _ctype2[];
  496.   
  497.   #define    digit(c)    (((c)"E)==0 ANDF _ctype2[c]&(T_DIG))
  498. ! #define fngchar(c)    (((c)"E)==0 ANDF _ctype2[c]&(T_FNG))
  499. ! #define dolchar(c)    (((c)"E)==0 ANDF _ctype2[c]&(T_AST|T_BRC|T_DIG|T_IDC|T_SHN))
  500.   #define defchar(c)    (((c)"E)==0 ANDF _ctype2[c]&(T_DEF))
  501.   #define setchar(c)    (((c)"E)==0 ANDF _ctype2[c]&(T_SET))
  502.   #define digchar(c)    (((c)"E)==0 ANDF _ctype2[c]&(T_AST|T_DIG))
  503.  
  504. --- 85,91 -----
  505.   extern char    _ctype2[];
  506.   
  507.   #define    digit(c)    (((c)"E)==0 ANDF _ctype2[c]&(T_DIG))
  508. ! #define dolchar(c)    (((c)"E)==0 ANDF _ctype2[c]&(T_AST|T_BRC|T_DIG|T_IDC|T_SHN|_PLS))
  509.   #define defchar(c)    (((c)"E)==0 ANDF _ctype2[c]&(T_DEF))
  510.   #define setchar(c)    (((c)"E)==0 ANDF _ctype2[c]&(T_SET))
  511.   #define digchar(c)    (((c)"E)==0 ANDF _ctype2[c]&(T_AST|T_DIG))
  512. :::::::: defs.h :::::::
  513. *** ../orig.u/defs.h    Wed May 15 17:13:44 1985
  514. --- defs.h    Wed Jun  5 12:11:27 1985
  515. ***************
  516. *** 8,15
  517.   /* error exits from various parts of shell */
  518.   #define ERROR    1
  519.   #define SYNBAD    2
  520. ! #define SIGFAIL 3
  521. ! #define SIGFLG    0200
  522.   
  523.   /* command tree */
  524.   #define FPRS    020
  525.  
  526. --- 8,15 -----
  527.   /* error exits from various parts of shell */
  528.   #define ERROR    1
  529.   #define SYNBAD    2
  530. ! #define SIGFAIL 2000
  531. ! #define SIGFLG    1000
  532.   
  533.   /* command tree */
  534.   #define FPRS    020
  535. ***************
  536. *** 54,59
  537.   #define SYSREAD 17
  538.   #define SYSTST    18
  539.   #define    SYSUMASK    19
  540.   
  541.   /* used for input and output of shell */
  542.   #define INIO 10
  543.  
  544. --- 54,73 -----
  545.   #define SYSREAD 17
  546.   #define SYSTST    18
  547.   #define    SYSUMASK    19
  548. + #if JOBS
  549. + #define SYSJOBS    20
  550. + #define SYSFG    21
  551. + #define SYSBG    22
  552. + #define SYSSUSPEND    23
  553. + #endif
  554. + #if pyr
  555. + #define SYSATT    24
  556. + #define SYSUCB    25
  557. + #define SYSUNIVERSE    26
  558. + #define U_ATT    1    /* ATT is Universe Number 1 */
  559. + #define U_UCB    2    /* UCB is Universe Number 2 */
  560. + #endif
  561. + #define SYSHISTORY    27
  562.   
  563.   /* used for input and output of shell */
  564.   #define INIO 18
  565. ***************
  566. *** 56,63
  567.   #define    SYSUMASK    19
  568.   
  569.   /* used for input and output of shell */
  570. ! #define INIO 10
  571. ! #define OTIO 11
  572.   
  573.   /*io nodes*/
  574.   #define USERIO    10
  575.  
  576. --- 70,77 -----
  577.   #define SYSHISTORY    27
  578.   
  579.   /* used for input and output of shell */
  580. ! #define INIO 18
  581. ! #define OTIO 19
  582.   
  583.   /*io nodes*/
  584.   #define USERIO    10
  585. ***************
  586. *** 78,83
  587.   #include    "name.h"
  588.   
  589.   
  590.   /* result type declarations */
  591.   #define alloc malloc
  592.   ADDRESS        alloc();
  593.  
  594. --- 92,100 -----
  595.   #include    "name.h"
  596.   
  597.   
  598. + /* error catching */
  599. + extern    INT    errno;
  600.   /* result type declarations */
  601.   #define alloc malloc
  602.   ADDRESS        alloc();
  603. ***************
  604. *** 108,113
  605.   VOID        prc();
  606.   VOID        getenv();
  607.   STRING        *setenv();
  608.   
  609.   #define attrib(n,f)    (n->namflg |= f)
  610.   #define round(a,b)    (((int)((ADR(a)+b)-1))&~((b)-1))
  611.  
  612. --- 125,147 -----
  613.   VOID        prc();
  614.   VOID        getenv();
  615.   STRING        *setenv();
  616. + extern STRING    simple();
  617. + extern STRING    homedir();
  618. + extern STRING    username();
  619. + extern INT    history();
  620. + #if JOBS
  621. + extern BOOL    unpost();
  622. + extern VOID    j_init();
  623. + extern BOOL    j_finish();
  624. + extern VOID    j_child_clear();
  625. + extern VOID    j_child_die();
  626. + extern VOID    j_child_stop();
  627. + extern VOID    j_print();
  628. + extern VOID    j_resume();
  629. + extern VOID    j_child_post();
  630. + extern VOID    j_reset_pg();
  631. + extern STRING    j_macro();
  632. + #endif
  633.   
  634.   #define attrib(n,f)    (n->namflg |= f)
  635.   #define round(a,b)    (((int)((ADR(a)+b)-1))&~((b)-1))
  636. ***************
  637. *** 122,127
  638.   IOPTR        iotemp;        /* files to be deleted sometime */
  639.   IOPTR        iopend;        /* documents waiting to be read at NL */
  640.   
  641.   /* substitution */
  642.   INT        dolc;
  643.   STRING        *dolv;
  644.  
  645. --- 156,175 -----
  646.   IOPTR        iotemp;        /* files to be deleted sometime */
  647.   IOPTR        iopend;        /* documents waiting to be read at NL */
  648.   
  649. + /* history stuff */
  650. + INT        event_count;
  651. + INT        expanded;
  652. + /* keep track of the parent process id */
  653. + INT        ppid;
  654. + #if pyr
  655. + /* keep track of the current universe */
  656. + INT            cur_univ;
  657. + extern STRING        univ_name[];    /* from <universe.h> */
  658. + extern STRING        univ_longname[];
  659. + #endif
  660.   /* substitution */
  661.   INT        dolc;
  662.   STRING        *dolv;
  663. ***************
  664. *** 147,152
  665.   MSG        unexpected;
  666.   MSG        endoffile;
  667.   MSG        synmsg;
  668.   
  669.   /* name tree and words */
  670.   SYSTAB        reserved;
  671.  
  672. --- 195,252 -----
  673.   MSG        unexpected;
  674.   MSG        endoffile;
  675.   MSG        synmsg;
  676. + extern MSG        dashi;    /* ADR */
  677. + #if pyr
  678. + extern MSG        dashl;    /* ADR */
  679. + #endif
  680. + extern MSG        dashr;    /* ADR */
  681. + extern MSG        dashs;    /* ADR */
  682. + #if JOBS
  683. + extern MSG    appdstr;
  684. + extern MSG    bgdstr;
  685. + extern MSG    cjpostr;
  686. + extern MSG    fgdstr;
  687. + extern MSG    fromastr;    /* DAG */
  688. + extern MSG    inlnstr;
  689. + extern MSG    jcoffstr;
  690. + extern MSG    jinvstr;
  691. + extern MSG    jpanstr;
  692. + extern MSG    lotspstr;
  693. + extern MSG    ncjstr;
  694. + extern MSG    nstpstr;
  695. + extern MSG    pipestr;    /* DAG */
  696. + extern MSG    psgpstr;
  697. + extern MSG    ptinstr;
  698. + extern MSG    ptoustr;
  699. + extern MSG    rdinstr;
  700. + extern MSG    rsqbrk;
  701. + extern MSG    spcstr;
  702. + extern MSG    spspstr;
  703. + extern MSG    stpdstr;
  704. + extern MSG    tasjstr;
  705. + extern MSG    toastr;    /* DAG */
  706. + extern MSG    amperstr;    /* DAG */
  707. + extern MSG    andstr;    /* DAG */
  708. + extern MSG    casestr;    /* DAG */
  709. + extern MSG    forstr;    /* DAG */
  710. + extern MSG    iesacstr;
  711. + extern MSG    ifstr;    /* DAG */
  712. + extern MSG    insstr;
  713. + extern MSG    lpnstr;
  714. + extern MSG    orstr;    /* DAG */
  715. + extern MSG    forstr;    /* DAG */
  716. + extern MSG    rpnstr;
  717. + extern MSG    sdonstr;
  718. + extern MSG    sdostr;
  719. + extern MSG    selsstr;
  720. + extern MSG    semspstr;
  721. + extern MSG    sfistr;
  722. + extern MSG    sthnstr;
  723. + extern MSG    untilstr;    /* DAG */
  724. + extern MSG    whilestr;    /* DAG */
  725. + extern MSG    rdwstr;        /* ADR */
  726. + extern MSG    nosusp;        /* ADR */
  727. + #endif
  728.   
  729.   /* name tree and words */
  730.   SYSTAB        reserved;
  731. ***************
  732. *** 160,165
  733.   MSG        stdprompt;
  734.   MSG        supprompt;
  735.   MSG        profile;
  736.   
  737.   /* built in names */
  738.   NAMNOD        fngnod;
  739.  
  740. --- 260,267 -----
  741.   MSG        stdprompt;
  742.   MSG        supprompt;
  743.   MSG        profile;
  744. + extern MSG        shrc;
  745. + extern MSG        savehist;
  746.   
  747.   /* built in names */
  748.   NAMNOD        fngnod;
  749. ***************
  750. *** 169,174
  751.   NAMNOD        pathnod;
  752.   NAMNOD        ps1nod;
  753.   NAMNOD        ps2nod;
  754.   
  755.   /* special names */
  756.   MSG        flagadr;
  757.  
  758. --- 271,280 -----
  759.   NAMNOD        pathnod;
  760.   NAMNOD        ps1nod;
  761.   NAMNOD        ps2nod;
  762. + #if pyr
  763. + extern NAMNOD        univnod;
  764. + #endif
  765. + extern NAMNOD        histfnod;
  766.   
  767.   
  768.   /* special names */
  769. ***************
  770. *** 170,175
  771.   NAMNOD        ps1nod;
  772.   NAMNOD        ps2nod;
  773.   
  774.   /* special names */
  775.   MSG        flagadr;
  776.   STRING        cmdadr;
  777.  
  778. --- 276,282 -----
  779.   #endif
  780.   extern NAMNOD        histfnod;
  781.   
  782.   /* special names */
  783.   MSG        flagadr;
  784.   STRING        cmdadr;
  785. ***************
  786. *** 177,182
  787.   STRING        dolladr;
  788.   STRING        pcsadr;
  789.   STRING        pidadr;
  790.   
  791.   MSG        defpath;
  792.   
  793.  
  794. --- 284,290 -----
  795.   STRING        dolladr;
  796.   STRING        pcsadr;
  797.   STRING        pidadr;
  798. + STRING        ppidadr;
  799.   
  800.   MSG        defpath;
  801.   
  802. ***************
  803. *** 188,193
  804.   MSG        ifsname;
  805.   MSG        ps1name;
  806.   MSG        ps2name;
  807.   
  808.   /* transput */
  809.   CHAR        tmpout[];
  810.  
  811. --- 296,305 -----
  812.   MSG        ifsname;
  813.   MSG        ps1name;
  814.   MSG        ps2name;
  815. + #if pyr
  816. + extern MSG        univname;    /* UNIVERSE */
  817. + #endif
  818. + extern MSG        histfilename;
  819.   
  820.   /* transput */
  821.   CHAR        tmpout[];
  822. ***************
  823. *** 200,205
  824.   INT        peekc;
  825.   STRING        comdiv;
  826.   MSG        devnull;
  827.   
  828.   /* flags */
  829.   #define        noexec    01
  830.  
  831. --- 312,323 -----
  832.   INT        peekc;
  833.   STRING        comdiv;
  834.   MSG        devnull;
  835. + extern BOOL        catcheof;    /* set to catch EOF in reac() */
  836. + #if JOBS
  837. + extern    INT        j_original_pg;
  838. + extern    INT        j_default_pg;
  839. + extern     BOOL        j_top_level;
  840. + #endif
  841.   
  842.   /* flags */
  843.   #define        noexec    01
  844. ***************
  845. *** 203,208
  846.   
  847.   /* flags */
  848.   #define        noexec    01
  849.   #define        intflg    02
  850.   #define        prompt    04
  851.   #define        setflg    010
  852.  
  853. --- 321,327 -----
  854.   
  855.   /* flags */
  856.   #define        noexec    01
  857. + #define        sysflg    01
  858.   #define        intflg    02
  859.   #define        prompt    04
  860.   #define        setflg    010
  861. ***************
  862. *** 216,222
  863.   #define        execpr    04000
  864.   #define        readpr    010000
  865.   #define        keyflg    020000
  866. ! INT        flags;
  867.   
  868.   /* error exits from various parts of shell */
  869.   #include    <setjmp.h>
  870.  
  871. --- 335,349 -----
  872.   #define        execpr    04000
  873.   #define        readpr    010000
  874.   #define        keyflg    020000
  875. ! #if JOBS
  876. ! #define        infoflg        040000
  877. ! #define        jobflg        0100000
  878. ! #endif
  879. ! #define        noeotflg    0200000
  880. ! #define        dotflg        0400000
  881. ! #define        quickflg    01000000
  882. ! #define        nohistflg    02000000
  883. ! L_INT        flags;    /* assure more than 16 bits */
  884.   
  885.   /* error exits from various parts of shell */
  886.   #include    <setjmp.h>
  887. ***************
  888. *** 220,225
  889.   
  890.   /* error exits from various parts of shell */
  891.   #include    <setjmp.h>
  892.   jmp_buf        subshell;
  893.   jmp_buf        errshell;
  894.   jmp_buf        INTbuf;
  895.  
  896. --- 347,356 -----
  897.   
  898.   /* error exits from various parts of shell */
  899.   #include    <setjmp.h>
  900. + #if JOBS && !defined(pyr)
  901. + #define    setjmp(env)        _setjmp(env)
  902. + #define longjmp(env, val)    _longjmp(env, val)
  903. + #endif
  904.   jmp_buf        subshell;
  905.   jmp_buf        errshell;
  906.   
  907. ***************
  908. *** 222,228
  909.   #include    <setjmp.h>
  910.   jmp_buf        subshell;
  911.   jmp_buf        errshell;
  912. - jmp_buf        INTbuf;
  913.   
  914.   /* fault handling */
  915.   #include    "brkincr.h"
  916.  
  917. --- 353,358 -----
  918.   #endif
  919.   jmp_buf        subshell;
  920.   jmp_buf        errshell;
  921.   
  922.   /* fault handling */
  923.   #include    "brkincr.h"
  924. ***************
  925. *** 229,235
  926.   POS        brkincr;
  927.   
  928.   #define MINTRAP    0
  929. ! #define MAXTRAP    17
  930.   
  931.   #define INTR    2
  932.   #define QUIT    3
  933.  
  934. --- 359,369 -----
  935.   POS        brkincr;
  936.   
  937.   #define MINTRAP    0
  938. ! #if JOBS
  939. ! #define MAXTRAP    32
  940. ! #else
  941. ! #define MAXTRAP    20
  942. ! #endif
  943.   
  944.   #define HANGUP    1
  945.   #define INTR    2
  946. ***************
  947. *** 231,236
  948.   #define MINTRAP    0
  949.   #define MAXTRAP    17
  950.   
  951.   #define INTR    2
  952.   #define QUIT    3
  953.   #define MEMF    11
  954.  
  955. --- 365,371 -----
  956.   #define MAXTRAP    20
  957.   #endif
  958.   
  959. + #define HANGUP    1
  960.   #define INTR    2
  961.   #define QUIT    3
  962.   #define MEMF    11
  963. ***************
  964. *** 236,241
  965.   #define MEMF    11
  966.   #define ALARM    14
  967.   #define KILL    15
  968.   #define TRAPSET    2
  969.   #define SIGSET    4
  970.   #define SIGMOD    8
  971.  
  972. --- 371,382 -----
  973.   #define MEMF    11
  974.   #define ALARM    14
  975.   #define KILL    15
  976. + #if JOBS
  977. + #define STOP    17
  978. + #define TSTP    18
  979. + #define TTIN    21
  980. + #define    TTOU    22
  981. + #endif
  982.   #define TRAPSET    2
  983.   #define SIGSET    4
  984.   #define SIGMOD    8
  985. ***************
  986. *** 239,244
  987.   #define TRAPSET    2
  988.   #define SIGSET    4
  989.   #define SIGMOD    8
  990.   
  991.   VOID        fault();
  992.   BOOL        trapnote;
  993.  
  994. --- 380,386 -----
  995.   #define TRAPSET    2
  996.   #define SIGSET    4
  997.   #define SIGMOD    8
  998. + #define SIGCAUGHT    16
  999.   
  1000.   #define HISTSIZE    4096
  1001.   
  1002. ***************
  1003. *** 240,245
  1004.   #define SIGSET    4
  1005.   #define SIGMOD    8
  1006.   
  1007.   VOID        fault();
  1008.   BOOL        trapnote;
  1009.   STRING        trapcom[];
  1010.  
  1011. --- 382,389 -----
  1012.   #define SIGMOD    8
  1013.   #define SIGCAUGHT    16
  1014.   
  1015. + #define HISTSIZE    4096
  1016.   VOID        fault();
  1017.   BOOL        trapnote;
  1018.   STRING        trapcom[];
  1019. ***************
  1020. *** 244,250
  1021.   BOOL        trapnote;
  1022.   STRING        trapcom[];
  1023.   BOOL        trapflg[];
  1024. - BOOL        trapjmp[];
  1025.   
  1026.   /* name tree and words */
  1027.   STRING        *environ;
  1028.  
  1029. --- 388,393 -----
  1030.   BOOL        trapnote;
  1031.   STRING        trapcom[];
  1032.   BOOL        trapflg[];
  1033.   
  1034.   /* name tree and words */
  1035.   STRING        *environ;
  1036. ***************
  1037. *** 289,291
  1038.   
  1039.   #include    "ctype.h"
  1040.   
  1041.  
  1042. --- 432,438 -----
  1043.   
  1044.   #include    "ctype.h"
  1045.   
  1046. + INT        wasintr;
  1047. + INT        eflag;
  1048. + INT        stripflg;
  1049. + INT        rwait;
  1050. :::::::: dup.h :::::::
  1051. No differences encountered
  1052. :::::::: error.c :::::::
  1053. *** ../orig.u/error.c    Wed May 15 17:13:44 1985
  1054. --- error.c    Thu May 30 15:55:20 1985
  1055. ***************
  1056. *** 28,34
  1057.        * no trap has been set.
  1058.        */
  1059.       IF trapnote&SIGSET
  1060. !     THEN    exitsh(SIGFAIL);
  1061.       FI
  1062.   }
  1063.   
  1064.  
  1065. --- 28,34 -----
  1066.        * no trap has been set.
  1067.        */
  1068.       IF trapnote&SIGSET
  1069. !     THEN    exitsh(exitval ? exitval : SIGFAIL);
  1070.       FI
  1071.   }
  1072.   
  1073. ***************
  1074. *** 59,64
  1075.        * Action is to return to command level or exit.
  1076.        */
  1077.       exitval=xno;
  1078.       IF (flags & (forked|errflg|ttyflg)) != ttyflg
  1079.       THEN    done();
  1080.       ELSE    clearup();
  1081.  
  1082. --- 59,65 -----
  1083.        * Action is to return to command level or exit.
  1084.        */
  1085.       exitval=xno;
  1086. +     flags |= eflag;
  1087.       IF (flags & (forked|errflg|ttyflg)) != ttyflg
  1088.       THEN    done();
  1089.       ELSE    clearup();
  1090. ***************
  1091. *** 62,67
  1092.       IF (flags & (forked|errflg|ttyflg)) != ttyflg
  1093.       THEN    done();
  1094.       ELSE    clearup();
  1095.           longjmp(errshell,1);
  1096.       FI
  1097.   }
  1098.  
  1099. --- 63,69 -----
  1100.       IF (flags & (forked|errflg|ttyflg)) != ttyflg
  1101.       THEN    done();
  1102.       ELSE    clearup();
  1103. +         execbrk = breakcnt = 0;
  1104.           longjmp(errshell,1);
  1105.       FI
  1106.   }
  1107. ***************
  1108. *** 74,79
  1109.           execexp(t,0);
  1110.       FI
  1111.       rmtemp(0);
  1112.       exit(exitval);
  1113.   }
  1114.   
  1115.  
  1116. --- 76,82 -----
  1117.           execexp(t,0);
  1118.       FI
  1119.       rmtemp(0);
  1120. +     histsave (histfnod.namval);
  1121.       exit(exitval);
  1122.   }
  1123.   
  1124. :::::::: expand.c :::::::
  1125. *** ../orig.u/expand.c    Wed May 15 17:13:44 1985
  1126. --- expand.c    Tue Jun  4 17:29:43 1985
  1127. ***************
  1128. *** 48,61
  1129.   
  1130.       /* check for meta chars */
  1131.       BEGIN
  1132. !        REG BOOL slash; slash=0;
  1133. !        WHILE !fngchar(*cs)
  1134. !        DO    IF *cs++==0
  1135. !         THEN    IF rflg ANDF slash THEN break; ELSE return(0) FI
  1136. !         ELIF *cs=='/'
  1137. !         THEN    slash++;
  1138. !         FI
  1139. !        OD
  1140.       END
  1141.   
  1142.       LOOP    IF cs==s
  1143.  
  1144. --- 48,79 -----
  1145.   
  1146.       /* check for meta chars */
  1147.       BEGIN
  1148. !        REG BOOL slash, open; open=slash=0;
  1149. !        REP
  1150. !         SWITCH *cs++ IN
  1151. !         case 0:        IF rflg ANDF slash THEN break;
  1152. !                 ELSE return 0;
  1153. !                 FI
  1154. !         
  1155. !         case '/':    slash++;
  1156. !                 open = 0;
  1157. !                 continue;
  1158. !         
  1159. !         case '[':    open++;
  1160. !                 continue;
  1161. !         case ']':    IF open THEN break FI
  1162. !                 continue;
  1163. !         
  1164. !         case '?':
  1165. !         case '*':
  1166. !                 cs--;
  1167. !                 break;
  1168. !         
  1169. !         default:    continue;
  1170. !         ENDSW
  1171. !         break;
  1172. !        PER TRUE DONE
  1173.       END
  1174.   
  1175.       LOOP    IF cs==s
  1176. ***************
  1177. *** 67,73
  1178.               break;
  1179.           FI
  1180.       POOL
  1181. !     IF stat(s,&statb)>=0
  1182.           ANDF (statb.st_mode&S_IFMT)==S_IFDIR
  1183.           ANDF (dirf=opendir(s)) != NULL
  1184.       THEN    dir++;
  1185.  
  1186. --- 85,92 -----
  1187.               break;
  1188.           FI
  1189.       POOL
  1190. !     chgquot(s, 0);
  1191. !     IF stat(*s ? s : ".",&statb)>=0    /* DAG */
  1192.           ANDF (statb.st_mode&S_IFMT)==S_IFDIR
  1193.           ANDF (dirf=opendir(*s ? s : ".")) != NULL    /* DAG -- fixed Berkeley bug */
  1194.       THEN    dir++;
  1195. ***************
  1196. *** 69,75
  1197.       POOL
  1198.       IF stat(s,&statb)>=0
  1199.           ANDF (statb.st_mode&S_IFMT)==S_IFDIR
  1200. !         ANDF (dirf=opendir(s)) != NULL
  1201.       THEN    dir++;
  1202.       FI
  1203.       count=0;
  1204.  
  1205. --- 88,94 -----
  1206.       chgquot(s, 0);
  1207.       IF stat(*s ? s : ".",&statb)>=0    /* DAG */
  1208.           ANDF (statb.st_mode&S_IFMT)==S_IFDIR
  1209. !         ANDF (dirf=opendir(*s ? s : ".")) != NULL    /* DAG -- fixed Berkeley bug */
  1210.       THEN    dir++;
  1211.       FI
  1212.       chgquot(s, 1);
  1213. ***************
  1214. *** 72,77
  1215.           ANDF (dirf=opendir(s)) != NULL
  1216.       THEN    dir++;
  1217.       FI
  1218.       count=0;
  1219.       IF *cs==0 THEN *cs++=0200 FI
  1220.       IF dir
  1221.  
  1222. --- 91,97 -----
  1223.           ANDF (dirf=opendir(*s ? s : ".")) != NULL    /* DAG -- fixed Berkeley bug */
  1224.       THEN    dir++;
  1225.       FI
  1226. +     chgquot(s, 1);
  1227.       count=0;
  1228.       IF *cs==0 THEN *cs++=0200 FI
  1229.       IF dir
  1230. ***************
  1231. *** 81,89
  1232.           REP    IF *rs=='/' THEN rescan=rs; *rs=0; gchain=0 FI
  1233.           PER    *rs++ DONE
  1234.   
  1235. !         IF setjmp(INTbuf) == 0 THEN trapjmp[INTR] = 1; FI
  1236. !         WHILE (trapnote&SIGSET) == 0 ANDF (dp = readdir(dirf)) != NULL
  1237. !         DO    IF (*dp->d_name=='.' ANDF *cs!='.')
  1238.               THEN    continue;
  1239.               FI
  1240.               IF gmatch(dp->d_name, cs)
  1241.  
  1242. --- 101,108 -----
  1243.           REP    IF *rs=='/' THEN rescan=rs; *rs=0; gchain=0 FI
  1244.           PER    *rs++ DONE
  1245.   
  1246. !         WHILE (dp = readdir(dirf)) ANDF (trapnote&SIGSET) == 0
  1247. !         DO    IF *dp->d_name=='.' ANDF *cs!='.'
  1248.               THEN    continue;
  1249.               FI
  1250.   /*
  1251. ***************
  1252. *** 86,91
  1253.           DO    IF (*dp->d_name=='.' ANDF *cs!='.')
  1254.               THEN    continue;
  1255.               FI
  1256.               IF gmatch(dp->d_name, cs)
  1257.               THEN    addg(s,dp->d_name,rescan); count++;
  1258.               FI
  1259.  
  1260. --- 105,115 -----
  1261.           DO    IF *dp->d_name=='.' ANDF *cs!='.'
  1262.               THEN    continue;
  1263.               FI
  1264. + /*
  1265. +  *    Here lies the fix for the "echo * /." problem when
  1266. +  *    there are files with metacharacters in their names.
  1267. +  */
  1268. +             chgquot(dp->d_name, 1);
  1269.               IF gmatch(dp->d_name, cs)
  1270.               THEN    addg(s,dp->d_name,rescan); count++;
  1271.               FI
  1272. ***************
  1273. *** 89,94
  1274.               IF gmatch(dp->d_name, cs)
  1275.               THEN    addg(s,dp->d_name,rescan); count++;
  1276.               FI
  1277.           OD
  1278.           closedir(dirf); trapjmp[INTR] = 0;
  1279.   
  1280.  
  1281. --- 113,119 -----
  1282.               IF gmatch(dp->d_name, cs)
  1283.               THEN    addg(s,dp->d_name,rescan); count++;
  1284.               FI
  1285. +             chgquot(dp->d_name, 0);
  1286.           OD
  1287.           closedir(dirf);
  1288.   
  1289. ***************
  1290. *** 90,96
  1291.               THEN    addg(s,dp->d_name,rescan); count++;
  1292.               FI
  1293.           OD
  1294. !         closedir(dirf); trapjmp[INTR] = 0;
  1295.   
  1296.           IF rescan
  1297.           THEN    REG ARGPTR    rchain;
  1298.  
  1299. --- 115,121 -----
  1300.               FI
  1301.               chgquot(dp->d_name, 0);
  1302.           OD
  1303. !         closedir(dirf);
  1304.   
  1305.           IF rescan
  1306.           THEN    REG ARGPTR    rchain;
  1307. ***************
  1308. *** 129,135
  1309.       SWITCH c = *p++ IN
  1310.   
  1311.           case '[':
  1312. !         {BOOL ok; INT lc;
  1313.           ok=0; lc=077777;
  1314.           WHILE c = *p++
  1315.           DO    IF c==']'
  1316.  
  1317. --- 154,160 -----
  1318.       SWITCH c = *p++ IN
  1319.   
  1320.           case '[':
  1321. !         {BOOL ok; INT lc; INT notflag=0;
  1322.           ok=0; lc=077777;
  1323.           IF *p == '!' THEN notflag=1; p++; FI
  1324.           WHILE c = *p++
  1325. ***************
  1326. *** 131,136
  1327.           case '[':
  1328.           {BOOL ok; INT lc;
  1329.           ok=0; lc=077777;
  1330.           WHILE c = *p++
  1331.           DO    IF c==']'
  1332.               THEN    return(ok?gmatch(s,p):0);
  1333.  
  1334. --- 156,162 -----
  1335.           case '[':
  1336.           {BOOL ok; INT lc; INT notflag=0;
  1337.           ok=0; lc=077777;
  1338. +         IF *p == '!' THEN notflag=1; p++; FI
  1339.           WHILE c = *p++
  1340.           DO    IF c==']'
  1341.               THEN    return(ok?gmatch(s,p):0);
  1342. ***************
  1343. *** 135,142
  1344.           DO    IF c==']'
  1345.               THEN    return(ok?gmatch(s,p):0);
  1346.               ELIF c==MINUS
  1347. !             THEN    IF lc<=scc ANDF scc<=(*p++) THEN ok++ FI
  1348. !             ELSE    IF scc==(lc=(c&STRIP)) THEN ok++ FI
  1349.               FI
  1350.           OD
  1351.           return(0);
  1352.  
  1353. --- 161,180 -----
  1354.           DO    IF c==']'
  1355.               THEN    return(ok?gmatch(s,p):0);
  1356.               ELIF c==MINUS
  1357. !             THEN    IF notflag
  1358. !                 THEN    IF lc>scc ORF scc>*(p++)
  1359. !                     THEN ok++;
  1360. !                     ELSE return(0)
  1361. !                     FI
  1362. !                 ELSE IF lc<=scc ANDF scc<=(*p++) THEN ok++ FI
  1363. !                 FI
  1364. !             ELSE    IF notflag
  1365. !                 THEN    IF scc!=(lc=(c&STRIP))
  1366. !                     THEN ok++;
  1367. !                     ELSE return(0)
  1368. !                     FI
  1369. !                 ELSE IF scc==(lc=(c&STRIP)) THEN ok++ FI
  1370. !                 FI
  1371.               FI
  1372.           OD
  1373.           return(0);
  1374. ***************
  1375. *** 192,194
  1376.       gchain=args;
  1377.   }
  1378.   
  1379.  
  1380. --- 230,258 -----
  1381.       gchain=args;
  1382.   }
  1383.   
  1384. + chgquot(str, flg)
  1385. + REG STRING    str;
  1386. + REG INT        flg;
  1387. + {
  1388. +     REG INT i;
  1389. +     FOR i = 0 ; ; i++
  1390. +     DO
  1391. +         SWITCH str[i] IN
  1392. +         case '\0':
  1393. +             return;
  1394. +         case '*':
  1395. +         case '?':
  1396. +         case '[':
  1397. +         case '*'|0200:
  1398. +         case '?'|0200:
  1399. +         case '['|0200:
  1400. +             IF flg==0
  1401. +             THEN
  1402. +                 str[i] &= (~QUOTE);
  1403. +             ELSE
  1404. +                 str[i] |= QUOTE;
  1405. +             FI
  1406. +         ENDSW
  1407. +     OD
  1408. + }
  1409. :::::::: fault.c :::::::
  1410. *** ../orig.u/fault.c    Wed May 15 17:13:44 1985
  1411. --- fault.c    Tue Jun  4 13:44:16 1985
  1412. ***************
  1413. *** 15,22
  1414.   
  1415.   
  1416.   STRING        trapcom[MAXTRAP];
  1417. ! BOOL        trapflg[MAXTRAP];
  1418. ! BOOL        trapjmp[MAXTRAP];
  1419.   
  1420.   /* ========    fault handling routines       ======== */
  1421.   
  1422.  
  1423. --- 15,42 -----
  1424.   
  1425.   
  1426.   STRING        trapcom[MAXTRAP];
  1427. ! BOOL    trapflg[MAXTRAP] = {
  1428. !                 0,
  1429. !                 SIGCAUGHT,    /* hangup */
  1430. !                 SIGCAUGHT,    /* interrupt */
  1431. !                 SIGCAUGHT,    /* quit */
  1432. !                 0,        /* illegal instr */
  1433. !                 0,        /* trace trap */
  1434. !                 0,        /* IOT */
  1435. !                 0,        /* EMT */
  1436. !                 0,        /* float pt. exp */
  1437. !                 0,        /* kill */
  1438. !                 0,        /* bus error */
  1439. !                 0,        /* memory faults */
  1440. !                 0,        /* bad sys call */
  1441. !                 0,        /* bad pipe call */
  1442. !                 SIGCAUGHT,    /* alarm */
  1443. !                 SIGCAUGHT,    /* software termination */
  1444. !                 0,        /* unassigned */
  1445. !                 0,        /* unassigned */
  1446. !                 0,        /* death of a child */
  1447. !                 0,        /* power fail */
  1448. !                 };
  1449.   
  1450.   /* ========    fault handling routines       ======== */
  1451.   
  1452. ***************
  1453. *** 26,31
  1454.   {
  1455.       REG INT        flag;
  1456.   
  1457.       IF sig==MEMF
  1458.       THEN    IF setbrk(brkincr) == -1
  1459.           THEN    error(nospace);
  1460.  
  1461. --- 46,52 -----
  1462.   {
  1463.       REG INT        flag;
  1464.   
  1465. +     signal(sig, fault);
  1466.       IF sig==MEMF
  1467.       THEN    IF setbrk(brkincr) == -1
  1468.           THEN    error(nospace);
  1469. ***************
  1470. *** 32,38
  1471.           FI
  1472.       ELIF sig==ALARM
  1473.       THEN    IF flags&waiting
  1474. !         THEN    done();
  1475.           FI
  1476.       ELSE    flag = (trapcom[sig] ? TRAPSET : SIGSET);
  1477.           trapnote |= flag;
  1478.  
  1479. --- 53,59 -----
  1480.           FI
  1481.       ELIF sig==ALARM
  1482.       THEN    IF flags&waiting
  1483. !         THEN    newline(); done();
  1484.           FI
  1485.       ELSE    flag = (trapcom[sig] ? TRAPSET : SIGSET);
  1486.           trapnote |= flag;
  1487. ***************
  1488. *** 37,42
  1489.       ELSE    flag = (trapcom[sig] ? TRAPSET : SIGSET);
  1490.           trapnote |= flag;
  1491.           trapflg[sig] |= flag;
  1492.       FI
  1493.       IF trapjmp[sig] ANDF sig==INTR
  1494.       THEN
  1495.  
  1496. --- 58,64 -----
  1497.       ELSE    flag = (trapcom[sig] ? TRAPSET : SIGSET);
  1498.           trapnote |= flag;
  1499.           trapflg[sig] |= flag;
  1500. +         IF sig == INTR THEN wasintr++; FI
  1501.       FI
  1502.   }
  1503.   
  1504. ***************
  1505. *** 38,48
  1506.           trapnote |= flag;
  1507.           trapflg[sig] |= flag;
  1508.       FI
  1509. -     IF trapjmp[sig] ANDF sig==INTR
  1510. -     THEN
  1511. -         trapjmp[sig] = 0;
  1512. -         longjmp(INTbuf, 1);
  1513. -     FI
  1514.   }
  1515.   
  1516.   stdsigs()
  1517.  
  1518. --- 60,65 -----
  1519.           trapflg[sig] |= flag;
  1520.           IF sig == INTR THEN wasintr++; FI
  1521.       FI
  1522.   }
  1523.   
  1524.   stdsigs()
  1525. ***************
  1526. *** 47,52
  1527.   
  1528.   stdsigs()
  1529.   {
  1530.       ignsig(QUIT);
  1531.       getsig(INTR);
  1532.       getsig(MEMF);
  1533.  
  1534. --- 64,70 -----
  1535.   
  1536.   stdsigs()
  1537.   {
  1538. +     signal(MEMF, fault);
  1539.       ignsig(QUIT);
  1540.       getsig(INTR);
  1541.       getsig(ALARM);
  1542. ***************
  1543. *** 49,55
  1544.   {
  1545.       ignsig(QUIT);
  1546.       getsig(INTR);
  1547. -     getsig(MEMF);
  1548.       getsig(ALARM);
  1549.   }
  1550.   
  1551.  
  1552. --- 67,72 -----
  1553.       signal(MEMF, fault);
  1554.       ignsig(QUIT);
  1555.       getsig(INTR);
  1556.       getsig(ALARM);
  1557.   }
  1558.   
  1559. ***************
  1560. *** 57,63
  1561.   {
  1562.       REG INT        s, i;
  1563.   
  1564. !     IF (s=signal(i=n,1)&01)==0
  1565.       THEN    trapflg[i] |= SIGMOD;
  1566.       FI
  1567.       return(s);
  1568.  
  1569. --- 74,83 -----
  1570.   {
  1571.       REG INT        s, i;
  1572.   
  1573. !     IF (i=n)==MEMF
  1574. !     THEN    clrsig(i);
  1575. !         failed(badtrap, "cannot trap 11");
  1576. !     ELIF (s=signal(i,1)&01)==0
  1577.       THEN    trapflg[i] |= SIGMOD;
  1578.       FI
  1579.       return(s);
  1580. ***************
  1581. *** 93,99
  1582.   {
  1583.       free(trapcom[i]); trapcom[i]=0;
  1584.       IF trapflg[i]&SIGMOD
  1585. !     THEN    signal(i,fault);
  1586.           trapflg[i] &= ~SIGMOD;
  1587.       FI
  1588.   }
  1589.  
  1590. --- 113,122 -----
  1591.   {
  1592.       free(trapcom[i]); trapcom[i]=0;
  1593.       IF trapflg[i]&SIGMOD
  1594. !     THEN    IF trapflg[i]&SIGCAUGHT
  1595. !         THEN signal(i,fault);
  1596. !         ELSE signal(i,0);
  1597. !         FI
  1598.           trapflg[i] &= ~SIGMOD;
  1599.       FI
  1600.   }
  1601. :::::::: io.c :::::::
  1602. *** ../orig.u/io.c    Wed May 15 17:13:45 1985
  1603. --- io.c    Mon Jun  3 17:03:11 1985
  1604. ***************
  1605. *** 22,28
  1606.   {
  1607.       REG FILE    f=standin;
  1608.   
  1609. !     f->fdes=fd; f->fsiz=((flags&(oneflg|ttyflg))==0 ? BUFSIZ : 1);
  1610.       f->fnxt=f->fend=f->fbuf; f->feval=0; f->flin=1;
  1611.       f->feof=FALSE;
  1612.   }
  1613.  
  1614. --- 22,28 -----
  1615.   {
  1616.       REG FILE    f=standin;
  1617.   
  1618. !     f->fdes=fd; f->fsiz=((flags&oneflg)==0 ? BUFSIZ : 1);
  1619.       f->fnxt=f->fend=f->fbuf; f->feval=0; f->flin=1;
  1620.       f->feof=FALSE;
  1621.   }
  1622. ***************
  1623. *** 60,65
  1624.       FI
  1625.   }
  1626.   
  1627.   chkpipe(pv)
  1628.       INT        *pv;
  1629.   {
  1630.  
  1631. --- 60,86 -----
  1632.       FI
  1633.   }
  1634.   
  1635. + TEMPBPTR    tmpfptr;
  1636. + pushtemp(fd, tb)
  1637. +     UFD    fd;
  1638. +     TEMPBPTR    tb;
  1639. + {
  1640. +     tb->fdes = fd;
  1641. +     tb->fstak = tmpfptr;
  1642. +     tmpfptr = tb;
  1643. + }
  1644. + poptemp()
  1645. + {
  1646. +     IF tmpfptr
  1647. +     THEN    close(tmpfptr->fdes);
  1648. +         tmpfptr = tmpfptr->fstak;
  1649. +         return(TRUE);
  1650. +     ELSE    return (FALSE);
  1651. +     FI
  1652. + }
  1653.   chkpipe(pv)
  1654.       INT        *pv;
  1655.   {
  1656. ***************
  1657. *** 100,106
  1658.       FI
  1659.   }
  1660.   
  1661. ! tmpfil()
  1662.   {
  1663.       itos(serial++); movstr(numbuf,tmpnam);
  1664.       return(create(tmpout));
  1665.  
  1666. --- 121,128 -----
  1667.       FI
  1668.   }
  1669.   
  1670. ! tmpfil(tb)
  1671. !     TEMPBPTR tb;
  1672.   {
  1673.       INT fd;
  1674.   
  1675. ***************
  1676. *** 102,107
  1677.   
  1678.   tmpfil()
  1679.   {
  1680.       itos(serial++); movstr(numbuf,tmpnam);
  1681.       return(create(tmpout));
  1682.   }
  1683.  
  1684. --- 124,131 -----
  1685.   tmpfil(tb)
  1686.       TEMPBPTR tb;
  1687.   {
  1688. +     INT fd;
  1689.       itos(serial++); movstr(numbuf,tmpnam);
  1690.       fd = create(tmpout);
  1691.       pushtemp(fd, tb);
  1692. ***************
  1693. *** 103,109
  1694.   tmpfil()
  1695.   {
  1696.       itos(serial++); movstr(numbuf,tmpnam);
  1697. !     return(create(tmpout));
  1698.   }
  1699.   
  1700.   /* set by trim */
  1701.  
  1702. --- 127,135 -----
  1703.       INT fd;
  1704.   
  1705.       itos(serial++); movstr(numbuf,tmpnam);
  1706. !     fd = create(tmpout);
  1707. !     pushtemp(fd, tb);
  1708. !     return (fd);
  1709.   }
  1710.   
  1711.   /* set by trim */
  1712. ***************
  1713. *** 118,124
  1714.       REG IOPTR    iop;
  1715.   
  1716.       IF iop=ioparg
  1717. !     THEN    copy(iop->iolst);
  1718.           ends=mactrim(iop->ioname); IF nosubst THEN iop->iofile &= ~IODOC FI
  1719.           fd=tmpfil();
  1720.           iop->ioname=cpystak(tmpout);
  1721.  
  1722. --- 144,151 -----
  1723.       REG IOPTR    iop;
  1724.   
  1725.       IF iop=ioparg
  1726. !     THEN    TEMPBLK    tb;
  1727. !         copy(iop->iolst);
  1728.           ends=mactrim(iop->ioname); IF nosubst THEN iop->iofile &= ~IODOC FI
  1729.           fd=tmpfil(&tb);
  1730.           iop->ioname=cpystak(tmpout);
  1731. ***************
  1732. *** 120,126
  1733.       IF iop=ioparg
  1734.       THEN    copy(iop->iolst);
  1735.           ends=mactrim(iop->ioname); IF nosubst THEN iop->iofile &= ~IODOC FI
  1736. !         fd=tmpfil();
  1737.           iop->ioname=cpystak(tmpout);
  1738.           iop->iolst=iotemp; iotemp=iop;
  1739.           cline=locstak();
  1740.  
  1741. --- 147,153 -----
  1742.       THEN    TEMPBLK    tb;
  1743.           copy(iop->iolst);
  1744.           ends=mactrim(iop->ioname); IF nosubst THEN iop->iofile &= ~IODOC FI
  1745. !         fd=tmpfil(&tb);
  1746.           iop->ioname=cpystak(tmpout);
  1747.           iop->iolst=iotemp; iotemp=iop;
  1748.           cline=locstak();
  1749. ***************
  1750. *** 125,130
  1751.           iop->iolst=iotemp; iotemp=iop;
  1752.           cline=locstak();
  1753.   
  1754.           LOOP    clinep=cline; chkpr(NL);
  1755.               WHILE (c = (nosubst ? readc() :  nextc(*ends)),  !eolchar(c)) DO *clinep++ = c OD
  1756.               *clinep=0;
  1757.  
  1758. --- 152,160 -----
  1759.           iop->iolst=iotemp; iotemp=iop;
  1760.           cline=locstak();
  1761.   
  1762. +         IF stripflg
  1763. +         THEN    WHILE *ends=='\t' DO ends++ OD
  1764. +         FI
  1765.           LOOP    clinep=cline; chkpr(NL);
  1766.               IF stripflg
  1767.               THEN
  1768. ***************
  1769. *** 126,132
  1770.           cline=locstak();
  1771.   
  1772.           LOOP    clinep=cline; chkpr(NL);
  1773. !             WHILE (c = (nosubst ? readc() :  nextc(*ends)),  !eolchar(c)) DO *clinep++ = c OD
  1774.               *clinep=0;
  1775.               IF eof ORF eq(cline,ends) THEN break FI
  1776.               *clinep++=NL;
  1777.  
  1778. --- 156,172 -----
  1779.           THEN    WHILE *ends=='\t' DO ends++ OD
  1780.           FI
  1781.           LOOP    clinep=cline; chkpr(NL);
  1782. !             IF stripflg
  1783. !             THEN
  1784. !                 WHILE (c=(nosubst ? readc() : nextc(*ends)), !eolchar(c))
  1785. !                 && cline == clinep && c == '\t' DONE
  1786. !                 WHILE (!eolchar(c))
  1787. !                 DO
  1788. !                     *clinep++=c;
  1789. !                     c=(nosubst ? readc() : nextc(*ends));
  1790. !                 OD
  1791. !             ELSE WHILE (c = (nosubst ? readc() :  nextc(*ends)),  !eolchar(c)) DO *clinep++ = c OD
  1792. !             FI
  1793.               *clinep=0;
  1794.               IF eof ORF eq(cline,ends) THEN break FI
  1795.               *clinep++=NL;
  1796. ***************
  1797. *** 132,137
  1798.               *clinep++=NL;
  1799.               write(fd,cline,clinep-cline);
  1800.           POOL
  1801. !         close(fd);
  1802.       FI
  1803.   }
  1804.  
  1805. --- 172,179 -----
  1806.               *clinep++=NL;
  1807.               write(fd,cline,clinep-cline);
  1808.           POOL
  1809. !         IF stripflg THEN stripflg-- FI
  1810. !         poptemp();    /* pushed in tmpfil -- bug fix for problem
  1811. !                    deleting in-line scripts */
  1812.       FI
  1813.   }
  1814. :::::::: mac.h :::::::
  1815. *** ../orig.u/mac.h    Wed May 15 17:13:45 1985
  1816. --- mac.h    Thu May 30 16:54:52 1985
  1817. ***************
  1818. *** 59,63
  1819.   #define RQ    '\''
  1820.   #define MINUS    '-'
  1821.   #define COLON    ':'
  1822.   
  1823.   #define MAX(a,b)    ((a)>(b)?(a):(b))
  1824.  
  1825. --- 59,64 -----
  1826.   #define RQ    '\''
  1827.   #define MINUS    '-'
  1828.   #define COLON    ':'
  1829. + #define SQUIGGLE    '~'    /* BSD tty driver defines TILDE */
  1830.   
  1831.   #define MAX(a,b)    ((a)>(b)?(a):(b))
  1832. :::::::: macro.c :::::::
  1833. *** ../orig.u/macro.c    Wed May 15 17:13:45 1985
  1834. --- macro.c    Tue Jun  4 10:25:36 1985
  1835. ***************
  1836. *** 60,65
  1837.       IF !subchar(d)
  1838.       THEN    return(d);
  1839.       FI
  1840.       IF d==DOLLAR
  1841.       THEN    REG INT    c;
  1842.           IF (c=readc(), dolchar(c))
  1843.  
  1844. --- 60,79 -----
  1845.       IF !subchar(d)
  1846.       THEN    return(d);
  1847.       FI
  1848. + #if JOBS
  1849. +     IF d==PERCENT ANDF (flags&jobflg)
  1850. +     THEN    REG INT c;
  1851. +         IF (peekc = (c=readc())|MARK, digchar(c) ORF c==PERCENT)
  1852. +         THEN    REG STRING v;
  1853. +             IF v=j_macro()    /* %number or %% handled */
  1854. +             THEN    WHILE c = *v++ DO pushstak(c|quote); OD
  1855. +             /* else expands to nothingness */
  1856. +             FI
  1857. +             goto retry;
  1858. +         FI
  1859. +     ELIF d==DOLLAR
  1860. + #else
  1861.       IF d==DOLLAR
  1862.   #endif
  1863.       THEN    REG INT    c;
  1864. ***************
  1865. *** 61,66
  1866.       THEN    return(d);
  1867.       FI
  1868.       IF d==DOLLAR
  1869.       THEN    REG INT    c;
  1870.           IF (c=readc(), dolchar(c))
  1871.           THEN    NAMPTR        n=NIL;
  1872.  
  1873. --- 75,81 -----
  1874.       ELIF d==DOLLAR
  1875.   #else
  1876.       IF d==DOLLAR
  1877. + #endif
  1878.       THEN    REG INT    c;
  1879.           IF (c=readc(), dolchar(c))
  1880.           THEN    NAMPTR        n=NIL;
  1881. ***************
  1882. *** 66,71
  1883.           THEN    NAMPTR        n=NIL;
  1884.               INT        dolg=0;
  1885.               BOOL        bra;
  1886.               REG STRING    argp, v;
  1887.               CHAR        idb[2];
  1888.               STRING        id=idb;
  1889.  
  1890. --- 81,87 -----
  1891.           THEN    NAMPTR        n=NIL;
  1892.               INT        dolg=0;
  1893.               BOOL        bra;
  1894. +             BOOL        nulflg;
  1895.               REG STRING    argp, v;
  1896.               CHAR        idb[2];
  1897.               STRING        id=idb;
  1898. ***************
  1899. *** 87,92
  1900.                   v=((c==0) ? cmdadr : (c<=dolc) ? dolv[c] : (dolg=0));
  1901.               ELIF c=='$'
  1902.               THEN    v=pidadr;
  1903.               ELIF c=='!'
  1904.               THEN    v=pcsadr;
  1905.               ELIF c=='#'
  1906.  
  1907. --- 103,114 -----
  1908.                   v=((c==0) ? cmdadr : (c<=dolc) ? dolv[c] : (dolg=0));
  1909.               ELIF c=='$'
  1910.               THEN    v=pidadr;
  1911. +             ELIF c=='+'
  1912. +             THEN    IF ppid != getppid()    /* parent died */
  1913. +                 THEN    ppid = getppid();
  1914. +                     assnum (&ppidadr, ppid);
  1915. +                 FI
  1916. +                 v = ppidadr;
  1917.               ELIF c=='!'
  1918.               THEN    v=pcsadr;
  1919.               ELIF c=='#'
  1920. ***************
  1921. *** 99,104
  1922.               ELSE    goto retry;
  1923.               FI
  1924.               c = readc();
  1925.               IF !defchar(c) ANDF bra
  1926.               THEN    error(badsub);
  1927.               FI
  1928.  
  1929. --- 121,130 -----
  1930.               ELSE    goto retry;
  1931.               FI
  1932.               c = readc();
  1933. +             IF c==':' ANDF bra    /* null and unset fix */
  1934. +             THEN    nulflg=1; c=readc();
  1935. +             ELSE    nulflg=0;
  1936. +             FI
  1937.               IF !defchar(c) ANDF bra
  1938.               THEN    error(badsub);
  1939.               FI
  1940. ***************
  1941. *** 106,112
  1942.               IF bra
  1943.               THEN    IF c!='}'
  1944.                   THEN    argp=relstak();
  1945. !                     IF (v==0)NEQ(setchar(c))
  1946.                       THEN    copyto('}');
  1947.                       ELSE    skipto('}');
  1948.                       FI
  1949.  
  1950. --- 132,138 -----
  1951.               IF bra
  1952.               THEN    IF c!='}'
  1953.                   THEN    argp=relstak();
  1954. !                     IF (v==0 ORF (nulflg ANDF *v==0))NEQ(setchar(c))
  1955.                       THEN    copyto('}');
  1956.                       ELSE    skipto('}');
  1957.                       FI
  1958. ***************
  1959. *** 114,120
  1960.                   FI
  1961.               ELSE    peekc = c|MARK; c = 0;
  1962.               FI
  1963. !             IF v
  1964.               THEN    IF c!='+'
  1965.                   THEN    LOOP WHILE c = *v++
  1966.                            DO pushstak(c|quote); OD
  1967.  
  1968. --- 140,146 -----
  1969.                   FI
  1970.               ELSE    peekc = c|MARK; c = 0;
  1971.               FI
  1972. !             IF v ANDF (!nulflg ORF *v)
  1973.               THEN    IF c!='+'
  1974.                   THEN    LOOP WHILE c = *v++
  1975.                            DO pushstak(c|quote); OD
  1976. ***************
  1977. *** 129,135
  1978.                   THEN    failed(id,*argp?argp:badparam);
  1979.                   ELIF c=='='
  1980.                   THEN    IF n
  1981. !                     THEN    assign(n,argp);
  1982.                       ELSE    error(badsub);
  1983.                       FI
  1984.                   FI
  1985.  
  1986. --- 155,162 -----
  1987.                   THEN    failed(id,*argp?argp:badparam);
  1988.                   ELIF c=='='
  1989.                   THEN    IF n
  1990. !                     THEN    trim(argp);
  1991. !                         assign(n,argp);
  1992.                       ELSE    error(badsub);
  1993.                       FI
  1994.                   FI
  1995. ***************
  1996. *** 185,190
  1997.          trim(argc=fixstak());
  1998.          push(&cb); estabf(argc);
  1999.       END
  2000.       BEGIN
  2001.          REG TREPTR    t = makefork(FPOU,cmd(EOFSYM,MTFLG|NLFLG));
  2002.          INT        pv[2];
  2003.  
  2004. --- 212,220 -----
  2005.          trim(argc=fixstak());
  2006.          push(&cb); estabf(argc);
  2007.       END
  2008. + #if JOBS
  2009. +     set_wfence();
  2010. + #endif
  2011.       BEGIN
  2012.          REG TREPTR    t = makefork(FPOU,cmd(EOFSYM,MTFLG|NLFLG));
  2013.          INT        pv[2];
  2014. ***************
  2015. *** 194,200
  2016.           */
  2017.          chkpipe(pv);
  2018.          initf(pv[INPIPE]);
  2019. !        execute(t, 0, 0, pv);
  2020.          close(pv[OTPIPE]);
  2021.       END
  2022.       tdystak(savptr); staktop=movstr(savptr,stakbot);
  2023.  
  2024. --- 224,230 -----
  2025.           */
  2026.          chkpipe(pv);
  2027.          initf(pv[INPIPE]);
  2028. !        execute(t, 0, flags & errflg, 0, pv);
  2029.          close(pv[OTPIPE]);
  2030.       END
  2031.       tdystak(savptr); staktop=movstr(savptr,stakbot);
  2032. ***************
  2033. *** 198,205
  2034.          close(pv[OTPIPE]);
  2035.       END
  2036.       tdystak(savptr); staktop=movstr(savptr,stakbot);
  2037. !     WHILE d=readc() DO locstak(); pushstak(d|quote) OD
  2038. !     await(0);
  2039.       WHILE stakbot!=staktop
  2040.       DO    IF (*--staktop&STRIP)!=NL
  2041.           THEN    ++staktop; break;
  2042.  
  2043. --- 228,235 -----
  2044.          close(pv[OTPIPE]);
  2045.       END
  2046.       tdystak(savptr); staktop=movstr(savptr,stakbot);
  2047. !     WHILE d=readc() DO pushstak(d|quote) OD
  2048. !     await(0, 0);
  2049.       WHILE stakbot!=staktop
  2050.       DO    IF (*--staktop&STRIP)!=NL
  2051.           THEN    ++staktop; break;
  2052. :::::::: main.c :::::::
  2053. *** ../orig.u/main.c    Wed May 15 17:13:45 1985
  2054. --- main.c    Tue Jun  4 14:32:21 1985
  2055. ***************
  2056. *** 24,29
  2057.   CHAR        tmpout[20] = "/tmp/sh-";
  2058.   FILEBLK        stdfile;
  2059.   FILE        standin = &stdfile;
  2060.   #ifdef stupid
  2061.   #include    <execargs.h>
  2062.   #endif
  2063.  
  2064. --- 24,30 -----
  2065.   CHAR        tmpout[20] = "/tmp/sh-";
  2066.   FILEBLK        stdfile;
  2067.   FILE        standin = &stdfile;
  2068. + BOOL        catcheof = FALSE;
  2069.   #ifdef stupid
  2070.   #include    <execargs.h>
  2071.   #endif
  2072. ***************
  2073. *** 33,39
  2074.   
  2075.   
  2076.   
  2077. ! main(c, v)
  2078.       INT        c;
  2079.       STRING        v[];
  2080.   {
  2081.  
  2082. --- 34,40 -----
  2083.   
  2084.   
  2085.   
  2086. ! main(c, v, e)
  2087.       INT        c;
  2088.       STRING        v[];
  2089.       STRING        e[];
  2090. ***************
  2091. *** 36,41
  2092.   main(c, v)
  2093.       INT        c;
  2094.       STRING        v[];
  2095.   {
  2096.       REG INT        rflag=ttyflg;
  2097.   
  2098.  
  2099. --- 37,43 -----
  2100.   main(c, v, e)
  2101.       INT        c;
  2102.       STRING        v[];
  2103. +     STRING        e[];
  2104.   {
  2105.       REG INT        rflag=ttyflg;
  2106.       STRING    sim;
  2107. ***************
  2108. *** 38,43
  2109.       STRING        v[];
  2110.   {
  2111.       REG INT        rflag=ttyflg;
  2112.   
  2113.       /* initialise storage allocation */
  2114.       stdsigs();
  2115.  
  2116. --- 40,46 -----
  2117.       STRING        e[];
  2118.   {
  2119.       REG INT        rflag=ttyflg;
  2120. +     STRING    sim;
  2121.   
  2122.       /* initialise storage allocation */
  2123.       stdsigs();
  2124. ***************
  2125. *** 58,63
  2126.       FI
  2127.       dolv=v+c-dolc; dolc--;
  2128.   
  2129.       /* return here for shell file execution */
  2130.       setjmp(subshell);
  2131.   
  2132.  
  2133. --- 61,84 -----
  2134.       FI
  2135.       dolv=v+c-dolc; dolc--;
  2136.   
  2137. + #if JOBS
  2138. +     j_default_pg = getpid();
  2139. +     j_original_pg = getpgrp();
  2140. +     /* enable job control if argv[0] has a 'j' in its simple name */
  2141. +     IF (flags & jobflg) == 0 ANDF c > 0 ANDF any('j', simple(*v))
  2142. +         ANDF comdiv == 0 ANDF flags & stdflg
  2143. +     THEN
  2144. +         STRING    pointer;
  2145. +         j_init();
  2146. +         flags |= jobflg;
  2147. +         pointer = flagadr;
  2148. +         WHILE *pointer DO pointer++; OD
  2149. +         *pointer++ = 'J'; *pointer = 0;
  2150. +     FI
  2151. + #endif
  2152.       /* return here for shell file execution */
  2153.       /* but not for parenthesis subshells    */
  2154.       setjmp(subshell);
  2155. ***************
  2156. *** 59,64
  2157.       dolv=v+c-dolc; dolc--;
  2158.   
  2159.       /* return here for shell file execution */
  2160.       setjmp(subshell);
  2161.   
  2162.       /* number of positional parameters */
  2163.  
  2164. --- 80,86 -----
  2165.   #endif
  2166.   
  2167.       /* return here for shell file execution */
  2168. +     /* but not for parenthesis subshells    */
  2169.       setjmp(subshell);
  2170.   
  2171.       /* number of positional parameters */
  2172. ***************
  2173. *** 63,69
  2174.   
  2175.       /* number of positional parameters */
  2176.       assnum(&dolladr,dolc);
  2177. !     cmdadr=dolv[0];
  2178.   
  2179.       /* set pidname */
  2180.       assnum(&pidadr, getpid());
  2181.  
  2182. --- 85,91 -----
  2183.   
  2184.       /* number of positional parameters */
  2185.       assnum(&dolladr,dolc);
  2186. !     cmdadr=dolv[0];    /* cmdadr is $0 */
  2187.   
  2188.       /* set pidname */
  2189.       assnum(&pidadr, getpid());
  2190. ***************
  2191. *** 68,73
  2192.       /* set pidname */
  2193.       assnum(&pidadr, getpid());
  2194.   
  2195.       /* set up temp file names */
  2196.       settmp();
  2197.   
  2198.  
  2199. --- 90,99 -----
  2200.       /* set pidname */
  2201.       assnum(&pidadr, getpid());
  2202.   
  2203. +     /* set ppidname */
  2204. +     ppid = getppid();
  2205. +     assnum(&ppidadr, ppid);
  2206.       /* set up temp file names */
  2207.       settmp();
  2208.   
  2209. ***************
  2210. *** 74,80
  2211.       /* default ifs */
  2212.       dfault(&ifsnod, sptbnl);
  2213.   
  2214. !     IF (beenhere++)==FALSE
  2215.       THEN    /* ? profile */
  2216.           IF *cmdadr=='-'
  2217.               ANDF (input=pathopen(nullstr, profile))>=0
  2218.  
  2219. --- 100,129 -----
  2220.       /* default ifs */
  2221.       dfault(&ifsnod, sptbnl);
  2222.   
  2223. ! #if pyr
  2224. !     /* find out current universe, initialize $UNIVERSE */
  2225. !     cur_univ = setuniverse (U_UCB);    /* retrieve old and set to UCB */
  2226. !     IF cur_univ == -1
  2227. !     THEN    /* unknown current default to UCB */
  2228. !         cur_univ = U_UCB;
  2229. !         setuniverse (U_UCB);
  2230. !     ELIF cur_univ != U_UCB
  2231. !     THEN    setuniverse (cur_univ);    /* restore to what it was */
  2232. !     FI
  2233. !     /* force value of UNIVERSE, ignore environment */
  2234. !     univnod.namflg &= ~N_RDONLY;    /* for subshells ... */
  2235. !     assign (&univnod, univ_name[cur_univ - 1]);
  2236. !     attrib ((&univnod), N_RDONLY);
  2237. ! #endif
  2238. !     /* assign default value to HISTFILE */
  2239. !     (VOID) catpath("~", savehist);
  2240. !     dfault (& histfnod, curstak());
  2241. !     event_count = 1;
  2242. !     IF beenhere==FALSE
  2243.       THEN    /* ? profile */
  2244.           beenhere++;    /* DAG -- only increment once */
  2245.           IF *(sim = simple(cmdadr))=='-'
  2246. ***************
  2247. *** 76,83
  2248.   
  2249.       IF (beenhere++)==FALSE
  2250.       THEN    /* ? profile */
  2251. !         IF *cmdadr=='-'
  2252. !             ANDF (input=pathopen(nullstr, profile))>=0
  2253.           THEN    exfile(rflag); flags &= ~ttyflg;
  2254.           FI
  2255.           IF rflag==0 THEN flags |= rshflg FI
  2256.  
  2257. --- 125,139 -----
  2258.   
  2259.       IF beenhere==FALSE
  2260.       THEN    /* ? profile */
  2261. !         beenhere++;    /* DAG -- only increment once */
  2262. !         IF *(sim = simple(cmdadr))=='-'
  2263. !         THEN    IF getuid() != geteuid() THEN setuid(getuid()) FI
  2264. !             IF getgid() != getegid() THEN setgid(getgid()) FI
  2265. !         FI
  2266. !         /* to read /etc/profile, add code here */
  2267. !         IF *sim=='-' ANDF (input=pathopen(nullstr, profile))>=0
  2268.           THEN    exfile(rflag); flags &= ~ttyflg;
  2269.           FI
  2270.           IF rflag==0 THEN flags |= rshflg FI
  2271. ***************
  2272. *** 82,87
  2273.           FI
  2274.           IF rflag==0 THEN flags |= rshflg FI
  2275.   
  2276.           /* open input file if specified */
  2277.           IF comdiv
  2278.           THEN    estabf(comdiv); input = -1;
  2279.  
  2280. --- 138,156 -----
  2281.           FI
  2282.           IF rflag==0 THEN flags |= rshflg FI
  2283.   
  2284. +         /* if all OK, process $HOME/.shrc */
  2285. +         IF geteuid() == getuid() ANDF getegid() == getgid()
  2286. +             ANDF (flags&(rshflg|quickflg)) == 0
  2287. +             ANDF (input = pathopen("~", shrc)) >= 0
  2288. +         THEN
  2289. +             INT promptflags = (flags & (ttyflg|intflg|prompt));
  2290. +             /* turn off anything that will cause prompting */
  2291. +             flags &= ~promptflags;
  2292. +             exfile(rflag);
  2293. +             flags |= promptflags;
  2294. +         FI
  2295.           /* open input file if specified */
  2296.           IF comdiv
  2297.           THEN    estabf(comdiv); input = -1;
  2298. ***************
  2299. *** 119,125
  2300.       userid=getuid();
  2301.   
  2302.       /* decide whether interactive */
  2303. !     IF (flags&intflg) ORF ((flags&oneflg)==0 ANDF gtty(output,&statb)==0 ANDF gtty(input,&statb)==0)
  2304.       THEN    dfault(&ps1nod, (userid?stdprompt:supprompt));
  2305.           dfault(&ps2nod, readmsg);
  2306.           flags |= ttyflg|prompt; ignsig(KILL);
  2307.  
  2308. --- 188,194 -----
  2309.       userid=getuid();
  2310.   
  2311.       /* decide whether interactive */
  2312. !     IF (flags&intflg) ORF ((flags&oneflg)==0 ANDF isatty(output) ANDF isatty(input))
  2313.       THEN    dfault(&ps1nod, (userid?stdprompt:supprompt));
  2314.           dfault(&ps2nod, readmsg);
  2315.           flags |= ttyflg|prompt; ignsig(KILL);
  2316. ***************
  2317. *** 123,136
  2318.       THEN    dfault(&ps1nod, (userid?stdprompt:supprompt));
  2319.           dfault(&ps2nod, readmsg);
  2320.           flags |= ttyflg|prompt; ignsig(KILL);
  2321. ! /*
  2322. !         {
  2323. !     #include <signal.h>
  2324. !         signal(SIGTTIN, SIG_IGN);
  2325. !         signal(SIGTTOU, SIG_IGN);
  2326. !         signal(SIGTSTP, SIG_IGN);
  2327. !         }
  2328. ! */
  2329.       ELSE    flags |= prof; flags &= ~prompt;
  2330.       FI
  2331.   
  2332.  
  2333. --- 192,199 -----
  2334.       THEN    dfault(&ps1nod, (userid?stdprompt:supprompt));
  2335.           dfault(&ps2nod, readmsg);
  2336.           flags |= ttyflg|prompt; ignsig(KILL);
  2337. !         /* restore previous history */
  2338. !         histrest (histfnod.namval);
  2339.       ELSE    flags |= prof; flags &= ~prompt;
  2340.       FI
  2341.   
  2342. ***************
  2343. *** 148,157
  2344.           exitset();
  2345.           IF (flags&prompt) ANDF standin->fstak==0 ANDF !eof
  2346.           THEN    IF mailnod.namval
  2347. !                 ANDF stat(mailnod.namval,&statb)>=0 ANDF statb.st_size
  2348. !                 ANDF (statb.st_mtime != mailtime)
  2349. !                 ANDF mailtime
  2350. !             THEN    prs(mailmsg)
  2351.               FI
  2352.               mailtime=statb.st_mtime;
  2353.               prs(ps1nod.namval);
  2354.  
  2355. --- 211,225 -----
  2356.           exitset();
  2357.           IF (flags&prompt) ANDF standin->fstak==0 ANDF !eof
  2358.           THEN    IF mailnod.namval
  2359. !                 ANDF *mailnod.namval
  2360. !             THEN IF stat(mailnod.namval,&statb)>=0 ANDF statb.st_size
  2361. !                     ANDF mailtime
  2362. !                     ANDF (statb.st_mtime != mailtime)
  2363. !                 THEN    prs(mailmsg)
  2364. !                 FI
  2365. !                 mailtime=statb.st_mtime;
  2366. !             ELIF mailtime==0
  2367. !             THEN mailtime=1
  2368.               FI
  2369.               pr_prompt(ps1nod.namval);
  2370.               IF userid==0 ANDF !eq(ps1nod.namval, supprompt)
  2371. ***************
  2372. *** 153,160
  2373.                   ANDF mailtime
  2374.               THEN    prs(mailmsg)
  2375.               FI
  2376. !             mailtime=statb.st_mtime;
  2377. !             prs(ps1nod.namval);
  2378.           FI
  2379.   
  2380.           trapnote=0; peekc=readc();
  2381.  
  2382. --- 221,230 -----
  2383.               ELIF mailtime==0
  2384.               THEN mailtime=1
  2385.               FI
  2386. !             pr_prompt(ps1nod.namval);
  2387. !             IF userid==0 ANDF !eq(ps1nod.namval, supprompt)
  2388. !             THEN    prs(supprompt);
  2389. !             FI
  2390.           FI
  2391.   
  2392.           catcheof = TRUE;
  2393. ***************
  2394. *** 157,162
  2395.               prs(ps1nod.namval);
  2396.           FI
  2397.   
  2398.           trapnote=0; peekc=readc();
  2399.           IF eof
  2400.           THEN    return;
  2401.  
  2402. --- 227,233 -----
  2403.               FI
  2404.           FI
  2405.   
  2406. +         catcheof = TRUE;
  2407.           trapnote=0; peekc=readc();
  2408.           catcheof = FALSE;
  2409.           IF eof
  2410. ***************
  2411. *** 158,163
  2412.           FI
  2413.   
  2414.           trapnote=0; peekc=readc();
  2415.           IF eof
  2416.           THEN    return;
  2417.           FI
  2418.  
  2419. --- 229,235 -----
  2420.   
  2421.           catcheof = TRUE;
  2422.           trapnote=0; peekc=readc();
  2423. +         catcheof = FALSE;
  2424.           IF eof
  2425.           THEN    return;
  2426.           FI
  2427. ***************
  2428. *** 161,167
  2429.           IF eof
  2430.           THEN    return;
  2431.           FI
  2432. !         execute(cmd(NL,MTFLG),0);
  2433.           eof |= (flags&oneflg);
  2434.       POOL
  2435.   }
  2436.  
  2437. --- 233,239 -----
  2438.           IF eof
  2439.           THEN    return;
  2440.           FI
  2441. !         execute(cmd(NL,MTFLG),0, eflag);
  2442.           eof |= (flags&oneflg);
  2443.       POOL
  2444.   }
  2445. :::::::: mode.h :::::::
  2446. *** ../orig.u/mode.h    Wed May 15 17:13:45 1985
  2447. --- mode.h    Thu May 30 17:59:10 1985
  2448. ***************
  2449. *** 26,31
  2450.   STRUCT stat    STATBUF;    /* defined in /usr/sys/stat.h */
  2451.   STRUCT blk    *BLKPTR;
  2452.   STRUCT fileblk    FILEBLK;
  2453.   STRUCT filehdr    FILEHDR;
  2454.   STRUCT fileblk    *FILE;
  2455.   STRUCT trenod    *TREPTR;
  2456.  
  2457. --- 26,33 -----
  2458.   STRUCT stat    STATBUF;    /* defined in /usr/sys/stat.h */
  2459.   STRUCT blk    *BLKPTR;
  2460.   STRUCT fileblk    FILEBLK;
  2461. + STRUCT tempblk    TEMPBLK;
  2462. + STRUCT tempblk    *TEMPBPTR;
  2463.   STRUCT filehdr    FILEHDR;
  2464.   STRUCT fileblk    *FILE;
  2465.   STRUCT trenod    *TREPTR;
  2466. ***************
  2467. *** 96,101
  2468.       STRING    *feval;
  2469.       FILE    fstak;
  2470.       CHAR    fbuf[BUFSIZ];
  2471.   };
  2472.   
  2473.   /* for files not used with file descriptors */
  2474.  
  2475. --- 98,108 -----
  2476.       STRING    *feval;
  2477.       FILE    fstak;
  2478.       CHAR    fbuf[BUFSIZ];
  2479. + };
  2480. + struct tempblk {
  2481. +     UFD    fdes;
  2482. +     struct    tempblk *fstak;
  2483.   };
  2484.   
  2485.   /* for files not used with file descriptors */
  2486. :::::::: msg.c :::::::
  2487. *** ../orig.u/msg.c    Wed May 15 17:13:45 1985
  2488. --- msg.c    Tue Jun  4 18:01:36 1985
  2489. ***************
  2490. *** 15,20
  2491.   #include    "defs.h"
  2492.   #include    "sym.h"
  2493.   
  2494.   MSG        version = "\nVERSION sys137    DATE 1978 Nov 6 14:29:22\n";
  2495.   
  2496.   /* error messages */
  2497.  
  2498. --- 15,23 -----
  2499.   #include    "defs.h"
  2500.   #include    "sym.h"
  2501.   
  2502. + #if JOBS
  2503. + MSG    version = "@(#)Bourne shell, BRL + GT mods\t30-May-1985";
  2504. + #else
  2505.   MSG        version = "\nVERSION sys137    DATE 1978 Nov 6 14:29:22\n";
  2506.   #endif
  2507.   
  2508. ***************
  2509. *** 16,21
  2510.   #include    "sym.h"
  2511.   
  2512.   MSG        version = "\nVERSION sys137    DATE 1978 Nov 6 14:29:22\n";
  2513.   
  2514.   /* error messages */
  2515.   MSG    badopt        = "bad option(s)";
  2516.  
  2517. --- 19,25 -----
  2518.   MSG    version = "@(#)Bourne shell, BRL + GT mods\t30-May-1985";
  2519.   #else
  2520.   MSG        version = "\nVERSION sys137    DATE 1978 Nov 6 14:29:22\n";
  2521. + #endif
  2522.   
  2523.   /* error messages */
  2524.   MSG    badopt        = "bad option(s)";
  2525. ***************
  2526. *** 19,24
  2527.   
  2528.   /* error messages */
  2529.   MSG    badopt        = "bad option(s)";
  2530.   MSG    mailmsg        = "you have mail\n";
  2531.   MSG    nospace        = "no space";
  2532.   MSG    synmsg        = "syntax error";
  2533.  
  2534. --- 23,31 -----
  2535.   
  2536.   /* error messages */
  2537.   MSG    badopt        = "bad option(s)";
  2538. + #if JOBS
  2539. + MSG    mailmsg        = "You have new mail.\n";
  2540. + #else
  2541.   MSG    mailmsg        = "you have mail\n";
  2542.   #endif
  2543.   MSG    nospace        = "no space";
  2544. ***************
  2545. *** 20,25
  2546.   /* error messages */
  2547.   MSG    badopt        = "bad option(s)";
  2548.   MSG    mailmsg        = "you have mail\n";
  2549.   MSG    nospace        = "no space";
  2550.   MSG    synmsg        = "syntax error";
  2551.   
  2552.  
  2553. --- 27,33 -----
  2554.   MSG    mailmsg        = "You have new mail.\n";
  2555.   #else
  2556.   MSG    mailmsg        = "you have mail\n";
  2557. + #endif
  2558.   MSG    nospace        = "no space";
  2559.   MSG    synmsg        = "syntax error";
  2560.   
  2561. ***************
  2562. *** 52,57
  2563.   MSG    ifsname        = "IFS";
  2564.   MSG    ps1name        = "PS1";
  2565.   MSG    ps2name        = "PS2";
  2566.   
  2567.   /* string constants */
  2568.   MSG    nullstr        = "";
  2569.  
  2570. --- 60,69 -----
  2571.   MSG    ifsname        = "IFS";
  2572.   MSG    ps1name        = "PS1";
  2573.   MSG    ps2name        = "PS2";
  2574. + #if pyr
  2575. + MSG    univname    = "UNIVERSE";
  2576. + #endif
  2577. + MSG    histfilename    = "HISTFILE";
  2578.   
  2579.   /* string constants */
  2580.   MSG    nullstr        = "";
  2581. ***************
  2582. *** 68,73
  2583.   MSG    stdprompt    = "$ ";
  2584.   MSG    supprompt    = "# ";
  2585.   MSG    profile        = ".profile";
  2586.   
  2587.   
  2588.   /* tables */
  2589.  
  2590. --- 80,138 -----
  2591.   MSG    stdprompt    = "$ ";
  2592.   MSG    supprompt    = "# ";
  2593.   MSG    profile        = ".profile";
  2594. + MSG    shrc        = ".shrc";
  2595. + MSG    savehist    = ".history";
  2596. + MSG    dashi        = "-i";
  2597. + #if pyr
  2598. + MSG    dashl        = "-l";
  2599. + #endif
  2600. + MSG    dashr        = "-r";
  2601. + MSG    dashs        = "-s";
  2602. + #if JOBS
  2603. + MSG    amperstr    = " &";                /* DAG */
  2604. + MSG    andstr        = " && ";            /* DAG */
  2605. + MSG    appdstr        = ">> ";
  2606. + MSG    bgdstr        = "background \ \ \ \ \ \ ";
  2607. + MSG    casestr        = "case ";            /* DAG */
  2608. + MSG    cjpostr        = ": couldn't jpost\n";
  2609. + MSG    fgdstr        = "foreground \ \ \ \ \ \ ";
  2610. + MSG    forstr        = "for ";            /* DAG */
  2611. + MSG    fromastr    = "<&";                /* DAG */
  2612. + MSG    iesacstr    = " in ... esac";
  2613. + MSG    ifstr        = "if ";            /* DAG */
  2614. + MSG    inlnstr        = "<< ";
  2615. + MSG    insstr        = " in ";
  2616. + MSG    jcoffstr    = "job control not enabled\n";
  2617. + MSG    jinvstr        = "invalid job number\n";
  2618. + MSG    jpanstr        = "sh bug: j_print_ent--no number ";
  2619. + MSG    lotspstr    = " \ \ \ \ \ \ \ \ \ ";
  2620. + MSG    lpnstr        = "(";
  2621. + MSG    ncjstr        = "no current job\n";
  2622. + MSG    nstpstr        = ": not stopped\n";
  2623. + MSG    orstr        = " || ";            /* DAG */
  2624. + MSG    pipestr        = " | ";            /* DAG */
  2625. + MSG    psgpstr        = " (signal) ";
  2626. + MSG    ptinstr        = " (tty in) ";
  2627. + MSG    ptoustr        = " (tty out)";
  2628. + MSG    rdinstr        = "< ";
  2629. + MSG    rpnstr        = ")";
  2630. + MSG    rsqbrk        = "] ";
  2631. + MSG    sdonstr        = "; done";
  2632. + MSG    sdostr        = "; do ";
  2633. + MSG    selsstr        = "; else ";
  2634. + MSG    semspstr    = "; ";
  2635. + MSG    sfistr        = "; fi";
  2636. + MSG    spcstr        = " ";
  2637. + MSG    spspstr        = " \ ";
  2638. + MSG    sthnstr        = "; then ";
  2639. + MSG    stpdstr        = "stopped";
  2640. + MSG    tasjstr        = "There are stopped jobs.\n";
  2641. + MSG    toastr        = ">&";                /* DAG */
  2642. + MSG    untilstr    = "until ";            /* DAG */
  2643. + MSG    whilestr    = "while ";            /* DAG */
  2644. + MSG    rdwstr        = "<> ";            /* ADR */
  2645. + MSG    nosusp        = "cannot suspend a login shell\n";    /* yet... */
  2646. + #endif
  2647.   
  2648.   
  2649.   /* tables */
  2650. ***************
  2651. *** 71,77
  2652.   
  2653.   
  2654.   /* tables */
  2655. ! SYSTAB reserved {
  2656.           {"in",        INSYM},
  2657.           {"esac",    ESSYM},
  2658.           {"case",    CASYM},
  2659.  
  2660. --- 136,142 -----
  2661.   
  2662.   
  2663.   /* tables */
  2664. ! SYSTAB reserved  = {
  2665.           {"in",        INSYM},
  2666.           {"esac",    ESSYM},
  2667.           {"case",    CASYM},
  2668. ***************
  2669. *** 90,96
  2670.           {0,    0},
  2671.   };
  2672.   
  2673. ! STRING    sysmsg[] {
  2674.           0,
  2675.           "Hangup",
  2676.           0,    /* Interrupt */
  2677.  
  2678. --- 155,161 -----
  2679.           {0,    0},
  2680.   };
  2681.   
  2682. ! STRING    sysmsg[] = {
  2683.           0,
  2684.           "Hangup",
  2685.           0,    /* Interrupt */
  2686. ***************
  2687. *** 97,103
  2688.           "Quit",
  2689.           "Illegal instruction",
  2690.           "Trace/BPT trap",
  2691. !         "IOT trap",
  2692.           "EMT trap",
  2693.           "Floating exception",
  2694.           "Killed",
  2695.  
  2696. --- 162,168 -----
  2697.           "Quit",
  2698.           "Illegal instruction",
  2699.           "Trace/BPT trap",
  2700. !         "abort",
  2701.           "EMT trap",
  2702.           "Floating exception",
  2703.           "Killed",
  2704. ***************
  2705. *** 108,113
  2706.           "Alarm call",
  2707.           "Terminated",
  2708.           "Signal 16",
  2709.   };
  2710.   
  2711.   MSG        export = "export";
  2712.  
  2713. --- 173,200 -----
  2714.           "Alarm call",
  2715.           "Terminated",
  2716.           "Signal 16",
  2717. + #if JOBS
  2718. +         "Stop",
  2719. +         "Stop from keyboard",
  2720. +         "Continue",
  2721. +         "Child status change",
  2722. +         "Background read",
  2723. +         "Background write",
  2724. +         "I/O possible",
  2725. +         "CPU time limit",
  2726. +         "File size limit",
  2727. +         "Virtual time alarm",
  2728. +         "Profiling timer alarm",
  2729. +         "Signal 28",
  2730. +         "Signal 29",
  2731. +         "Signal 30",
  2732. +         "Signal 31",
  2733. +         "Signal 32",
  2734. + #else
  2735. +         "Signal 17",
  2736. +         "Signal 18",
  2737. +         "Signal 19",
  2738. + #endif
  2739.   };
  2740.   
  2741.   MSG        export = "export";
  2742. ***************
  2743. *** 112,118
  2744.   
  2745.   MSG        export = "export";
  2746.   MSG        readonly = "readonly";
  2747. ! SYSTAB    commands {
  2748.           {"cd",        SYSCD},
  2749.           {"read",    SYSREAD},
  2750.   /*
  2751.  
  2752. --- 199,205 -----
  2753.   
  2754.   MSG        export = "export";
  2755.   MSG        readonly = "readonly";
  2756. ! SYSTAB    commands = {
  2757.           {"cd",        SYSCD},
  2758.           {"read",    SYSREAD},
  2759.   /*
  2760. ***************
  2761. *** 135,139
  2762.           {"exec",    SYSEXEC},
  2763.           {"times",    SYSTIMES},
  2764.           {"umask",    SYSUMASK},
  2765.           {0,    0},
  2766.   };
  2767.  
  2768. --- 222,239 -----
  2769.           {"exec",    SYSEXEC},
  2770.           {"times",    SYSTIMES},
  2771.           {"umask",    SYSUMASK},
  2772. + #if JOBS
  2773. +         {"jobs",    SYSJOBS},
  2774. +         {"fg",        SYSFG},
  2775. +         {"bg",        SYSBG},
  2776. +         {"suspend",    SYSSUSPEND},
  2777. + #endif
  2778. + #if pyr
  2779. +         {"att",        SYSATT},
  2780. +         {"ucb",        SYSUCB},
  2781. +         {"universe",    SYSUNIVERSE},
  2782. + #endif
  2783. +         {"history",    SYSHISTORY},
  2784.           {0,    0},
  2785.   };
  2786.   
  2787. ***************
  2788. *** 137,139
  2789.           {"umask",    SYSUMASK},
  2790.           {0,    0},
  2791.   };
  2792.  
  2793. --- 236,244 -----
  2794.           {"history",    SYSHISTORY},
  2795.           {0,    0},
  2796.   };
  2797. + #if pyr
  2798. + #include <sys/types.h>    /* to get sys/inode.h to work (sigh) */
  2799. + #include <sys/inode.h>    /* NUMUNIV is defined to be NCLNK */
  2800. + #include <universe.h>    /* gets char *univ_name[] && char *univ_longname[] */
  2801. + #endif
  2802.  
  2803.