[comp.sources.d] Patches to some Perl 3.0 bugs

guy@auspex.auspex.com (Guy Harris) (09/09/89)

Unofficial patches (which I'll forward to Larry Wall) for some problems:

1) a little problem "lint" caught in "cons.c".  "lint" is your friend.

*** cons.c.dist	Fri Sep  8 17:35:38 1989
--- cons.c	Fri Sep  8 18:46:26 1989
***************
*** 173,179 ****
      Newz(103,loc,258,CMD*);
      loc++;				/* lie a little */
      while (count--) {
! 	if ((cur->c_flags && CF_OPTIMIZE) == CFT_CCLASS) {
  	    for (i = 0; i <= 255; i++) {
  		if (!loc[i] && cur->c_short->str_ptr[i>>3] & (1 << (i&7))) {
  		    loc[i] = cur;
--- 173,179 ----
      Newz(103,loc,258,CMD*);
      loc++;				/* lie a little */
      while (count--) {
! 	if ((cur->c_flags & CF_OPTIMIZE) == CFT_CCLASS) {
  	    for (i = 0; i <= 255; i++) {
  		if (!loc[i] && cur->c_short->str_ptr[i>>3] & (1 << (i&7))) {
  		    loc[i] = cur;

2) One "#ifdef SYMLINK"/"#endif" was missed in "doio.c", causing Perl
   not to build on machines without "lstat".

*** doio.c.dist	Fri Sep  8 17:35:38 1989
--- doio.c	Fri Sep  8 18:47:26 1989
***************
*** 457,465 ****
--- 457,467 ----
      else {
  	str_sset(statname,ary->ary_array[sp]);
  	statstab = Nullstab;
+ #ifdef SYMLINK
  	if (arg->arg_type == O_LSTAT)
  	    i = lstat(str_get(statname),&statcache);
  	else
+ #endif
  	    i = stat(str_get(statname),&statcache);
  	if (i < 0)
  	    max = 0;

3) The "lstat()" function for which the "lstat"s were stuck in there in
   the first place seemed not to be recognized by the lexical analyzer. 
   (It also appears not to have been documented, but then again the
   BSD socket functions in Perl don't seem to be documented, either....)

*** toke.c.dist	Fri Sep  8 17:35:43 1989
--- toke.c	Fri Sep  8 18:49:16 1989
***************
*** 635,640 ****
--- 635,642 ----
  	    FUN2(O_LINK);
  	if (strEQ(d,"listen"))
  	    FOP2(O_LISTEN);
+ 	if (strEQ(d,"lstat"))
+ 	    FOP(O_LSTAT);
  	break;
      case 'm': case 'M':
  	SNARFWORD;

4) "vfork" interacts unpleasantly with register windows on SPARC
   machines.

5) "mypopen" required that the system have "dup2()"; some versions of
   UNIX do not but do have "fcntl" (S3, S5"R1", S5R2 - S5R3 has both).

*** eval.c.dist	Fri Sep  8 17:35:39 1989
--- eval.c	Fri Sep  8 17:51:15 1989
***************
*** 14,19 ****
--- 14,23 ----
  #include <signal.h>
  #include <errno.h>
  
+ #ifdef sparc
+ #  include <vfork.h>
+ #endif
+ 
  extern int errno;
  
  #ifdef VOIDSIG

*** util.c.dist	Fri Sep  8 17:35:44 1989
--- util.c	Fri Sep  8 19:02:10 1989
***************
*** 12,17 ****
--- 12,30 ----
  #include "perl.h"
  #include "errno.h"
  
+ #ifdef sparc
+ /*
+  * XXX - should be "#include <vfork.h>"; however, that doesn't seem
+  * to be sufficient to fix the problem, so we just #define "vfork"
+  * to be "fork"....
+  */
+ #define	vfork	fork
+ #endif
+ 
+ #ifdef FCNTL
+ #  include <fcntl.h>
+ #endif
+ 
  #ifdef VARARGS
  #  include <varargs.h>
  #endif
***************
*** 1001,1008 ****
  	this = !this;	/* swap this and that */
  	that = !this;
  	close(p[that]);
! 	if (p[this] != (*mode == 'r')) {
! 	    dup2(p[this], *mode == 'r');
  	    close(p[this]);
  	}
  	if (doexec) {
--- 1014,1026 ----
  	this = !this;	/* swap this and that */
  	that = !this;
  	close(p[that]);
! 	if (p[this] != this) {
! #ifdef FCNTL
! 	    close(this);
! 	    fcntl(p[this], F_DUPFD, this);
! #else
! 	    dup2(p[this], this);
! #endif
  	    close(p[this]);
  	}
  	if (doexec) {