home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume30 / perl / patch29 < prev    next >
Text File  |  1992-06-11  |  50KB  |  1,723 lines

  1. Newsgroups: comp.sources.misc
  2. From: lwall@netlabs.com (Larry Wall)
  3. Subject:  v30i040:  perl - The perl programming language, Patch29
  4. Message-ID: <1992Jun11.180724.1246@sparky.imd.sterling.com>
  5. X-Md4-Signature: faf393b179fa4464fdb8cf6649a4964f
  6. Date: Thu, 11 Jun 1992 18:07:24 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: lwall@netlabs.com (Larry Wall)
  10. Posting-number: Volume 30, Issue 40
  11. Archive-name: perl/patch29
  12. Environment: UNIX, MS-DOS, OS2
  13. Patch-To: perl: Volume 18, Issue 19-54
  14.  
  15. System: perl version 4.0
  16. Patch #: 29
  17. Priority: highish
  18. Subject: patch #20, continued
  19.  
  20. Description:
  21.     See patch #20.
  22.  
  23. Fix:    From rn, say "| patch -p -N -d DIR", where DIR is your perl source
  24.     directory.  Outside of rn, say "cd DIR; patch -p -N <thisarticle".
  25.     If you don't have the patch program, apply the following by hand,
  26.     or get patch (version 2.0, latest patchlevel).
  27.  
  28.     After patching:
  29.         *** DO NOTHING--INSTALL ALL PATCHES UP THROUGH #33 FIRST ***
  30.  
  31.     If patch indicates that patchlevel is the wrong version, you may need
  32.     to apply one or more previous patches, or the patch may already
  33.     have been applied.  See the patchlevel.h file to find out what has or
  34.     has not been applied.  In any event, don't continue with the patch.
  35.  
  36.     If you are missing previous patches they can be obtained from me:
  37.  
  38.     Larry Wall
  39.     lwall@netlabs.com
  40.  
  41.     If you send a mail message of the following form it will greatly speed
  42.     processing:
  43.  
  44.     Subject: Command
  45.     @SH mailpatch PATH perl 4.0 LIST
  46.            ^ note the c
  47.  
  48.     where PATH is a return path FROM ME TO YOU either in Internet notation,
  49.     or in bang notation from some well-known host, and LIST is the number
  50.     of one or more patches you need, separated by spaces, commas, and/or
  51.     hyphens.  Saying 35- says everything from 35 to the end.
  52.  
  53.  
  54. Index: patchlevel.h
  55. Prereq: 28
  56. 1c1
  57. < #define PATCHLEVEL 28
  58. ---
  59. > #define PATCHLEVEL 29
  60.  
  61. Index: perl.c
  62. *** perl.c.old    Mon Jun  8 17:50:22 1992
  63. --- perl.c    Mon Jun  8 17:50:23 1992
  64. ***************
  65. *** 1,4 ****
  66. ! char rcsid[] = "$RCSfile: perl.c,v $$Revision: 4.0.1.6 $$Date: 91/11/11 16:38:45 $\nPatch level: ###\n";
  67.   /*
  68.    *    Copyright (c) 1991, Larry Wall
  69.    *
  70. --- 1,4 ----
  71. ! char rcsid[] = "$RCSfile: perl.c,v $$Revision: 4.0.1.7 $$Date: 92/06/08 14:50:39 $\nPatch level: ###\n";
  72.   /*
  73.    *    Copyright (c) 1991, Larry Wall
  74.    *
  75. ***************
  76. *** 6,11 ****
  77. --- 6,22 ----
  78.    *    License or the Artistic License, as specified in the README file.
  79.    *
  80.    * $Log:    perl.c,v $
  81. +  * Revision 4.0.1.7  92/06/08  14:50:39  lwall
  82. +  * patch20: PERLLIB now supports multiple directories
  83. +  * patch20: running taintperl explicitly now does checks even if $< == $>
  84. +  * patch20: -e 'cmd' no longer fails silently if /tmp runs out of space
  85. +  * patch20: perl -P now uses location of sed determined by Configure
  86. +  * patch20: form feed for formats is now specifiable via $^L
  87. +  * patch20: paragraph mode now skips extra newlines automatically
  88. +  * patch20: eval "1 #comment" didn't work
  89. +  * patch20: couldn't require . files
  90. +  * patch20: semantic compilation errors didn't abort execution
  91. +  * 
  92.    * Revision 4.0.1.6  91/11/11  16:38:45  lwall
  93.    * patch19: default arg for shift was wrong after first subroutine definition
  94.    * patch19: op/regexp.t failed from missing arg to bcmp()
  95. ***************
  96. *** 44,54 ****
  97.   #include "EXTERN.h"
  98.   #include "perl.h"
  99.   #include "perly.h"
  100. - #ifdef MSDOS
  101. - #include "patchlev.h"
  102. - #else
  103.   #include "patchlevel.h"
  104. - #endif
  105.   
  106.   char *getenv();
  107.   
  108. --- 55,61 ----
  109. ***************
  110. *** 65,70 ****
  111. --- 72,78 ----
  112.   #endif
  113.   
  114.   static char* moreswitches();
  115. + static void incpush();
  116.   static char* cddir;
  117.   static bool minus_c;
  118.   static char patchlevel[6];
  119. ***************
  120. *** 117,122 ****
  121. --- 125,136 ----
  122.       loop_ptr = -1;        /* start label stack again */
  123.       goto just_doit;
  124.       }
  125. + #ifdef TAINT
  126. + #ifndef DOSUID
  127. +     if (uid == euid && gid == egid)
  128. +     taintanyway == TRUE;        /* running taintperl explicitly */
  129. + #endif
  130. + #endif
  131.       (void)sprintf(index(rcsid,'#'), "%d\n", PATCHLEVEL);
  132.       linestr = Str_new(65,80);
  133.       str_nset(linestr,"",0);
  134. ***************
  135. *** 164,169 ****
  136. --- 178,185 ----
  137.           if (!e_fp) {
  138.               e_tmpname = savestr(TMPPATH);
  139.           (void)mktemp(e_tmpname);
  140. +         if (!*e_tmpname)
  141. +             fatal("Can't mktemp()");
  142.           e_fp = fopen(e_tmpname,"w");
  143.           if (!e_fp)
  144.               fatal("Cannot open temporary file");
  145. ***************
  146. *** 234,278 ****
  147.     switch_end:
  148.       scriptname = argv[0];
  149.       if (e_fp) {
  150. !     (void)fclose(e_fp);
  151.       argc++,argv--;
  152.       scriptname = e_tmpname;
  153.       }
  154.   
  155. ! #ifdef MSDOS
  156.   #define PERLLIB_SEP ';'
  157.   #else
  158.   #define PERLLIB_SEP ':'
  159.   #endif
  160.   #ifndef TAINT        /* Can't allow arbitrary PERLLIB in setuid script */
  161. !     {
  162. !     char * s2 = getenv("PERLLIB");
  163. !     if ( s2 ) {
  164. !         /* Break at all separators */
  165. !         while ( *s2 ) {
  166. !         /* First, skip any consecutive separators */
  167. !         while ( *s2 == PERLLIB_SEP ) {
  168. !             /* Uncomment the next line for PATH semantics */
  169. !             /* (void)apush(stab_array(incstab),str_make(".",1)); */
  170. !             s2++;
  171. !         }
  172. !         if ( (s = index(s2,PERLLIB_SEP)) != Nullch ) {
  173. !             (void)apush(stab_array(incstab),str_make(s2,(int)(s-s2)));
  174. !             s2 = s+1;
  175. !         } else {
  176. !             (void)apush(stab_array(incstab),str_make(s2,0));
  177. !             break;
  178. !         }
  179. !         }
  180. !     }
  181. !     }
  182.   #endif /* TAINT */
  183.   
  184.   #ifndef PRIVLIB
  185.   #define PRIVLIB "/usr/local/lib/perl"
  186.   #endif
  187. !     (void)apush(stab_array(incstab),str_make(PRIVLIB,0));
  188.       (void)apush(stab_array(incstab),str_make(".",1));
  189.   
  190.       str_set(&str_no,No);
  191. --- 250,274 ----
  192.     switch_end:
  193.       scriptname = argv[0];
  194.       if (e_fp) {
  195. !     if (fflush(e_fp) || ferror(e_fp) || fclose(e_fp))
  196. !         fatal("Can't write to temp file for -e: %s", strerror(errno));
  197.       argc++,argv--;
  198.       scriptname = e_tmpname;
  199.       }
  200.   
  201. ! #ifdef DOSISH
  202.   #define PERLLIB_SEP ';'
  203.   #else
  204.   #define PERLLIB_SEP ':'
  205.   #endif
  206.   #ifndef TAINT        /* Can't allow arbitrary PERLLIB in setuid script */
  207. !     incpush(getenv("PERLLIB"));
  208.   #endif /* TAINT */
  209.   
  210.   #ifndef PRIVLIB
  211.   #define PRIVLIB "/usr/local/lib/perl"
  212.   #endif
  213. !     incpush(PRIVLIB);
  214.       (void)apush(stab_array(incstab),str_make(".",1));
  215.   
  216.       str_set(&str_no,No);
  217. ***************
  218. *** 296,314 ****
  219.   
  220.       bufend = s + strlen(s);
  221.       while (*s) {
  222. ! #ifndef MSDOS
  223.           s = cpytill(tokenbuf,s,bufend,':',&len);
  224.   #else
  225.           for (len = 0; *s && *s != ';'; tokenbuf[len++] = *s++);
  226.           tokenbuf[len] = '\0';
  227.   #endif
  228.           if (*s)
  229.           s++;
  230. ! #ifndef MSDOS
  231.           if (len && tokenbuf[len-1] != '/')
  232.   #else
  233.           if (len && tokenbuf[len-1] != '\\')
  234.   #endif
  235.           (void)strcat(tokenbuf+len,"/");
  236.           (void)strcat(tokenbuf+len,scriptname);
  237.   #ifdef DEBUGGING
  238. --- 292,319 ----
  239.   
  240.       bufend = s + strlen(s);
  241.       while (*s) {
  242. ! #ifndef DOSISH
  243.           s = cpytill(tokenbuf,s,bufend,':',&len);
  244.   #else
  245. + #ifdef atarist
  246. +         for (len = 0; *s && *s != ',' && *s != ';'; tokenbuf[len++] = *s++);
  247. +         tokenbuf[len] = '\0';
  248. + #else
  249.           for (len = 0; *s && *s != ';'; tokenbuf[len++] = *s++);
  250.           tokenbuf[len] = '\0';
  251.   #endif
  252. + #endif
  253.           if (*s)
  254.           s++;
  255. ! #ifndef DOSISH
  256.           if (len && tokenbuf[len-1] != '/')
  257.   #else
  258. + #ifdef atarist
  259. +         if (len && ((tokenbuf[len-1] != '\\') && (tokenbuf[len-1] != '/')))
  260. + #else
  261.           if (len && tokenbuf[len-1] != '\\')
  262.   #endif
  263. + #endif
  264.           (void)strcat(tokenbuf+len,"/");
  265.           (void)strcat(tokenbuf+len,scriptname);
  266.   #ifdef DEBUGGING
  267. ***************
  268. *** 348,355 ****
  269.           sprintf(tokenbuf, "%s", cpp);
  270.       str_cat(str,"-I");
  271.       str_cat(str,PRIVLIB);
  272.       (void)sprintf(buf, "\
  273. ! %ssed %s -e '/^[^#]/b' \
  274.    -e '/^#[     ]*include[     ]/b' \
  275.    -e '/^#[     ]*define[     ]/b' \
  276.    -e '/^#[     ]*if[     ]/b' \
  277. --- 353,376 ----
  278.           sprintf(tokenbuf, "%s", cpp);
  279.       str_cat(str,"-I");
  280.       str_cat(str,PRIVLIB);
  281. + #ifdef MSDOS
  282.       (void)sprintf(buf, "\
  283. ! sed %s -e \"/^[^#]/b\" \
  284. !  -e \"/^#[     ]*include[     ]/b\" \
  285. !  -e \"/^#[     ]*define[     ]/b\" \
  286. !  -e \"/^#[     ]*if[     ]/b\" \
  287. !  -e \"/^#[     ]*ifdef[     ]/b\" \
  288. !  -e \"/^#[     ]*ifndef[     ]/b\" \
  289. !  -e \"/^#[     ]*else/b\" \
  290. !  -e \"/^#[     ]*elif[     ]/b\" \
  291. !  -e \"/^#[     ]*undef[     ]/b\" \
  292. !  -e \"/^#[     ]*endif/b\" \
  293. !  -e \"s/^#.*//\" \
  294. !  %s | %s -C %s %s",
  295. !       (doextract ? "-e \"1,/^#/d\n\"" : ""),
  296. ! #else
  297. !     (void)sprintf(buf, "\
  298. ! %s %s -e '/^[^#]/b' \
  299.    -e '/^#[     ]*include[     ]/b' \
  300.    -e '/^#[     ]*define[     ]/b' \
  301.    -e '/^#[     ]*if[     ]/b' \
  302. ***************
  303. *** 361,372 ****
  304.    -e '/^#[     ]*endif/b' \
  305.    -e 's/^[     ]*#.*//' \
  306.    %s | %s -C %s %s",
  307. ! #ifdef MSDOS
  308. !       "",
  309.   #else
  310. !       "/bin/",
  311.   #endif
  312.         (doextract ? "-e '1,/^#/d\n'" : ""),
  313.         scriptname, tokenbuf, str_get(str), CPPMINUS);
  314.   #ifdef DEBUGGING
  315.       if (debug & 64) {
  316. --- 382,394 ----
  317.    -e '/^#[     ]*endif/b' \
  318.    -e 's/^[     ]*#.*//' \
  319.    %s | %s -C %s %s",
  320. ! #ifdef LOC_SED
  321. !       LOC_SED,
  322.   #else
  323. !       "sed",
  324.   #endif
  325.         (doextract ? "-e '1,/^#/d\n'" : ""),
  326. + #endif
  327.         scriptname, tokenbuf, str_get(str), CPPMINUS);
  328.   #ifdef DEBUGGING
  329.       if (debug & 64) {
  330. ***************
  331. *** 376,382 ****
  332.   #endif
  333.       doextract = FALSE;
  334.   #ifdef IAMSUID                /* actually, this is caught earlier */
  335. !     if (euid != uid && !euid)    /* if running suidperl */
  336.   #ifdef HAS_SETEUID
  337.           (void)seteuid(uid);        /* musn't stay setuid root */
  338.   #else
  339. --- 398,404 ----
  340.   #endif
  341.       doextract = FALSE;
  342.   #ifdef IAMSUID                /* actually, this is caught earlier */
  343. !     if (euid != uid && !euid) {    /* if running suidperl */
  344.   #ifdef HAS_SETEUID
  345.           (void)seteuid(uid);        /* musn't stay setuid root */
  346.   #else
  347. ***************
  348. *** 386,391 ****
  349. --- 408,416 ----
  350.           setuid(uid);
  351.   #endif
  352.   #endif
  353. +         if (geteuid() != uid)
  354. +         fatal("Can't do seteuid!\n");
  355. +     }
  356.   #endif /* IAMSUID */
  357.       rsfp = mypopen(buf,"r");
  358.       }
  359. ***************
  360. *** 538,544 ****
  361.           fatal("Can't do setuid\n");
  362.       }
  363.   
  364. !     if (statbuf.st_mode & S_ISGID && statbuf.st_gid != egid)
  365.   #ifdef HAS_SETEGID
  366.           (void)setegid(statbuf.st_gid);
  367.   #else
  368. --- 563,569 ----
  369.           fatal("Can't do setuid\n");
  370.       }
  371.   
  372. !     if (statbuf.st_mode & S_ISGID && statbuf.st_gid != egid) {
  373.   #ifdef HAS_SETEGID
  374.           (void)setegid(statbuf.st_gid);
  375.   #else
  376. ***************
  377. *** 548,553 ****
  378. --- 573,581 ----
  379.           setgid(statbuf.st_gid);
  380.   #endif
  381.   #endif
  382. +         if (getegid() != statbuf.st_gid)
  383. +         fatal("Can't do setegid!\n");
  384. +     }
  385.       if (statbuf.st_mode & S_ISUID) {
  386.           if (statbuf.st_uid != euid)
  387.   #ifdef HAS_SETEUID
  388. ***************
  389. *** 559,566 ****
  390.           setuid(statbuf.st_uid);
  391.   #endif
  392.   #endif
  393.       }
  394. !     else if (uid)            /* oops, mustn't run as root */
  395.   #ifdef HAS_SETEUID
  396.           (void)seteuid((UIDTYPE)uid);
  397.   #else
  398. --- 587,596 ----
  399.           setuid(statbuf.st_uid);
  400.   #endif
  401.   #endif
  402. +         if (geteuid() != statbuf.st_uid)
  403. +         fatal("Can't do seteuid!\n");
  404.       }
  405. !     else if (uid) {            /* oops, mustn't run as root */
  406.   #ifdef HAS_SETEUID
  407.           (void)seteuid((UIDTYPE)uid);
  408.   #else
  409. ***************
  410. *** 570,575 ****
  411. --- 600,608 ----
  412.           setuid((UIDTYPE)uid);
  413.   #endif
  414.   #endif
  415. +         if (geteuid() != uid)
  416. +         fatal("Can't do seteuid!\n");
  417. +     }
  418.       uid = (int)getuid();
  419.       euid = (int)geteuid();
  420.       gid = (int)getgid();
  421. ***************
  422. *** 713,723 ****
  423.       rightstab = stabent("'",allstabs);
  424.       sawampersand = (amperstab || leftstab || rightstab);
  425.       if (tmpstab = stabent(":",allstabs))
  426. !     str_set(STAB_STR(tmpstab),chopset);
  427.       if (tmpstab = stabent("\024",allstabs))
  428.       time(&basetime);
  429.   
  430.       /* these aren't necessarily magical */
  431.       if (tmpstab = stabent(";",allstabs))
  432.       str_set(STAB_STR(tmpstab),"\034");
  433.       if (tmpstab = stabent("]",allstabs)) {
  434. --- 746,760 ----
  435.       rightstab = stabent("'",allstabs);
  436.       sawampersand = (amperstab || leftstab || rightstab);
  437.       if (tmpstab = stabent(":",allstabs))
  438. !     str_set(stab_val(tmpstab),chopset);
  439.       if (tmpstab = stabent("\024",allstabs))
  440.       time(&basetime);
  441.   
  442.       /* these aren't necessarily magical */
  443. +     if (tmpstab = stabent("\014",allstabs)) {
  444. +     str_set(stab_val(tmpstab),"\f");
  445. +     formfeed = stab_val(tmpstab);
  446. +     }
  447.       if (tmpstab = stabent(";",allstabs))
  448.       str_set(STAB_STR(tmpstab),"\034");
  449.       if (tmpstab = stabent("]",allstabs)) {
  450. ***************
  451. *** 730,736 ****
  452.   
  453.       stdinstab = stabent("STDIN",TRUE);
  454.       stdinstab->str_pok |= SP_MULTI;
  455. !     stab_io(stdinstab) = stio_new();
  456.       stab_io(stdinstab)->ifp = stdin;
  457.       tmpstab = stabent("stdin",TRUE);
  458.       stab_io(tmpstab) = stab_io(stdinstab);
  459. --- 767,774 ----
  460.   
  461.       stdinstab = stabent("STDIN",TRUE);
  462.       stdinstab->str_pok |= SP_MULTI;
  463. !     if (!stab_io(stdinstab))
  464. !     stab_io(stdinstab) = stio_new();
  465.       stab_io(stdinstab)->ifp = stdin;
  466.       tmpstab = stabent("stdin",TRUE);
  467.       stab_io(tmpstab) = stab_io(stdinstab);
  468. ***************
  469. *** 738,744 ****
  470.   
  471.       tmpstab = stabent("STDOUT",TRUE);
  472.       tmpstab->str_pok |= SP_MULTI;
  473. !     stab_io(tmpstab) = stio_new();
  474.       stab_io(tmpstab)->ofp = stab_io(tmpstab)->ifp = stdout;
  475.       defoutstab = tmpstab;
  476.       tmpstab = stabent("stdout",TRUE);
  477. --- 776,783 ----
  478.   
  479.       tmpstab = stabent("STDOUT",TRUE);
  480.       tmpstab->str_pok |= SP_MULTI;
  481. !     if (!stab_io(tmpstab))
  482. !     stab_io(tmpstab) = stio_new();
  483.       stab_io(tmpstab)->ofp = stab_io(tmpstab)->ifp = stdout;
  484.       defoutstab = tmpstab;
  485.       tmpstab = stabent("stdout",TRUE);
  486. ***************
  487. *** 747,753 ****
  488.   
  489.       curoutstab = stabent("STDERR",TRUE);
  490.       curoutstab->str_pok |= SP_MULTI;
  491. !     stab_io(curoutstab) = stio_new();
  492.       stab_io(curoutstab)->ofp = stab_io(curoutstab)->ifp = stderr;
  493.       tmpstab = stabent("stderr",TRUE);
  494.       stab_io(tmpstab) = stab_io(curoutstab);
  495. --- 786,793 ----
  496.   
  497.       curoutstab = stabent("STDERR",TRUE);
  498.       curoutstab->str_pok |= SP_MULTI;
  499. !     if (!stab_io(curoutstab))
  500. !     stab_io(curoutstab) = stio_new();
  501.       stab_io(curoutstab)->ofp = stab_io(curoutstab)->ifp = stderr;
  502.       tmpstab = stabent("stderr",TRUE);
  503.       stab_io(tmpstab) = stab_io(curoutstab);
  504. ***************
  505. *** 761,766 ****
  506. --- 801,807 ----
  507.       rs = nrs;
  508.       rslen = nrslen;
  509.       rschar = nrschar;
  510. +     rspara = (nrslen == 2);
  511.       str_nset(stab_val(stabent("/", TRUE)), rs, rslen);
  512.   
  513.       if (do_undump)
  514. ***************
  515. *** 879,884 ****
  516. --- 920,952 ----
  517.       }
  518.   }
  519.   
  520. + static void
  521. + incpush(p)
  522. + char *p;
  523. + {
  524. +     char *s;
  525. +     if (!p)
  526. +     return;
  527. +     /* Break at all separators */
  528. +     while (*p) {
  529. +     /* First, skip any consecutive separators */
  530. +     while ( *p == PERLLIB_SEP ) {
  531. +         /* Uncomment the next line for PATH semantics */
  532. +         /* (void)apush(stab_array(incstab), str_make(".", 1)); */
  533. +         p++;
  534. +     }
  535. +     if ( (s = index(p, PERLLIB_SEP)) != Nullch ) {
  536. +         (void)apush(stab_array(incstab), str_make(p, (int)(s - p)));
  537. +         p = s + 1;
  538. +     } else {
  539. +         (void)apush(stab_array(incstab), str_make(p, 0));
  540. +         break;
  541. +     }
  542. +     }
  543. + }
  544.   void
  545.   savelines(array, str)
  546.   ARRAY *array;
  547. ***************
  548. *** 947,953 ****
  549.       curcmd->c_filestab = fstab("(eval)");
  550.       curcmd->c_line = 1;
  551.       str_sset(linestr,str);
  552. !     str_cat(linestr,";\n");        /* be kind to them */
  553.       if (perldb)
  554.           savelines(stab_xarray(curcmd->c_filestab), linestr);
  555.       }
  556. --- 1015,1021 ----
  557.       curcmd->c_filestab = fstab("(eval)");
  558.       curcmd->c_line = 1;
  559.       str_sset(linestr,str);
  560. !     str_cat(linestr,";\n;\n");    /* be kind to them */
  561.       if (perldb)
  562.           savelines(stab_xarray(curcmd->c_filestab), linestr);
  563.       }
  564. ***************
  565. *** 969,976 ****
  566.           return sp;
  567.       }
  568.       tmpfilename = savestr(specfilename);
  569. !     if (index("/.", *tmpfilename))
  570.           rsfp = fopen(tmpfilename,"r");
  571.       else {
  572.           ar = stab_array(incstab);
  573.           for (i = 0; i <= ar->ary_fill; i++) {
  574. --- 1037,1049 ----
  575.           return sp;
  576.       }
  577.       tmpfilename = savestr(specfilename);
  578. !     if (*tmpfilename == '/' ||
  579. !         (*tmpfilename == '.' && 
  580. !         (tmpfilename[1] == '/' ||
  581. !          (tmpfilename[1] == '.' && tmpfilename[2] == '/'))))
  582. !     {
  583.           rsfp = fopen(tmpfilename,"r");
  584. +     }
  585.       else {
  586.           ar = stab_array(incstab);
  587.           for (i = 0; i <= ar->ary_fill; i++) {
  588. ***************
  589. *** 1061,1067 ****
  590.       }
  591.       myroot = eval_root;        /* in case cmd_exec does another eval! */
  592.   
  593. !     if (retval) {
  594.       st = stack->ary_array;
  595.       sp = arglast[0];
  596.       if (gimme != G_ARRAY)
  597. --- 1134,1140 ----
  598.       }
  599.       myroot = eval_root;        /* in case cmd_exec does another eval! */
  600.   
  601. !     if (retval || error_count) {
  602.       st = stack->ary_array;
  603.       sp = arglast[0];
  604.       if (gimme != G_ARRAY)
  605. ***************
  606. *** 1074,1079 ****
  607. --- 1147,1153 ----
  608.   #endif
  609.           cmd_free(eval_root);
  610.   #endif
  611. +         /*SUPPRESS 29*/ /*SUPPRESS 30*/
  612.           if ((CMD*)eval_root == last_root)
  613.           last_root = Nullcmd;
  614.           eval_root = myroot = Nullcmd;
  615. ***************
  616. *** 1301,1310 ****
  617.       fputs("MS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n",
  618.       stdout);
  619.   #ifdef OS2
  620. !         fputs("OS/2 port Copyright (c) 1990, Raymond Chen, Kai Uwe Rommel\n",
  621.           stdout);
  622.   #endif
  623.   #endif
  624.       fputs("\n\
  625.   Perl may be copied only under the terms of either the Artistic License or the\n\
  626.   GNU General Public License, which may be found in the Perl 4.0 source kit.\n",stdout);
  627. --- 1375,1387 ----
  628.       fputs("MS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n",
  629.       stdout);
  630.   #ifdef OS2
  631. !         fputs("OS/2 port Copyright (c) 1990, 1991, Raymond Chen, Kai Uwe Rommel\n",
  632.           stdout);
  633.   #endif
  634.   #endif
  635. + #ifdef atarist
  636. +         fputs("atariST series port, ++jrb  bammi@cadence.com\n", stdout);
  637. + #endif
  638.       fputs("\n\
  639.   Perl may be copied only under the terms of either the Artistic License or the\n\
  640.   GNU General Public License, which may be found in the Perl 4.0 source kit.\n",stdout);
  641. ***************
  642. *** 1330,1335 ****
  643. --- 1407,1413 ----
  644.   
  645.   /* unexec() can be found in the Gnu emacs distribution */
  646.   
  647. + void
  648.   my_unexec()
  649.   {
  650.   #ifdef UNEXEC
  651. ***************
  652. *** 1346,1352 ****
  653.       fprintf(stderr, "unexec of %s into %s failed!\n", perlpath, dumpname);
  654.       exit(status);
  655.   #else
  656. ! #ifdef MSDOS
  657.       abort();    /* nothing else to do */
  658.   #else /* ! MSDOS */
  659.   #   ifndef SIGABRT
  660. --- 1424,1430 ----
  661.       fprintf(stderr, "unexec of %s into %s failed!\n", perlpath, dumpname);
  662.       exit(status);
  663.   #else
  664. ! #ifdef DOSISH
  665.       abort();    /* nothing else to do */
  666.   #else /* ! MSDOS */
  667.   #   ifndef SIGABRT
  668.  
  669. Index: perl.man
  670. *** perl.man.old    Mon Jun  8 17:51:02 1992
  671. --- perl.man    Mon Jun  8 17:51:08 1992
  672. ***************
  673. *** 1,7 ****
  674.   .rn '' }`
  675. ! ''' $RCSfile: perl.man,v $$Revision: 4.0.1.5 $$Date: 91/11/11 16:42:00 $
  676.   ''' 
  677.   ''' $Log:    perl.man,v $
  678.   ''' Revision 4.0.1.5  91/11/11  16:42:00  lwall
  679.   ''' patch19: added little-endian pack/unpack options
  680.   ''' 
  681. --- 1,18 ----
  682.   .rn '' }`
  683. ! ''' $RCSfile: perl.man,v $$Revision: 4.0.1.6 $$Date: 92/06/08 15:07:29 $
  684.   ''' 
  685.   ''' $Log:    perl.man,v $
  686. + ''' Revision 4.0.1.6  92/06/08  15:07:29  lwall
  687. + ''' patch20: documented that numbers may contain underline
  688. + ''' patch20: clarified that DATA may only be read from main script
  689. + ''' patch20: relaxed requirement for semicolon at the end of a block
  690. + ''' patch20: added ... as variant on ..
  691. + ''' patch20: documented need for 1; at the end of a required file
  692. + ''' patch20: extended bracket-style quotes to two-arg operators: s()() and tr()()
  693. + ''' patch20: paragraph mode now skips extra newlines automatically
  694. + ''' patch20: documented PERLLIB and PERLDB
  695. + ''' patch20: documented limit on size of regexp
  696. + ''' 
  697.   ''' Revision 4.0.1.5  91/11/11  16:42:00  lwall
  698.   ''' patch19: added little-endian pack/unpack options
  699.   ''' 
  700. ***************
  701. *** 623,634 ****
  702.   integer formats:
  703.   .nf
  704.   
  705. ! .ne 5
  706.       12345
  707.       12345.67
  708.       .23E-10
  709.       0xffff    # hex
  710.       0377    # octal
  711.   
  712.   .fi
  713.   String literals are delimited by either single or double quotes.
  714. --- 634,646 ----
  715.   integer formats:
  716.   .nf
  717.   
  718. ! .ne 6
  719.       12345
  720.       12345.67
  721.       .23E-10
  722.       0xffff    # hex
  723.       0377    # octal
  724. +     4_294_967_296
  725.   
  726.   .fi
  727.   String literals are delimited by either single or double quotes.
  728. ***************
  729. *** 687,693 ****
  730.   into strings.
  731.   In addition, the token _\|_END_\|_ may be used to indicate the logical end of the
  732.   script before the actual end of file.
  733. ! Any following text is ignored (but may be read via the DATA filehandle).
  734.   The two control characters ^D and ^Z are synonyms for _\|_END_\|_.
  735.   .PP
  736.   A word that doesn't have any other interpretation in the grammar will be
  737. --- 699,707 ----
  738.   into strings.
  739.   In addition, the token _\|_END_\|_ may be used to indicate the logical end of the
  740.   script before the actual end of file.
  741. ! Any following text is ignored, but may be read via the DATA filehandle.
  742. ! (The DATA filehandle may read data only from the main script, but not from
  743. ! any required file or evaluated string.)
  744.   The two control characters ^D and ^Z are synonyms for _\|_END_\|_.
  745.   .PP
  746.   A word that doesn't have any other interpretation in the grammar will be
  747. ***************
  748. *** 944,950 ****
  749.       }
  750.   
  751.   .ne 10
  752. ! is equivalent to
  753.   
  754.       unshift(@ARGV, \'\-\') \|if \|$#ARGV < $[;
  755.       while ($ARGV = shift) {
  756. --- 958,964 ----
  757.       }
  758.   
  759.   .ne 10
  760. ! is equivalent to the following Perl-like pseudo code:
  761.   
  762.       unshift(@ARGV, \'\-\') \|if \|$#ARGV < $[;
  763.       while ($ARGV = shift) {
  764. ***************
  765. *** 955,966 ****
  766.       }
  767.   
  768.   .fi
  769. ! except that it isn't as cumbersome to say.
  770.   It really does shift array ARGV and put the current filename into
  771.   variable ARGV.
  772. ! It also uses filehandle ARGV internally.
  773. ! You can modify @ARGV before the first <> as long as you leave the first
  774. ! filename at the beginning of the array.
  775.   Line numbers ($.) continue as if the input was one big happy file.
  776.   (But see example under eof for how to reset line numbers on each file.)
  777.   .PP
  778. --- 969,983 ----
  779.       }
  780.   
  781.   .fi
  782. ! except that it isn't as cumbersome to say, and will actually work.
  783.   It really does shift array ARGV and put the current filename into
  784.   variable ARGV.
  785. ! It also uses filehandle ARGV internally\*(--<> is just a synonym for
  786. ! <ARGV>, which is magical.
  787. ! (The pseudo code above doesn't work because it treats <ARGV> as non-magical.)
  788. ! .PP
  789. ! You can modify @ARGV before the first <> as long as the array ends up
  790. ! containing the list of filenames you really want.
  791.   Line numbers ($.) continue as if the input was one big happy file.
  792.   (But see example under eof for how to reset line numbers on each file.)
  793.   .PP
  794. ***************
  795. *** 1288,1296 ****
  796.   .Sh "Simple statements"
  797.   The only kind of simple statement is an expression evaluated for its side
  798.   effects.
  799. ! Every expression (simple statement) must be terminated with a semicolon.
  800. ! Note that this is like C, but unlike Pascal (and
  801. ! .IR awk ).
  802.   .PP
  803.   Any simple statement may optionally be followed by a
  804.   single modifier, just before the terminating semicolon.
  805. --- 1305,1313 ----
  806.   .Sh "Simple statements"
  807.   The only kind of simple statement is an expression evaluated for its side
  808.   effects.
  809. ! Every simple statement must be terminated with a semicolon, unless it is the
  810. ! final statement in a block, in which case the semicolon is optional.
  811. ! (Semicolon is still encouraged there if the block takes up more than one line).
  812.   .PP
  813.   Any simple statement may optionally be followed by a
  814.   single modifier, just before the terminating semicolon.
  815. ***************
  816. *** 1416,1422 ****
  817.   slice operations on arrays.
  818.   .Sp
  819.   In a scalar context, .\|. returns a boolean value.
  820. ! The operator is bistable, like a flip-flop..
  821.   Each .\|. operator maintains its own boolean state.
  822.   It is false as long as its left operand is false.
  823.   Once the left operand is true, the range operator stays true
  824. --- 1433,1440 ----
  825.   slice operations on arrays.
  826.   .Sp
  827.   In a scalar context, .\|. returns a boolean value.
  828. ! The operator is bistable, like a flip-flop, and
  829. ! emulates the line-range (comma) operator of sed, awk, and various editors.
  830.   Each .\|. operator maintains its own boolean state.
  831.   It is false as long as its left operand is false.
  832.   Once the left operand is true, the range operator stays true
  833. ***************
  834. *** 1423,1435 ****
  835.   until the right operand is true,
  836.   AFTER which the range operator becomes false again.
  837.   (It doesn't become false till the next time the range operator is evaluated.
  838. ! It can become false on the same evaluation it became true, but it still returns
  839. ! true once.)
  840.   The right operand is not evaluated while the operator is in the \*(L"false\*(R" state,
  841.   and the left operand is not evaluated while the operator is in the \*(L"true\*(R" state.
  842. - The scalar .\|. operator is primarily intended for doing line number ranges
  843. - after
  844. - the fashion of \fIsed\fR or \fIawk\fR.
  845.   The precedence is a little lower than || and &&.
  846.   The value returned is either the null string for false, or a sequence number
  847.   (beginning with 1) for true.
  848. --- 1441,1452 ----
  849.   until the right operand is true,
  850.   AFTER which the range operator becomes false again.
  851.   (It doesn't become false till the next time the range operator is evaluated.
  852. ! It can test the right operand and become false on the
  853. ! same evaluation it became true (as in awk), but it still returns true once.
  854. ! If you don't want it to test the right operand till the next
  855. ! evaluation (as in sed), use three dots (.\|.\|.) instead of two.)
  856.   The right operand is not evaluated while the operator is in the \*(L"false\*(R" state,
  857.   and the left operand is not evaluated while the operator is in the \*(L"true\*(R" state.
  858.   The precedence is a little lower than || and &&.
  859.   The value returned is either the null string for false, or a sequence number
  860.   (beginning with 1) for true.
  861. ***************
  862. *** 1472,1484 ****
  863.   arithmetic operators.
  864.   The operator may be any of:
  865.   .nf
  866. !     \-r    File is readable by effective uid.
  867. !     \-w    File is writable by effective uid.
  868. !     \-x    File is executable by effective uid.
  869.       \-o    File is owned by effective uid.
  870. !     \-R    File is readable by real uid.
  871. !     \-W    File is writable by real uid.
  872. !     \-X    File is executable by real uid.
  873.       \-O    File is owned by real uid.
  874.       \-e    File exists.
  875.       \-z    File has zero size.
  876. --- 1489,1501 ----
  877.   arithmetic operators.
  878.   The operator may be any of:
  879.   .nf
  880. !     \-r    File is readable by effective uid/gid.
  881. !     \-w    File is writable by effective uid/gid.
  882. !     \-x    File is executable by effective uid/gid.
  883.       \-o    File is owned by effective uid.
  884. !     \-R    File is readable by real uid/gid.
  885. !     \-W    File is writable by real uid/gid.
  886. !     \-X    File is executable by real uid/gid.
  887.       \-O    File is owned by real uid.
  888.       \-e    File exists.
  889.       \-z    File has zero size.
  890. ***************
  891. *** 1655,1660 ****
  892. --- 1672,1691 ----
  893.   All other unary operators have a precedence greater than relational operators
  894.   but less than arithmetic operators.
  895.   See the section on Precedence.
  896. + .PP
  897. + For operators that can be used in either a scalar or array context,
  898. + failure is generally indicated in a scalar context by returning
  899. + the undefined value, and in an array context by returning the null list.
  900. + Remember though that
  901. + THERE IS NO GENERAL RULE FOR CONVERTING A LIST INTO A SCALAR.
  902. + Each operator decides which sort of scalar it would be most
  903. + appropriate to return.
  904. + Some operators return the length of the list
  905. + that would have been returned in an array context.
  906. + Some operators return the first value in the list.
  907. + Some operators return the last value in the list.
  908. + Some operators return a count of successful operations.
  909. + In general, they do what you want, unless you want consistency.
  910.   .Ip "/PATTERN/" 8 4
  911.   See m/PATTERN/.
  912.   .Ip "?PATTERN?" 8 4
  913. ***************
  914. *** 2389,2395 ****
  915.   .Ip "endservent" 8
  916.   These routines perform the same functions as their counterparts in the
  917.   system library.
  918. ! The return values from the various get routines are as follows:
  919.   .nf
  920.   
  921.       ($name,$passwd,$uid,$gid,
  922. --- 2420,2427 ----
  923.   .Ip "endservent" 8
  924.   These routines perform the same functions as their counterparts in the
  925.   system library.
  926. ! Within an array context,
  927. ! the return values from the various get routines are as follows:
  928.   .nf
  929.   
  930.       ($name,$passwd,$uid,$gid,
  931. ***************
  932. *** 2401,2410 ****
  933.       ($name,$aliases,$port,$proto) = getserv.\|.\|.
  934.   
  935.   .fi
  936.   The $members value returned by getgr.\|.\|. is a space separated list
  937.   of the login names of the members of the group.
  938.   .Sp
  939. ! The @addrs value returned by the gethost.\|.\|. functions is a list of the
  940.   raw addresses returned by the corresponding system library call.
  941.   In the Internet domain, each address is four bytes long and you can unpack
  942.   it by saying something like:
  943. --- 2433,2461 ----
  944.       ($name,$aliases,$port,$proto) = getserv.\|.\|.
  945.   
  946.   .fi
  947. + (If the entry doesn't exist you get a null list.)
  948. + .Sp
  949. + Within a scalar context, you get the name, unless the function was a
  950. + lookup by name, in which case you get the other thing, whatever it is.
  951. + (If the entry doesn't exist you get the undefined value.)
  952. + For example:
  953. + .nf
  954. +     $uid = getpwnam
  955. +     $name = getpwuid
  956. +     $name = getpwent
  957. +     $gid = getgrnam
  958. +     $name = getgrgid
  959. +     $name = getgrent
  960. +     etc.
  961. + .fi
  962.   The $members value returned by getgr.\|.\|. is a space separated list
  963.   of the login names of the members of the group.
  964.   .Sp
  965. ! For the gethost.\|.\|. functions, if the h_errno variable is supported in C,
  966. ! it will be returned to you via $? if the function call fails.
  967. ! The @addrs value returned by a successful call is a list of the
  968.   raw addresses returned by the corresponding system library call.
  969.   In the Internet domain, each address is four bytes long and you can unpack
  970.   it by saying something like:
  971. ***************
  972. *** 2807,2813 ****
  973.       ($one,$five,$fifteen) = (\`uptime\` =~ /(\ed+\e.\ed+)/g);
  974.   
  975.       # scalar context
  976. !     $/ = 1; $* = 1;
  977.       while ($paragraph = <>) {
  978.           while ($paragraph =~ /[a-z][\'")]*[.!?]+[\'")]*\es/g) {
  979.           $sentences++;
  980. --- 2858,2864 ----
  981.       ($one,$five,$fifteen) = (\`uptime\` =~ /(\ed+\e.\ed+)/g);
  982.   
  983.       # scalar context
  984. !     $/ = ""; $* = 1;
  985.       while ($paragraph = <>) {
  986.           while ($paragraph =~ /[a-z][\'")]*[.!?]+[\'")]*\es/g) {
  987.           $sentences++;
  988. ***************
  989. *** 3330,3335 ****
  990. --- 3381,3389 ----
  991.   
  992.   .fi
  993.   Note that the file will not be included twice under the same specified name.
  994. + The file must return true as the last statement to indicate successful
  995. + execution of any initialization code, so it's customary to end
  996. + such a file with \*(L"1;\*(R" unless you're sure it'll return true otherwise.
  997.   .Ip "reset(EXPR)" 8 6
  998.   .Ip "reset EXPR" 8
  999.   .Ip "reset" 8
  1000. ***************
  1001. *** 3404,3409 ****
  1002. --- 3458,3466 ----
  1003.   interpretation is done on the replacement string (the e modifier overrides
  1004.   this, however); if backquotes are used, the replacement string is a command
  1005.   to execute whose output will be used as the actual replacement text.
  1006. + If the PATTERN is delimited by bracketing quotes, the REPLACEMENT
  1007. + has its own pair of quotes, which may or may not be bracketing quotes, e.g.
  1008. + s(foo)(bar) or s<foo>/bar/.
  1009.   If no string is specified via the =~ or !~ operator,
  1010.   the $_ string is searched and modified.
  1011.   (The string specified with =~ must be a scalar variable, an array element,
  1012. ***************
  1013. *** 3661,3679 ****
  1014.   
  1015.   .ne 2
  1016.       # same thing, but with explicit sort routine
  1017. !     @articles = sort {$a cmp $b;} @files;
  1018.   
  1019.   .ne 2
  1020.       # same thing in reversed order
  1021. !     @articles = sort {$b cmp $a;} @files;
  1022.   
  1023.   .ne 2
  1024.       # sort numerically ascending
  1025. !     @articles = sort {$a <=> $b;} @files;
  1026.   
  1027.   .ne 2
  1028.       # sort numerically descending
  1029. !     @articles = sort {$b <=> $a;} @files;
  1030.   
  1031.   .ne 5
  1032.       # sort using explicit subroutine name
  1033. --- 3718,3736 ----
  1034.   
  1035.   .ne 2
  1036.       # same thing, but with explicit sort routine
  1037. !     @articles = sort {$a cmp $b} @files;
  1038.   
  1039.   .ne 2
  1040.       # same thing in reversed order
  1041. !     @articles = sort {$b cmp $a} @files;
  1042.   
  1043.   .ne 2
  1044.       # sort numerically ascending
  1045. !     @articles = sort {$a <=> $b} @files;
  1046.   
  1047.   .ne 2
  1048.       # sort numerically descending
  1049. !     @articles = sort {$b <=> $a} @files;
  1050.   
  1051.   .ne 5
  1052.       # sort using explicit subroutine name
  1053. ***************
  1054. *** 3826,3831 ****
  1055. --- 3883,3889 ----
  1056.   .Ip "stat SCALARVARIABLE" 8
  1057.   Returns a 13-element array giving the statistics for a file, either the file
  1058.   opened via FILEHANDLE, or named by EXPR.
  1059. + Returns a null list if the stat fails.
  1060.   Typically used as follows:
  1061.   .nf
  1062.   
  1063. ***************
  1064. *** 3902,3908 ****
  1065.   .ne 12
  1066.       $search = \'while (<>) { study;\';
  1067.       foreach $word (@words) {
  1068. !         $search .= "++\e$seen{\e$ARGV} if /\eb$word\eb/;\en";
  1069.       }
  1070.       $search .= "}";
  1071.       @ARGV = @files;
  1072. --- 3960,3966 ----
  1073.   .ne 12
  1074.       $search = \'while (<>) { study;\';
  1075.       foreach $word (@words) {
  1076. !         $search .= "++\e$seen{\e$ARGV} if /\e\eb$word\e\eb/;\en";
  1077.       }
  1078.       $search .= "}";
  1079.       @ARGV = @files;
  1080. ***************
  1081. *** 4023,4028 ****
  1082. --- 4081,4089 ----
  1083.   .I y
  1084.   is provided as a synonym for
  1085.   .IR tr .
  1086. + If the SEARCHLIST is delimited by bracketing quotes, the REPLACEMENTLIST
  1087. + has its own pair of quotes, which may or may not be bracketing quotes, e.g.
  1088. + tr[A-Z][a-z] or tr(+-*/)/ABCD/.
  1089.   .Sp
  1090.   If the c modifier is specified, the SEARCHLIST character set is complemented.
  1091.   If the d modifier is specified, any characters specified by SEARCHLIST that
  1092. ***************
  1093. *** 4880,4885 ****
  1094. --- 4941,4952 ----
  1095.   if set to the null string.
  1096.   You may set it to a multicharacter string to match a multi-character
  1097.   delimiter.
  1098. + Note that setting it to "\en\en" means something slightly different
  1099. + than setting it to "", if the file contains consecutive blank lines.
  1100. + Setting it to "" will treat two or more consecutive blank lines as a single
  1101. + blank line.
  1102. + Setting it to "\en\en" will blindly assume that the next input character
  1103. + belongs to the next paragraph, even if it's a newline.
  1104.   (Mnemonic: / is used to delimit line boundaries when quoting poetry.)
  1105.   .Ip $, 8
  1106.   The output field separator for the print operator.
  1107. ***************
  1108. *** 4974,4989 ****
  1109.   there was a core dump.
  1110.   (Mnemonic: similar to sh and ksh.)
  1111.   .Ip $& 8 4
  1112. ! The string matched by the last pattern match (not counting any matches hidden
  1113.   within a BLOCK or eval enclosed by the current BLOCK).
  1114.   (Mnemonic: like & in some editors.)
  1115.   .Ip $\` 8 4
  1116. ! The string preceding whatever was matched by the last pattern match
  1117.   (not counting any matches hidden within a BLOCK or eval enclosed by the current
  1118.   BLOCK).
  1119.   (Mnemonic: \` often precedes a quoted string.)
  1120.   .Ip $\' 8 4
  1121. ! The string following whatever was matched by the last pattern match
  1122.   (not counting any matches hidden within a BLOCK or eval enclosed by the current
  1123.   BLOCK).
  1124.   (Mnemonic: \' often follows a quoted string.)
  1125. --- 5041,5057 ----
  1126.   there was a core dump.
  1127.   (Mnemonic: similar to sh and ksh.)
  1128.   .Ip $& 8 4
  1129. ! The string matched by the last successful pattern match
  1130. ! (not counting any matches hidden
  1131.   within a BLOCK or eval enclosed by the current BLOCK).
  1132.   (Mnemonic: like & in some editors.)
  1133.   .Ip $\` 8 4
  1134. ! The string preceding whatever was matched by the last successful pattern match
  1135.   (not counting any matches hidden within a BLOCK or eval enclosed by the current
  1136.   BLOCK).
  1137.   (Mnemonic: \` often precedes a quoted string.)
  1138.   .Ip $\' 8 4
  1139. ! The string following whatever was matched by the last successful pattern match
  1140.   (not counting any matches hidden within a BLOCK or eval enclosed by the current
  1141.   BLOCK).
  1142.   (Mnemonic: \' often follows a quoted string.)
  1143. ***************
  1144. *** 5158,5163 ****
  1145. --- 5226,5233 ----
  1146.   (Mnemonic: value of
  1147.   .B \-i
  1148.   switch.)
  1149. + .Ip $^L 8 2
  1150. + What formats output to perform a formfeed.  Default is \ef.
  1151.   .Ip $^P 8 2
  1152.   The internal flag that the debugger clears so that it doesn't
  1153.   debug itself.  You could conceivable disable debugging yourself
  1154. ***************
  1155. *** 5635,5648 ****
  1156.   The tainting mechanism is intended to prevent stupid mistakes, not to remove
  1157.   the need for thought.
  1158.   .SH ENVIRONMENT
  1159. ! .I Perl
  1160. ! uses PATH in executing subprocesses, and in finding the script if \-S
  1161.   is used.
  1162. ! HOME or LOGDIR are used if chdir has no argument.
  1163.   .PP
  1164.   Apart from these,
  1165.   .I perl
  1166. ! uses no environment variables, except to make them available
  1167.   to the script being executed, and to child processes.
  1168.   However, scripts running setuid would do well to execute the following lines
  1169.   before doing anything else, just to keep people honest:
  1170. --- 5705,5730 ----
  1171.   The tainting mechanism is intended to prevent stupid mistakes, not to remove
  1172.   the need for thought.
  1173.   .SH ENVIRONMENT
  1174. ! .Ip HOME 12 4
  1175. ! Used if chdir has no argument.
  1176. ! .Ip LOGDIR 12 4
  1177. ! Used if chdir has no argument and HOME is not set.
  1178. ! .Ip PATH 12 4
  1179. ! Used in executing subprocesses, and in finding the script if \-S
  1180.   is used.
  1181. ! .Ip PERLLIB 12 4
  1182. ! A colon-separated list of directories in which to look for Perl library
  1183. ! files before looking in the standard library and the current directory.
  1184. ! .Ip PERLDB 12 4
  1185. ! The command used to get the debugger code.  If unset, uses
  1186. ! .br
  1187. !     require 'perldb.pl'
  1188.   .PP
  1189.   Apart from these,
  1190.   .I perl
  1191. ! uses no other environment variables, except to make them available
  1192.   to the script being executed, and to child processes.
  1193.   However, scripts running setuid would do well to execute the following lines
  1194.   before doing anything else, just to keep people honest:
  1195. ***************
  1196. *** 5686,5694 ****
  1197.   users should take special note of the following:
  1198.   .Ip * 4 2
  1199.   Semicolons are required after all simple statements in
  1200. ! .IR perl .
  1201. ! Newline
  1202. ! is not a statement delimiter.
  1203.   .Ip * 4 2
  1204.   Curly brackets are required on ifs and whiles.
  1205.   .Ip * 4 2
  1206. --- 5768,5776 ----
  1207.   users should take special note of the following:
  1208.   .Ip * 4 2
  1209.   Semicolons are required after all simple statements in
  1210. ! .I perl
  1211. ! (except at the end of a block).
  1212. ! Newline is not a statement delimiter.
  1213.   .Ip * 4 2
  1214.   Curly brackets are required on ifs and whiles.
  1215.   .Ip * 4 2
  1216. ***************
  1217. *** 5917,5922 ****
  1218. --- 5999,6005 ----
  1219.   from memory size), there are still a few arbitrary limits:
  1220.   a given identifier may not be longer than 255 characters,
  1221.   and no component of your PATH may be longer than 255 if you use \-S.
  1222. + A regular expression may not compile to more than 32767 bytes internally.
  1223.   .PP
  1224.   .I Perl
  1225.   actually stands for Pathologically Eclectic Rubbish Lister, but don't tell
  1226.  
  1227. Index: atarist/perldb.diff
  1228. *** atarist/perldb.diff.old    Mon Jun  8 17:35:23 1992
  1229. --- atarist/perldb.diff    Mon Jun  8 17:44:46 1992
  1230. ***************
  1231. *** 0 ****
  1232. --- 1,179 ----
  1233. + *** ../../../lib/perldb.pl    Mon Nov 11 10:40:22 1991
  1234. + --- perldb.pl    Mon May 18 17:00:56 1992
  1235. + ***************
  1236. + *** 1,10 ****
  1237. +   package DB;
  1238. +   
  1239. + ! # modified Perl debugger, to be run from Emacs in perldb-mode
  1240. + ! # Ray Lischner (uunet!mntgfx!lisch) as of 5 Nov 1990
  1241. + ! # Johan Vromans -- upgrade to 4.0 pl 10
  1242. + ! 
  1243. + ! $header = '$RCSfile: perldb.diff,v $$Revision: 4.0.1.1 $$Date: 92/06/08 11:50:28 $';
  1244. +   #
  1245. +   # This file is automatically included if you do perl -d.
  1246. +   # It's probably not useful to include this yourself.
  1247. + --- 1,6 ----
  1248. +   package DB;
  1249. +   
  1250. + ! $header = '$RCSfile: perldb.diff,v $$Revision: 4.0.1.1 $$Date: 92/06/08 11:50:28 $';
  1251. +   #
  1252. +   # This file is automatically included if you do perl -d.
  1253. +   # It's probably not useful to include this yourself.
  1254. + ***************
  1255. + *** 14,22 ****
  1256. +   # have a breakpoint.  It also inserts a do 'perldb.pl' before the first line.
  1257. +   #
  1258. +   # $Log:    perldb.diff,v $
  1259. +   # Revision 4.0.1.1  92/06/08  11:50:28  lwall
  1260. +   # Initial revision
  1261. +   # 
  1262. + - # Revision 4.0.1.2  91/11/05  17:55:58  lwall
  1263. + - # patch11: perldb.pl modified to run within emacs in perldb-mode
  1264. + - # 
  1265. +   # Revision 4.0.1.1  91/06/07  11:17:44  lwall
  1266. +   # patch4: added $^P variable to control calling of perldb routines
  1267. +   # patch4: debugger sometimes listed wrong number of lines for a statement
  1268. + --- 10,15 ----
  1269. + ***************
  1270. + *** 56,63 ****
  1271. +   # 
  1272. +   #
  1273. +   
  1274. + ! open(IN, "</dev/tty") || open(IN,  "<&STDIN");    # so we don't dingle stdin
  1275. + ! open(OUT,">/dev/tty") || open(OUT, ">&STDOUT");    # so we don't dongle stdout
  1276. +   select(OUT);
  1277. +   $| = 1;                # for DB'OUT
  1278. +   select(STDOUT);
  1279. + --- 49,56 ----
  1280. +   # 
  1281. +   #
  1282. +   
  1283. + ! open(IN, "</dev/console") || open(IN,  "<&STDIN");    # so we don't dingle stdin
  1284. + ! open(OUT,">/dev/console") || open(OUT, ">&STDOUT");    # so we don't dongle stdout
  1285. +   select(OUT);
  1286. +   $| = 1;                # for DB'OUT
  1287. +   select(STDOUT);
  1288. + ***************
  1289. + *** 64,79 ****
  1290. +   $| = 1;                # for real STDOUT
  1291. +   $sub = '';
  1292. +   
  1293. + - # Is Perl being run from Emacs?
  1294. + - $emacs = $main'ARGV[$[] eq '-emacs';
  1295. + - shift(@main'ARGV) if $emacs;
  1296. + - 
  1297. +   $header =~ s/.Header: ([^,]+),v(\s+\S+\s+\S+).*$/$1$2/;
  1298. + ! print OUT "\nLoading DB routines from $header\n";
  1299. + ! print OUT ("Emacs support ",
  1300. + !        $emacs ? "enabled" : "available",
  1301. + !        ".\n");
  1302. + ! print OUT "\nEnter h for help.\n\n";
  1303. +   
  1304. +   sub DB {
  1305. +       &save;
  1306. + --- 57,64 ----
  1307. +   $| = 1;                # for real STDOUT
  1308. +   $sub = '';
  1309. +   
  1310. +   $header =~ s/.Header: ([^,]+),v(\s+\S+\s+\S+).*$/$1$2/;
  1311. + ! print OUT "\nLoading DB routines from $header\n\nEnter h for help.\n\n";
  1312. +   
  1313. +   sub DB {
  1314. +       &save;
  1315. + ***************
  1316. + *** 93,107 ****
  1317. +       }
  1318. +       }
  1319. +       if ($single || $trace || $signal) {
  1320. + !     if ($emacs) {
  1321. + !         print OUT "\032\032$filename:$line:0\n";
  1322. + !     } else {
  1323. + !         print OUT "$package'" unless $sub =~ /'/;
  1324. + !         print OUT "$sub($filename:$line):\t",$dbline[$line];
  1325. + !         for ($i = $line + 1; $i <= $max && $dbline[$i] == 0; ++$i) {
  1326. + !         last if $dbline[$i] =~ /^\s*(}|#|\n)/;
  1327. + !         print OUT "$sub($filename:$i):\t",$dbline[$i];
  1328. + !         }
  1329. +       }
  1330. +       }
  1331. +       $evalarg = $action, &eval if $action;
  1332. + --- 78,88 ----
  1333. +       }
  1334. +       }
  1335. +       if ($single || $trace || $signal) {
  1336. + !     print OUT "$package'" unless $sub =~ /'/;
  1337. + !     print OUT "$sub($filename:$line):\t",$dbline[$line];
  1338. + !     for ($i = $line + 1; $i <= $max && $dbline[$i] == 0; ++$i) {
  1339. + !         last if $dbline[$i] =~ /^\s*(;|}|#|\n)/;
  1340. + !         print OUT "$sub($filename:$i):\t",$dbline[$i];
  1341. +       }
  1342. +       }
  1343. +       $evalarg = $action, &eval if $action;
  1344. + ***************
  1345. + *** 263,276 ****
  1346. +               $i = $2;
  1347. +               $i = $line if $i eq '.';
  1348. +               $i = 1 if $i < 1;
  1349. + !             if ($emacs) {
  1350. + !             print OUT "\032\032$filename:$i:0\n";
  1351. + !             $i = $end;
  1352. + !             } else {
  1353. + !             for (; $i <= $end; $i++) {
  1354. + !                 print OUT "$i:\t", $dbline[$i];
  1355. + !                 last if $signal;
  1356. + !             }
  1357. +               }
  1358. +               $start = $i;    # remember in case they want more
  1359. +               $start = $max if $start > $max;
  1360. + --- 244,252 ----
  1361. +               $i = $2;
  1362. +               $i = $line if $i eq '.';
  1363. +               $i = 1 if $i < 1;
  1364. + !             for (; $i <= $end; $i++) {
  1365. + !             print OUT "$i:\t", $dbline[$i];
  1366. + !             last if $signal;
  1367. +               }
  1368. +               $start = $i;    # remember in case they want more
  1369. +               $start = $max if $start > $max;
  1370. + ***************
  1371. + *** 417,427 ****
  1372. +               $start = 1 if ($start > $max);
  1373. +               last if ($start == $end);
  1374. +               if ($dbline[$start] =~ m'."\n$pat\n".'i) {
  1375. + !                 if ($emacs) {
  1376. + !                 print OUT "\032\032$filename:$start:0\n";
  1377. + !                 } else {
  1378. + !                 print OUT "$start:\t", $dbline[$start], "\n";
  1379. + !                 }
  1380. +                   last;
  1381. +               }
  1382. +               } ';
  1383. + --- 393,399 ----
  1384. +               $start = 1 if ($start > $max);
  1385. +               last if ($start == $end);
  1386. +               if ($dbline[$start] =~ m'."\n$pat\n".'i) {
  1387. + !                 print OUT "$start:\t", $dbline[$start], "\n";
  1388. +                   last;
  1389. +               }
  1390. +               } ';
  1391. + ***************
  1392. + *** 445,455 ****
  1393. +               $start = $max if ($start <= 0);
  1394. +               last if ($start == $end);
  1395. +               if ($dbline[$start] =~ m'."\n$pat\n".'i) {
  1396. + !                 if ($emacs) {
  1397. + !                 print OUT "\032\032$filename:$start:0\n";
  1398. + !                 } else {
  1399. + !                 print OUT "$start:\t", $dbline[$start], "\n";
  1400. + !                 }
  1401. +                   last;
  1402. +               }
  1403. +               } ';
  1404. + --- 417,423 ----
  1405. +               $start = $max if ($start <= 0);
  1406. +               last if ($start == $end);
  1407. +               if ($dbline[$start] =~ m'."\n$pat\n".'i) {
  1408. + !                 print OUT "$start:\t", $dbline[$start], "\n";
  1409. +                   last;
  1410. +               }
  1411. +               } ';
  1412.  
  1413. Index: lib/perldb.pl
  1414. Prereq: 4.0.1.2
  1415. *** lib/perldb.pl.old    Mon Jun  8 17:49:06 1992
  1416. --- lib/perldb.pl    Mon Jun  8 17:49:07 1992
  1417. ***************
  1418. *** 4,10 ****
  1419.   # Ray Lischner (uunet!mntgfx!lisch) as of 5 Nov 1990
  1420.   # Johan Vromans -- upgrade to 4.0 pl 10
  1421.   
  1422. ! $header = '$RCSfile: perldb.pl,v $$Revision: 4.0.1.2 $$Date: 91/11/05 17:55:58 $';
  1423.   #
  1424.   # This file is automatically included if you do perl -d.
  1425.   # It's probably not useful to include this yourself.
  1426. --- 4,10 ----
  1427.   # Ray Lischner (uunet!mntgfx!lisch) as of 5 Nov 1990
  1428.   # Johan Vromans -- upgrade to 4.0 pl 10
  1429.   
  1430. ! $header = '$RCSfile: perldb.pl,v $$Revision: 4.0.1.3 $$Date: 92/06/08 13:43:57 $';
  1431.   #
  1432.   # This file is automatically included if you do perl -d.
  1433.   # It's probably not useful to include this yourself.
  1434. ***************
  1435. *** 14,19 ****
  1436. --- 14,23 ----
  1437.   # have a breakpoint.  It also inserts a do 'perldb.pl' before the first line.
  1438.   #
  1439.   # $Log:    perldb.pl,v $
  1440. + # Revision 4.0.1.3  92/06/08  13:43:57  lwall
  1441. + # patch20: support for MSDOS folded into perldb.pl
  1442. + # patch20: perldb couldn't debug file containing '-', such as STDIN designator
  1443. + # 
  1444.   # Revision 4.0.1.2  91/11/05  17:55:58  lwall
  1445.   # patch11: perldb.pl modified to run within emacs in perldb-mode
  1446.   # 
  1447. ***************
  1448. *** 56,63 ****
  1449.   # 
  1450.   #
  1451.   
  1452. ! open(IN, "</dev/tty") || open(IN,  "<&STDIN");    # so we don't dingle stdin
  1453. ! open(OUT,">/dev/tty") || open(OUT, ">&STDOUT");    # so we don't dongle stdout
  1454.   select(OUT);
  1455.   $| = 1;                # for DB'OUT
  1456.   select(STDOUT);
  1457. --- 60,76 ----
  1458.   # 
  1459.   #
  1460.   
  1461. ! if (-e "/dev/tty") {
  1462. !     $console = "/dev/tty";
  1463. !     $rcfile=".perldb";
  1464. ! }
  1465. ! else {
  1466. !     $console = "con";
  1467. !     $rcfile="perldb.ini";
  1468. ! }
  1469. ! open(IN, "<$console") || open(IN,  "<&STDIN");    # so we don't dingle stdin
  1470. ! open(OUT,">$console") || open(OUT, ">&STDOUT");    # so we don't dongle stdout
  1471.   select(OUT);
  1472.   $| = 1;                # for DB'OUT
  1473.   select(STDOUT);
  1474. ***************
  1475. *** 304,310 ****
  1476.               $cond = $2 || '1';
  1477.               $subname = "$package'" . $subname unless $subname =~ /'/;
  1478.               $subname = "main" . $subname if substr($subname,0,1) eq "'";
  1479. !             ($filename,$i) = split(/[:-]/, $sub{$subname});
  1480.               if ($i) {
  1481.               *dbline = "_<$filename";
  1482.               ++$i while $dbline[$i] == 0 && $i < $#dbline;
  1483. --- 317,324 ----
  1484.               $cond = $2 || '1';
  1485.               $subname = "$package'" . $subname unless $subname =~ /'/;
  1486.               $subname = "main" . $subname if substr($subname,0,1) eq "'";
  1487. !             ($filename,$i) = split(/:/, $sub{$subname});
  1488. !             $i += 0;
  1489.               if ($i) {
  1490.               *dbline = "_<$filename";
  1491.               ++$i while $dbline[$i] == 0 && $i < $#dbline;
  1492. ***************
  1493. *** 568,581 ****
  1494.       s/(.*)/'$1'/ unless /^-?[\d.]+$/;
  1495.   }
  1496.   
  1497. ! if (-f '.perldb') {
  1498. !     do './.perldb';
  1499.   }
  1500. ! elsif (-f "$ENV{'LOGDIR'}/.perldb") {
  1501. !     do "$ENV{'LOGDIR'}/.perldb";
  1502.   }
  1503. ! elsif (-f "$ENV{'HOME'}/.perldb") {
  1504. !     do "$ENV{'HOME'}/.perldb";
  1505.   }
  1506.   
  1507.   1;
  1508. --- 582,595 ----
  1509.       s/(.*)/'$1'/ unless /^-?[\d.]+$/;
  1510.   }
  1511.   
  1512. ! if (-f $rcfile) {
  1513. !     do "./$rcfile";
  1514.   }
  1515. ! elsif (-f "$ENV{'LOGDIR'}/$rcfile") {
  1516. !     do "$ENV{'LOGDIR'}/$rcfile";
  1517.   }
  1518. ! elsif (-f "$ENV{'HOME'}/$rcfile") {
  1519. !     do "$ENV{'HOME'}/$rcfile";
  1520.   }
  1521.   
  1522.   1;
  1523.  
  1524. Index: atarist/perlglob.c
  1525. *** atarist/perlglob.c.old    Mon Jun  8 17:44:50 1992
  1526. --- atarist/perlglob.c    Mon Jun  8 17:44:51 1992
  1527. ***************
  1528. *** 0 ****
  1529. --- 1,45 ----
  1530. + /*
  1531. +  * glob and echo any globbed args
  1532. +  *
  1533. +  *  ++jrb  bammi@cadence.com
  1534. +  */
  1535. + #include <stdio.h>
  1536. + #if __STDC__
  1537. + # include <compiler.h>
  1538. + #else
  1539. + # define __PROTO(X) ()
  1540. + #endif
  1541. + char    **glob __PROTO((char *patt, int decend_dir));
  1542. + int    contains_wild __PROTO((char *patt));
  1543. + void    free_all __PROTO((void));
  1544. + int main(argc, argv)
  1545. + int argc;
  1546. + char **argv;
  1547. + {
  1548. +     --argc; ++argv;
  1549. +     while(argc--)
  1550. +     {
  1551. +     char *word = *argv;
  1552. +     char **list;
  1553. +     int did_some = 0;
  1554. +     if(contains_wild(word) && (list = glob(word, 0)))
  1555. +     {
  1556. +         while(*list)
  1557. +         {
  1558. +         fputs(*list, stdout);
  1559. +             if(*++list) putchar(' ');
  1560. +         }
  1561. +         free_all();
  1562. +         did_some = 1;
  1563. +     }
  1564. +     if(*++argv && did_some) putchar(' ');
  1565. +     }
  1566. +     putchar('\0');
  1567. +     return 0;
  1568. + }
  1569.  
  1570. Index: os2/perlglob.cs
  1571. *** os2/perlglob.cs.old    Mon Jun  8 17:50:11 1992
  1572. --- os2/perlglob.cs    Mon Jun  8 17:50:11 1992
  1573. ***************
  1574. *** 1,9 ****
  1575.   os2\glob.c
  1576. - (-DPERLGLOB os2\director.c)
  1577.   
  1578.   setargv.obj
  1579. ! os2\perlglob.def
  1580. ! os2\perlglob.bad
  1581.   perlglob.exe
  1582.   
  1583.   -AS -LB -S0x1000
  1584. --- 1,9 ----
  1585.   os2\glob.c
  1586.   
  1587.   setargv.obj
  1588. ! os2\perl.def
  1589. ! os2\perl.bad
  1590.   perlglob.exe
  1591.   
  1592.   -AS -LB -S0x1000
  1593.  
  1594. Index: os2/perlglob.def
  1595. *** os2/perlglob.def.old    Mon Jun  8 17:50:13 1992
  1596. --- os2/perlglob.def    Mon Jun  8 17:50:13 1992
  1597. ***************
  1598. *** 1,2 ****
  1599. ! NAME PERLGLOB WINDOWCOMPAT NEWFILES
  1600. ! DESCRIPTION 'Filename globbing for PERL - for MS-DOS and OS/2'
  1601. --- 1 ----
  1602. ! (deprecated)
  1603.  
  1604. Index: os2/popen.c
  1605. *** os2/popen.c.old    Mon Jun  8 17:50:15 1992
  1606. --- os2/popen.c    Mon Jun  8 17:50:15 1992
  1607. ***************
  1608. *** 65,71 ****
  1609.           if ( _osmode == DOS_MODE )
  1610.             return dos_popen(cmd, mode);
  1611.   
  1612. !     if (DosMakePipe((PHFILE) &p[0], (PHFILE) &p[1], 4096) < 0)
  1613.                   return NULL;
  1614.   
  1615.           myside = tst(p[WRITEH], p[READH]);
  1616. --- 65,71 ----
  1617.           if ( _osmode == DOS_MODE )
  1618.             return dos_popen(cmd, mode);
  1619.   
  1620. !         if ( _pipe(p, 4096, 0) )
  1621.                   return NULL;
  1622.   
  1623.           myside = tst(p[WRITEH], p[READH]);
  1624. ***************
  1625. *** 124,130 ****
  1626.   {
  1627.     int res;
  1628.   
  1629. !   if ( res = DosMakePipe((PHFILE) &filedes[0], (PHFILE) &filedes[1], 4096) )
  1630.       return res;
  1631.   
  1632.     DosSetFHandState(filedes[0], OPEN_FLAGS_NOINHERIT);
  1633. --- 124,130 ----
  1634.   {
  1635.     int res;
  1636.   
  1637. !   if ( res = _pipe(filedes, 4096, 0) )
  1638.       return res;
  1639.   
  1640.     DosSetFHandState(filedes[0], OPEN_FLAGS_NOINHERIT);
  1641. ***************
  1642. *** 149,154 ****
  1643. --- 149,155 ----
  1644.   {
  1645.       FILE *current;
  1646.       char name[128];
  1647. +     char *tmp = getenv("TMP");
  1648.       int cur;
  1649.       pipemode curmode;
  1650.   
  1651. ***************
  1652. *** 165,172 ****
  1653.       /*
  1654.       ** get a name to use.
  1655.       */
  1656. !     strcpy(name, "piXXXXXX");
  1657. !     Mktemp(name);
  1658.   
  1659.       /*
  1660.       ** If we're reading, just call system to get a file filled with
  1661. --- 166,176 ----
  1662.       /*
  1663.       ** get a name to use.
  1664.       */
  1665. !     strcpy(name, tmp ? tmp : "\\");
  1666. !     if ( name[strlen(name) - 1] != '\\' )
  1667. !       strcat(name, "\\");
  1668. !     strcat(name, "piXXXXXX");
  1669. !     mktemp(name);
  1670.   
  1671.       /*
  1672.       ** If we're reading, just call system to get a file filled with
  1673.  
  1674. Index: atarist/test/printenv
  1675. *** atarist/test/printenv.old    Mon Jun  8 17:45:16 1992
  1676. --- atarist/test/printenv    Mon Jun  8 17:45:16 1992
  1677. ***************
  1678. *** 0 ****
  1679. --- 1,16 ----
  1680. + $exit = 0;
  1681. + $\ = "\n";
  1682. + if($#ARGV >= 0) {
  1683. +     foreach (@ARGV) {
  1684. +     if(defined $ENV{$_}) {
  1685. +         print $ENV{$_};
  1686. +         } else {
  1687. +         $exit = 1;
  1688. +         }
  1689. +     }
  1690. + } else {
  1691. +     foreach (sort keys %ENV) {
  1692. +     print $_, '=', $ENV{$_};
  1693. +     }
  1694. + }
  1695. + exit $exit;
  1696.  
  1697. Index: hints/solaris_2_0.sh
  1698. *** hints/solaris_2_0.sh.old    Mon Jun  8 17:48:20 1992
  1699. --- hints/solaris_2_0.sh    Mon Jun  8 17:48:21 1992
  1700. ***************
  1701. *** 0 ****
  1702. --- 1 ----
  1703. + d_vfork='undef'
  1704.  
  1705. *** End of Patch 29 ***
  1706. exit 0 # Just in case...
  1707.