perl 3.0 beta to gamma upgrade kit [4/4]

Larry Wall lwall at jato.Jpl.Nasa.Gov
Sat Sep 16 10:04:30 AEST 1989


Apply these to a virgin perl 3.0 beta directory to produce a perl 3.0 gamma
directory.  Recommended patch switches are -p1 -N.

Larry Wall
lwall at jpl-devvax.jpl.nasa.gov

diff -c -r beta/perl.y gamma/perl.y
*** beta/perl.y	Fri Sep 15 16:06:26 1989
--- gamma/perl.y	Fri Sep 15 16:10:57 1989
***************
*** 584,590 ****
  			{ $$ = make_op(O_SHIFT, 1, $3, Nullarg, Nullarg); }
  	|	SHIFT	%prec '('
  			{ $$ = make_op(O_SHIFT, 1,
! 			    stab2arg(A_STAB,aadd(stabent("ARGV",TRUE))),
  			    Nullarg, Nullarg); }
  	|	SPLIT	%prec '('
  			{ (void)scanpat("/\\s+/");
--- 584,591 ----
  			{ $$ = make_op(O_SHIFT, 1, $3, Nullarg, Nullarg); }
  	|	SHIFT	%prec '('
  			{ $$ = make_op(O_SHIFT, 1,
! 			    stab2arg(A_STAB,
! 			      aadd(stabent(subline ? "_" : "ARGV", TRUE))),
  			    Nullarg, Nullarg); }
  	|	SPLIT	%prec '('
  			{ (void)scanpat("/\\s+/");
diff -c -r beta/perly.c gamma/perly.c
*** beta/perly.c	Fri Sep 15 16:07:08 1989
--- gamma/perly.c	Fri Sep 15 16:11:25 1989
***************
*** 1,4 ****
! char rcsid[] = "$Header: perly.c,v 3.0 beta$\nPatch level: ###\n";
  /*
   *    Copyright (c) 1989, Larry Wall
   *
--- 1,4 ----
! char rcsid[] = "$Header: perly.c,v 3.0 gamma$\nPatch level: ###\n";
  /*
   *    Copyright (c) 1989, Larry Wall
   *
***************
*** 57,63 ****
  	goto just_doit;
      }
      (void)sprintf(index(rcsid,'#'), "%d\n", PATCHLEVEL);
!     linestr = str_new(80);
      str_nset(linestr,"",0);
      str = str_make("",0);		/* first used for -I flags */
      curstash = defstash = hnew(0);
--- 57,63 ----
  	goto just_doit;
      }
      (void)sprintf(index(rcsid,'#'), "%d\n", PATCHLEVEL);
!     linestr = Str_new(65,80);
      str_nset(linestr,"",0);
      str = str_make("",0);		/* first used for -I flags */
      curstash = defstash = hnew(0);
***************
*** 585,591 ****
      stab_io(tmpstab)->ofp = stab_io(tmpstab)->ifp = stderr;
      stab_io(stabent("stderr",TRUE)) = stab_io(tmpstab);
  
!     statname = str_new(0);		/* last filename we did stat on */
  
      perldb = FALSE;		/* don't try to instrument evals */
  
--- 585,591 ----
      stab_io(tmpstab)->ofp = stab_io(tmpstab)->ifp = stderr;
      stab_io(stabent("stderr",TRUE)) = stab_io(tmpstab);
  
!     statname = Str_new(66,0);		/* last filename we did stat on */
  
      perldb = FALSE;		/* don't try to instrument evals */
  
***************
*** 719,725 ****
  		(void)sprintf(buf,"%s/%s",str_get(afetch(ar,i,TRUE)),filename);
  		rsfp = fopen(buf,"r");
  		if (rsfp) {
- 		    free(filename);
  		    filename = savestr(buf);
  		    break;
  		}
--- 719,724 ----
diff -c -r beta/regcomp.h gamma/regcomp.h
*** beta/regcomp.h	Fri Sep 15 16:07:35 1989
--- gamma/regcomp.h	Fri Sep 15 16:12:09 1989
***************
*** 125,131 ****
   * Using two bytes for the "next" pointer is vast overkill for most things,
   * but allows patterns to get big without disasters.
   *
!  * [If ALIGN is defined, the "next" pointer is always aligned on an even
   * boundary, and reads the offset directly as a short.  Also, there is no
   * special test to reverse the sign of BACK pointers since the offset is
   * stored negative.]
--- 125,131 ----
   * Using two bytes for the "next" pointer is vast overkill for most things,
   * but allows patterns to get big without disasters.
   *
!  * [If REGALIGN is defined, the "next" pointer is always aligned on an even
   * boundary, and reads the offset directly as a short.  Also, there is no
   * special test to reverse the sign of BACK pointers since the offset is
   * stored negative.]
diff -c -r beta/stab.c gamma/stab.c
*** beta/stab.c	Fri Sep 15 16:06:03 1989
--- gamma/stab.c	Fri Sep 15 16:10:42 1989
***************
*** 225,231 ****
  		stab->str_len = stab->str_cur = sizeof(STBP);
  		stab->str_pok = 1;
  		strncpy(stab_magic(stab),"Stab",4);
! 		stab_val(stab) = str_new(0);
  		stab_line(stab) = line;
  	    }
  	    else
--- 225,231 ----
  		stab->str_len = stab->str_cur = sizeof(STBP);
  		stab->str_pok = 1;
  		strncpy(stab_magic(stab),"Stab",4);
! 		stab_val(stab) = Str_new(70,0);
  		stab_line(stab) = line;
  	    }
  	    else
***************
*** 420,426 ****
      savearray = stab_xarray(defstab);
      stab_xarray(defstab) = stack = anew(defstab);
      stack->ary_flags = 0;
!     str = str_new(0);
      str_set(str,sig_name[sig]);
      (void)apush(stab_xarray(defstab),str);
      sub->depth++;
--- 420,426 ----
      savearray = stab_xarray(defstab);
      stab_xarray(defstab) = stack = anew(defstab);
      stack->ary_flags = 0;
!     str = Str_new(71,0);
      str_set(str,sig_name[sig]);
      (void)apush(stab_xarray(defstab),str);
      sub->depth++;
***************
*** 547,553 ****
  	stab->str_len = stab->str_cur = sizeof(STBP);
  	stab->str_pok = 1;
  	strncpy(stab_magic(stab),"Stab",4);
! 	stab_val(stab) = str_new(0);
  	stab_line(stab) = line;
  	str_magic(stab,stab,'*',name,len);
  	return stab;
--- 547,553 ----
  	stab->str_len = stab->str_cur = sizeof(STBP);
  	stab->str_pok = 1;
  	strncpy(stab_magic(stab),"Stab",4);
! 	stab_val(stab) = Str_new(72,0);
  	stab_line(stab) = line;
  	str_magic(stab,stab,'*',name,len);
  	return stab;
diff -c -r beta/stab.h gamma/stab.h
*** beta/stab.h	Fri Sep 15 16:07:52 1989
--- gamma/stab.h	Fri Sep 15 16:12:31 1989
***************
*** 45,50 ****
--- 45,53 ----
  struct stio {
      FILE	*ifp;		/* ifp and ofp are normally the same */
      FILE	*ofp;		/* but sockets need separate streams */
+ #if defined(I_DIRENT) || defined(I_SYSDIR)
+     DIR		*dirp;		/* for opendir, readdir, etc */
+ #endif
      long	lines;		/* $. */
      long	page;		/* $% */
      long	page_len;	/* $= */
diff -c -r beta/str.c gamma/str.c
*** beta/str.c	Fri Sep 15 16:06:55 1989
--- gamma/str.c	Fri Sep 15 16:11:32 1989
***************
*** 311,317 ****
--- 311,322 ----
  }
  
  STR *
+ #ifdef LEAKTEST
+ str_new(x,len)
+ int x;
+ #else
  str_new(len)
+ #endif
  int len;
  {
      register STR *str;
***************
*** 323,329 ****
  	str->str_state = SS_NORM;
      }
      else {
! 	Newz(701,str,1,STR);
      }
      if (len)
  	STR_GROW(str, len + 1);
--- 328,334 ----
  	str->str_state = SS_NORM;
      }
      else {
! 	Newz(700+x,str,1,STR);
      }
      if (len)
  	STR_GROW(str, len + 1);
***************
*** 340,346 ****
  {
      if (str->str_magic)
  	return;
!     str->str_magic = str_new(namlen);
      str = str->str_magic;
      str->str_u.str_stab = stab;
      str->str_rare = how;
--- 345,351 ----
  {
      if (str->str_magic)
  	return;
!     str->str_magic = Str_new(75,namlen);
      str = str->str_magic;
      str->str_u.str_stab = stab;
      str->str_rare = how;
***************
*** 470,475 ****
--- 475,487 ----
      }
      if (str->str_magic)
  	str_free(str->str_magic);
+ #ifdef LEAKTEST
+     if (str->str_len)
+ 	Safefree(str->str_ptr);
+     if ((str->str_pok & SP_INTRP) && str->str_u.str_args)
+ 	arg_free(str->str_u.str_args);
+     Safefree(str);
+ #else /* LEAKTEST */
      if (str->str_len) {
  	if (str->str_len > 127) {	/* next user not likely to want more */
  	    Safefree(str->str_ptr);	/* so give it back to malloc */
***************
*** 490,495 ****
--- 502,508 ----
  #endif
      str->str_magic = freestrroot;
      freestrroot = str;
+ #endif /* LEAKTEST */
  }
  
  str_len(str)
***************
*** 542,553 ****
  	(void)str_2ptr(str2);
  
      if (str1->str_cur < str2->str_cur) {
! 	if (retval = bcmp(str1->str_ptr, str2->str_ptr, str1->str_cur))
  	    return retval;
  	else
  	    return 1;
      }
!     else if (retval = bcmp(str1->str_ptr, str2->str_ptr, str2->str_cur))
  	return retval;
      else if (str1->str_cur == str2->str_cur)
  	return 0;
--- 555,566 ----
  	(void)str_2ptr(str2);
  
      if (str1->str_cur < str2->str_cur) {
! 	if (retval = memcmp(str1->str_ptr, str2->str_ptr, str1->str_cur))
  	    return retval;
  	else
  	    return 1;
      }
!     else if (retval = memcmp(str1->str_ptr, str2->str_ptr, str2->str_cur))
  	return retval;
      else if (str1->str_cur == str2->str_cur)
  	return 0;
***************
*** 627,636 ****
  
  #else /* !STDSTDIO */	/* The big, slow, and stupid way */
  
!     static char buf[4192];
  
!     if (fgets(buf, sizeof buf, fp) != Nullch)
! 	str_set(str, buf);
      else
  	str_set(str, No);
  
--- 640,653 ----
  
  #else /* !STDSTDIO */	/* The big, slow, and stupid way */
  
!     static char buf[8192];
  
!     if (fgets(buf, sizeof buf, fp) != Nullch) {
! 	if (append)
! 	    str_cat(str, buf);
! 	else
! 	    str_set(str, buf);
!     }
      else
  	str_set(str, No);
  
***************
*** 684,691 ****
      register int brackets;
      STAB *stab;
  
!     toparse = str_new(0);
!     str = str_new(0);
  
      str_nset(str,"",0);
      str_nset(toparse,"",0);
--- 701,708 ----
      register int brackets;
      STAB *stab;
  
!     toparse = Str_new(76,0);
!     str = Str_new(77,0);
  
      str_nset(str,"",0);
      str_nset(toparse,"",0);
***************
*** 887,898 ****
   * hopefully cmd_exec won't free it until it has been assigned to a
   * permanent location. */
  
  STR *
  str_static(oldstr)
  STR *oldstr;
  {
!     register STR *str = str_new(0);
!     static long tmps_size = -1;
  
      str_sset(str,oldstr);
      if (++tmps_max > tmps_size) {
--- 904,916 ----
   * hopefully cmd_exec won't free it until it has been assigned to a
   * permanent location. */
  
+ static long tmps_size = -1;
+ 
  STR *
  str_static(oldstr)
  STR *oldstr;
  {
!     register STR *str = Str_new(78,0);
  
      str_sset(str,oldstr);
      if (++tmps_max > tmps_size) {
***************
*** 908,919 ****
      return str;
  }
  
  STR *
  str_make(s,len)
  char *s;
  int len;
  {
!     register STR *str = str_new(0);
  
      if (!len)
  	len = strlen(s);
--- 926,956 ----
      return str;
  }
  
+ /* same thing without the copying */
+ 
  STR *
+ str_2static(str)
+ register STR *str;
+ {
+     if (++tmps_max > tmps_size) {
+ 	tmps_size = tmps_max;
+ 	if (!(tmps_size & 127)) {
+ 	    if (tmps_size)
+ 		Renew(tmps_list, tmps_size + 128, STR*);
+ 	    else
+ 		New(704,tmps_list, 128, STR*);
+ 	}
+     }
+     tmps_list[tmps_max] = str;
+     return str;
+ }
+ 
+ STR *
  str_make(s,len)
  char *s;
  int len;
  {
!     register STR *str = Str_new(79,0);
  
      if (!len)
  	len = strlen(s);
***************
*** 925,931 ****
  str_nmake(n)
  double n;
  {
!     register STR *str = str_new(0);
  
      str_numset(str,n);
      return str;
--- 962,968 ----
  str_nmake(n)
  double n;
  {
!     register STR *str = Str_new(80,0);
  
      str_numset(str,n);
      return str;
***************
*** 937,943 ****
  str_smake(old)
  register STR *old;
  {
!     register STR *new = str_new(0);
  
      if (!old)
  	return Nullstr;
--- 974,980 ----
  str_smake(old)
  register STR *old;
  {
!     register STR *new = Str_new(81,0);
  
      if (!old)
  	return Nullstr;
diff -c -r beta/str.h gamma/str.h
*** beta/str.h	Fri Sep 15 16:07:44 1989
--- gamma/str.h	Fri Sep 15 16:12:21 1989
***************
*** 113,118 ****
--- 113,119 ----
  char *str_2ptr();
  double str_2num();
  STR *str_static();
+ STR *str_2static();
  STR *str_make();
  STR *str_nmake();
  STR *str_smake();
Common subdirectories: beta/t and gamma/t
diff -c -r beta/toke.c gamma/toke.c
*** beta/toke.c	Fri Sep 15 16:05:44 1989
--- gamma/toke.c	Fri Sep 15 16:10:14 1989
***************
*** 130,136 ****
  	}
  	oldoldbufptr = oldbufptr = bufptr = s;
  	if (perldb) {
! 	    STR *str = str_new(0);
  
  	    str_sset(str,linestr);
  	    astore(lineary,(int)line,str);
--- 130,136 ----
  	}
  	oldoldbufptr = oldbufptr = bufptr = s;
  	if (perldb) {
! 	    STR *str = Str_new(85,0);
  
  	    str_sset(str,linestr);
  	    astore(lineary,(int)line,str);
***************
*** 429,434 ****
--- 429,436 ----
  	    UNI(O_CHDIR);
  	if (strEQ(d,"close"))
  	    FOP(O_CLOSE);
+ 	if (strEQ(d,"closedir"))
+ 	    FOP(O_CLOSEDIR);
  	if (strEQ(d,"crypt")) {
  #ifdef FCRYPT
  	    init_des();
***************
*** 503,508 ****
--- 505,514 ----
  	    FUN0(O_ESERVENT);
  	if (strEQ(d,"endprotoent"))
  	    FUN0(O_EPROTOENT);
+ 	if (strEQ(d,"endpwent"))
+ 	    FUN0(O_EPWENT);
+ 	if (strEQ(d,"endgrent"))
+ 	    FUN0(O_EGRENT);
  	break;
      case 'f': case 'F':
  	SNARFWORD;
***************
*** 557,562 ****
--- 563,576 ----
  		    FUN1(O_GPBYNUMBER);
  		if (strEQ(d,"protoent"))
  		    FUN0(O_GPROTOENT);
+ 		if (strEQ(d,"pwent"))
+ 		    FUN0(O_GPWENT);
+ 		if (strEQ(d,"pwnam"))
+ 		    FUN1(O_GPWNAM);
+ 		if (strEQ(d,"pwuid"))
+ 		    FUN1(O_GPWUID);
+ 		if (strEQ(d,"peername"))
+ 		    FOP(O_GETPEERNAME);
  	    }
  	    else if (*d == 'h') {
  		if (strEQ(d,"hostbyname"))
***************
*** 581,587 ****
--- 595,617 ----
  		    FUN2(O_GSBYPORT);
  		if (strEQ(d,"servent"))
  		    FUN0(O_GSERVENT);
+ 		if (strEQ(d,"sockname"))
+ 		    FOP(O_GETSOCKNAME);
+ 		if (strEQ(d,"sockopt"))
+ 		    FOP3(O_GSOCKOPT);
  	    }
+ 	    else if (*d == 'g') {
+ 		if (strEQ(d,"grent"))
+ 		    FUN0(O_GGRENT);
+ 		if (strEQ(d,"grnam"))
+ 		    FUN1(O_GGRNAM);
+ 		if (strEQ(d,"grgid"))
+ 		    FUN1(O_GGRGID);
+ 	    }
+ 	    else if (*d == 'l') {
+ 		if (strEQ(d,"login"))
+ 		    FUN0(O_GETLOGIN);
+ 	    }
  	    d -= 3;
  	}
  	break;
***************
*** 635,640 ****
--- 665,672 ----
  	    FUN2(O_LINK);
  	if (strEQ(d,"listen"))
  	    FOP2(O_LISTEN);
+ 	if (strEQ(d,"lstat"))
+ 	    FOP(O_LSTAT);
  	break;
      case 'm': case 'M':
  	SNARFWORD;
***************
*** 660,665 ****
--- 692,699 ----
  	    UNI(O_ORD);
  	if (strEQ(d,"oct"))
  	    UNI(O_OCT);
+ 	if (strEQ(d,"opendir"))
+ 	    FOP2(O_OPENDIR);
  	break;
      case 'p': case 'P':
  	SNARFWORD;
***************
*** 711,716 ****
--- 745,754 ----
  	    FUN2(O_RINDEX);
  	if (strEQ(d,"read"))
  	    FOP3(O_READ);
+ 	if (strEQ(d,"readdir"))
+ 	    FOP(O_READDIR);
+ 	if (strEQ(d,"rewinddir"))
+ 	    FOP(O_REWINDDIR);
  	if (strEQ(d,"recv"))
  	    FOP4(O_RECV);
  	if (strEQ(d,"reverse"))
***************
*** 749,754 ****
--- 787,800 ----
  		FUN1(O_SSERVENT);
  	    if (strEQ(d,"setprotoent"))
  		FUN1(O_SPROTOENT);
+ 	    if (strEQ(d,"setpwent"))
+ 		FUN0(O_SPWENT);
+ 	    if (strEQ(d,"setgrent"))
+ 		FUN0(O_SGRENT);
+ 	    if (strEQ(d,"seekdir"))
+ 		FOP2(O_SEEKDIR);
+ 	    if (strEQ(d,"setsockopt"))
+ 		FOP4(O_SSOCKOPT);
  	    break;
  	case 'f':
  	case 'g':
***************
*** 756,761 ****
--- 802,809 ----
  	case 'h':
  	    if (strEQ(d,"shift"))
  		TERM(SHIFT);
+ 	    if (strEQ(d,"shutdown"))
+ 		FOP2(O_SHUTDOWN);
  	    break;
  	case 'i':
  	    if (strEQ(d,"sin"))
***************
*** 851,856 ****
--- 899,906 ----
  	    }
  	    if (strEQ(d,"symlink"))
  		FUN2(O_SYMLINK);
+ 	    if (strEQ(d,"syscall"))
+ 		LOP(O_SYSCALL);
  	    break;
  	case 'z':
  	    break;
***************
*** 864,869 ****
--- 914,921 ----
  	}
  	if (strEQ(d,"tell"))
  	    FOP(O_TELL);
+ 	if (strEQ(d,"telldir"))
+ 	    FOP(O_TELLDIR);
  	if (strEQ(d,"time"))
  	    FUN0(O_TIME);
  	if (strEQ(d,"times"))
***************
*** 912,918 ****
  	    OPERATOR(WHILE);
  	}
  	if (strEQ(d,"warn"))
! 	    UNI(O_WARN);
  	if (strEQ(d,"wait"))
  	    FUN0(O_WAIT);
  	if (strEQ(d,"wantarray"))
--- 964,970 ----
  	    OPERATOR(WHILE);
  	}
  	if (strEQ(d,"warn"))
! 	    LOP(O_WARN);
  	if (strEQ(d,"wait"))
  	    FUN0(O_WAIT);
  	if (strEQ(d,"wantarray"))
***************
*** 1014,1020 ****
      if (index(string,'|')) {
  	return Nullstr;
      }
!     retstr = str_new(len);
      str_nset(retstr,string,len);
      t = str_get(retstr);
      e = t + len;
--- 1066,1072 ----
      if (index(string,'|')) {
  	return Nullstr;
      }
!     retstr = Str_new(86,len);
      str_nset(retstr,string,len);
      t = str_get(retstr);
      e = t + len;
***************
*** 1278,1284 ****
  	    spat->spat_repl = fixeval(make_op(O_EVAL,2,
  		spat->spat_repl,
  		Nullarg,
! 		Nullarg,0));
  	    spat->spat_flags &= ~SPAT_CONST;
  	}
  	if (*s == 'g') {
--- 1330,1336 ----
  	    spat->spat_repl = fixeval(make_op(O_EVAL,2,
  		spat->spat_repl,
  		Nullarg,
! 		Nullarg));
  	    spat->spat_flags &= ~SPAT_CONST;
  	}
  	if (*s == 'g') {
***************
*** 1369,1375 ****
  register char *s;
  {
      ARG *arg =
! 	l(make_op(O_TRANS,2,stab2arg(A_STAB,defstab),Nullarg,Nullarg,0));
      register char *t;
      register char *r;
      register char *tbl;
--- 1421,1427 ----
  register char *s;
  {
      ARG *arg =
! 	l(make_op(O_TRANS,2,stab2arg(A_STAB,defstab),Nullarg,Nullarg));
      register char *t;
      register char *r;
      register char *tbl;
***************
*** 1634,1640 ****
  		    term = tmps[5];
  		multi_close = term;
  	    }
! 	    tmpstr = str_new(0);
  	    if (hereis) {
  		term = *tokenbuf;
  		if (!rsfp) {
--- 1686,1692 ----
  		    term = tmps[5];
  		multi_close = term;
  	    }
! 	    tmpstr = Str_new(87,0);
  	    if (hereis) {
  		term = *tokenbuf;
  		if (!rsfp) {
***************
*** 1667,1673 ****
  		}
  		line++;
  		if (perldb) {
! 		    STR *str = str_new(0);
  
  		    str_sset(str,linestr);
  		    astore(lineary,(int)line,str);
--- 1719,1725 ----
  		}
  		line++;
  		if (perldb) {
! 		    STR *str = Str_new(88,0);
  
  		    str_sset(str,linestr);
  		    astore(lineary,(int)line,str);
***************
*** 1805,1811 ****
      while ((s = str_gets(linestr,rsfp, 0)) != Nullch) {
  	line++;
  	if (perldb) {
! 	    STR *tmpstr = str_new(0);
  
  	    str_sset(tmpstr,linestr);
  	    astore(lineary,(int)line,tmpstr);
--- 1857,1863 ----
      while ((s = str_gets(linestr,rsfp, 0)) != Nullch) {
  	line++;
  	if (perldb) {
! 	    STR *tmpstr = Str_new(89,0);
  
  	    str_sset(tmpstr,linestr);
  	    astore(lineary,(int)line,tmpstr);
***************
*** 1878,1884 ****
  		goto badform;
  	    line++;
  	    if (perldb) {
! 		STR *tmpstr = str_new(0);
  
  		str_sset(tmpstr,linestr);
  		astore(lineary,(int)line,tmpstr);
--- 1930,1936 ----
  		goto badform;
  	    line++;
  	    if (perldb) {
! 		STR *tmpstr = Str_new(90,0);
  
  		str_sset(tmpstr,linestr);
  		astore(lineary,(int)line,tmpstr);
***************
*** 1891,1897 ****
  	    if (*s == '#')
  		goto again;
  	    bufend = linestr->str_ptr + linestr->str_cur;
! 	    str = flinebeg->f_unparsed = str_new(bufend - bufptr);
  	    str->str_u.str_hash = curstash;
  	    str_nset(str,"(",1);
  	    flinebeg->f_line = line;
--- 1943,1949 ----
  	    if (*s == '#')
  		goto again;
  	    bufend = linestr->str_ptr + linestr->str_cur;
! 	    str = flinebeg->f_unparsed = Str_new(91,bufend - bufptr);
  	    str->str_u.str_hash = curstash;
  	    str_nset(str,"(",1);
  	    flinebeg->f_line = line;
***************
*** 1937,1944 ****
  		    default:
  			yyerror("Please use commas to separate fields");
  		    }
- 		    str_ncat(str,"$$);",4);
  		}
  	    }
  	}
      }
--- 1989,1996 ----
  		    default:
  			yyerror("Please use commas to separate fields");
  		    }
  		}
+ 		str_ncat(str,"$$);",4);
  	    }
  	}
      }
diff -c -r beta/util.c gamma/util.c
*** beta/util.c	Fri Sep 15 16:07:02 1989
--- gamma/util.c	Fri Sep 15 16:11:37 1989
***************
*** 11,18 ****
  #include "EXTERN.h"
  #include "perl.h"
  #include "errno.h"
  
! #ifdef VARARGS
  #  include <varargs.h>
  #endif
  
--- 11,23 ----
  #include "EXTERN.h"
  #include "perl.h"
  #include "errno.h"
+ #include <signal.h>
  
! #ifdef sparc
! #  include <vfork.h>
! #endif
! 
! #ifdef I_VARARGS
  #  include <varargs.h>
  #endif
  
***************
*** 100,105 ****
--- 105,111 ----
  
  /* safe version of free */
  
+ void
  safefree(where)
  char *where;
  {
***************
*** 117,122 ****
--- 123,182 ----
      }
  }
  
+ #ifdef LEAKTEST
+ 
+ #define ALIGN sizeof(long)
+ 
+ char *
+ safexmalloc(x,size)
+ int x;
+ MEM_SIZE size;
+ {
+     register char *where;
+ 
+     where = safemalloc(size + ALIGN);
+     xcount[x]++;
+     where[0] = x % 100;
+     where[1] = x / 100;
+     return where + ALIGN;
+ }
+ 
+ char *
+ safexrealloc(where,size)
+ char *where;
+ MEM_SIZE size;
+ {
+     return saferealloc(where - ALIGN, size + ALIGN) + ALIGN;
+ }
+ 
+ void
+ safexfree(where)
+ char *where;
+ {
+     int x;
+ 
+     if (!where)
+ 	return;
+     where -= ALIGN;
+     x = where[0] + 100 * where[1];
+     xcount[x]--;
+     safefree(where);
+ }
+ 
+ xstat()
+ {
+     register int i;
+ 
+     for (i = 0; i < MAXXCOUNT; i++) {
+ 	if (xcount[i] != lastxcount[i]) {
+ 	    fprintf(stderr,"%2d %2d\t%ld\n", i / 100, i % 100, xcount[i]);
+ 	    lastxcount[i] = xcount[i];
+ 	}
+     }
+ }
+ 
+ #endif /* LEAKTEST */
+ 
  /* copy a string up to some (non-backslashed) delimiter, if any */
  
  char *
***************
*** 681,686 ****
--- 741,752 ----
  {
      mess(pat,a1,a2,a3,a4);
      fputs(buf,stderr);
+ #ifdef LEAKTEST
+ #ifdef DEBUGGING
+     if (debug & 4096)
+ 	xstat();
+ #endif
+ #endif
      (void)fflush(stderr);
  }
  #else
***************
*** 690,696 ****
  {
      char *pat;
      char *s;
! #ifdef CHARSPRINTF
      char *vsprintf();
  #else
      int vsprintf();
--- 756,762 ----
  {
      char *pat;
      char *s;
! #ifdef CHARVSPRINTF
      char *vsprintf();
  #else
      int vsprintf();
***************
*** 765,770 ****
--- 831,842 ----
      va_end(args);
  
      fputs(buf,stderr);
+ #ifdef LEAKTEST
+ #ifdef DEBUGGING
+     if (debug & 4096)
+ 	xstat();
+ #endif
+ #endif
      (void)fflush(stderr);
  }
  #endif
***************
*** 862,868 ****
  #ifdef VARARGS
  #ifndef VPRINTF
  
! #ifdef CHARSPRINTF
  char *
  #else
  int
--- 934,940 ----
  #ifdef VARARGS
  #ifndef VPRINTF
  
! #ifdef CHARVSPRINTF
  char *
  #else
  int
***************
*** 877,883 ****
--- 949,959 ----
      fakebuf._flag = _IOWRT|_IOSTRG;
      _doprnt(pat, args, &fakebuf);	/* what a kludge */
      (void)putc('\0', &fakebuf);
+ #ifdef CHARVSPRINTF
      return(dest);
+ #else
+     return 0;		/* perl doesn't use return value */
+ #endif
  }
  
  #ifdef DEBUGGING
***************
*** 988,993 ****
--- 1064,1070 ----
      if (pipe(p) < 0)
  	return Nullfp;
      this = (*mode == 'w');
+     that = !this;
      while ((pid = (doexec?vfork():fork())) < 0) {
  	if (errno != EAGAIN) {
  	    close(p[this]);
***************
*** 998,1009 ****
  	sleep(5);
      }
      if (pid == 0) {
! 	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) {
  	    do_exec(cmd);	/* may or may not use the shell */
--- 1075,1086 ----
  	sleep(5);
      }
      if (pid == 0) {
! #define THIS that
! #define THAT this
! 	close(p[THAT]);
! 	if (p[THIS] != (*mode == 'r')) {
! 	    dup2(p[THIS], *mode == 'r');
! 	    close(p[THIS]);
  	}
  	if (doexec) {
  	    do_exec(cmd);	/* may or may not use the shell */
***************
*** 1012,1019 ****
  	if (tmpstab = stabent("$",allstabs))
  	    str_numset(STAB_STR(tmpstab),(double)getpid());
  	return Nullfp;
      }
-     that = !this;
      close(p[that]);
      str = afetch(pidstatary,p[this],TRUE);
      str_numset(str,(double)pid);
--- 1089,1097 ----
  	if (tmpstab = stabent("$",allstabs))
  	    str_numset(STAB_STR(tmpstab),(double)getpid());
  	return Nullfp;
+ #undef THIS
+ #undef THAT
      }
      close(p[that]);
      str = afetch(pidstatary,p[this],TRUE);
      str_numset(str,(double)pid);
***************
*** 1022,1027 ****
--- 1100,1115 ----
      return fdopen(p[this], mode);
  }
  
+ #ifndef DUP2
+ dup2(oldfd,newfd)
+ int oldfd;
+ int newfd;
+ {
+     close(newfd);
+     while (dup(oldfd) != newfd) ;	/* good enough for our purposes */
+ }
+ #endif
+ 
  int
  mypclose(ptr)
  FILE *ptr;
***************
*** 1084,1086 ****
--- 1172,1190 ----
      }
  #endif
  }
+ 
+ #ifndef MEMCMP
+ memcmp(s1,s2,len)
+ register unsigned char *s1;
+ register unsigned char *s2;
+ register int len;
+ {
+     register int tmp;
+ 
+     while (len--) {
+ 	if (tmp = *s1++ - *s2++)
+ 	    return tmp;
+     }
+     return 0;
+ }
+ #endif /* MEMCMP */
Common subdirectories: beta/x2p and gamma/x2p
Common subdirectories: beta/eg/g and gamma/eg/g
Common subdirectories: beta/eg/scan and gamma/eg/scan
Common subdirectories: beta/eg/van and gamma/eg/van
diff -c -r beta/lib/dumpvar.pl gamma/lib/dumpvar.pl
*** beta/lib/dumpvar.pl	Fri Sep 15 16:08:58 1989
--- gamma/lib/dumpvar.pl	Fri Sep 15 16:13:27 1989
***************
*** 6,28 ****
      while (($key,$val) = each(%stab)) {
  	{
  	    local(*entry) = $val;
! 	    eval <<'.' if defined $entry;
! print "\$$key = '$entry'\n";
! .
! 	    eval <<'.' if defined @entry;
! print "\@$key = (\n";
! foreach $num ($[ .. $#entry) {
!     print "  $num\t'",$entry[$num],"'\n";
! }
! print ")\n";
! .
! 	    eval <<'.' if $key ne "_$package" && defined %entry;
! print "\%$key = (\n";
! foreach $key (sort keys(%entry)) {
!     print "  $key\t'",$entry{$key},"'\n";
! }
! print ")\n";
! .
  	}
      }
  }
--- 6,28 ----
      while (($key,$val) = each(%stab)) {
  	{
  	    local(*entry) = $val;
! 	    if (defined $entry) {
! 		print "\$$key = '$entry'\n";
! 	    }
! 	    if (defined @entry) {
! 		print "\@$key = (\n";
! 		foreach $num ($[ .. $#entry) {
! 		    print "  $num\t'",$entry[$num],"'\n";
! 		}
! 		print ")\n";
! 	    }
! 	    if ($key ne "_$package" && defined %entry) {
! 		print "\%$key = (\n";
! 		foreach $key (sort keys(%entry)) {
! 		    print "  $key\t'",$entry{$key},"'\n";
! 		}
! 		print ")\n";
! 	    }
  	}
      }
  }
diff -c -r beta/lib/getopt.pl gamma/lib/getopt.pl
*** beta/lib/getopt.pl	Fri Sep 15 16:06:04 1989
--- gamma/lib/getopt.pl	Fri Sep 15 16:13:05 1989
***************
*** 17,27 ****
  	($first,$rest) = ($1,$2);
  	if (index($argumentative,$first) >= $[) {
  	    if ($rest ne '') {
! 		shift;
  	    }
  	    else {
! 		shift;
! 		$rest = shift;
  	    }
  	    eval "\$opt_$first = \$rest;";
  	}
--- 17,27 ----
  	($first,$rest) = ($1,$2);
  	if (index($argumentative,$first) >= $[) {
  	    if ($rest ne '') {
! 		shift(@ARGV);
  	    }
  	    else {
! 		shift(@ARGV);
! 		$rest = shift(@ARGV);
  	    }
  	    eval "\$opt_$first = \$rest;";
  	}
***************
*** 31,37 ****
  		$ARGV[0] = "-$rest";
  	    }
  	    else {
! 		shift;
  	    }
  	}
      }
--- 31,37 ----
  		$ARGV[0] = "-$rest";
  	    }
  	    else {
! 		shift(@ARGV);
  	    }
  	}
      }
Only in gamma/lib: getopts.pl
diff -c -r beta/t/TEST gamma/t/TEST
*** beta/t/TEST	Fri Sep 15 16:08:14 1989
--- gamma/t/TEST	Fri Sep 15 16:12:50 1989
***************
*** 5,10 ****
--- 5,12 ----
  # This is written in a peculiar style, since we're trying to avoid
  # most of the constructs we'll be testing for.
  
+ $| = 1;
+ 
  if ($ARGV[0] eq '-v') {
      $verbose = 1;
      shift;
diff -c -r beta/x2p/EXTERN.h gamma/x2p/EXTERN.h
*** beta/x2p/EXTERN.h	Fri Sep 15 16:09:12 1989
--- gamma/x2p/EXTERN.h	Fri Sep 15 16:13:44 1989
***************
*** 6,14 ****
   *    as specified in the README file that comes with the perl 3.0 kit.
   *
   * $Log:	EXTERN.h,v $
-  * Revision 2.0  88/06/05  00:15:24  root
-  * Baseline version 2.0.
-  * 
   */
  
  #undef EXT
--- 6,11 ----
diff -c -r beta/x2p/INTERN.h gamma/x2p/INTERN.h
*** beta/x2p/INTERN.h	Fri Sep 15 16:09:13 1989
--- gamma/x2p/INTERN.h	Fri Sep 15 16:13:45 1989
***************
*** 6,14 ****
   *    as specified in the README file that comes with the perl 3.0 kit.
   *
   * $Log:	INTERN.h,v $
-  * Revision 2.0  88/06/05  00:15:27  root
-  * Baseline version 2.0.
-  * 
   */
  
  #undef EXT
--- 6,11 ----
diff -c -r beta/x2p/Makefile.SH gamma/x2p/Makefile.SH
*** beta/x2p/Makefile.SH	Fri Sep 15 16:07:52 1989
--- gamma/x2p/Makefile.SH	Fri Sep 15 16:12:30 1989
***************
*** 44,50 ****
  mallocsrc = $mallocsrc
  mallocobj = $mallocobj
  
! libs = $libnm -lm
  !GROK!THIS!
  
  cat >>Makefile <<'!NO!SUBS!'
--- 44,50 ----
  mallocsrc = $mallocsrc
  mallocobj = $mallocobj
  
! libs = $libnm -lm $libs
  !GROK!THIS!
  
  cat >>Makefile <<'!NO!SUBS!'
***************
*** 79,85 ****
  	touch all
  
  a2p: $(obj) a2p.o
! 	$(CC) $(LDFLAGS) $(LARGE) $(obj) a2p.o $(libs) -o a2p
  
  a2p.c: a2p.y
  	@ echo Expect 208 shift/reduce conflicts...
--- 79,85 ----
  	touch all
  
  a2p: $(obj) a2p.o
! 	$(CC) $(LARGE) $(LDFLAGS) $(obj) a2p.o $(libs) -o a2p
  
  a2p.c: a2p.y
  	@ echo Expect 208 shift/reduce conflicts...
***************
*** 89,97 ****
  a2p.o: a2p.c a2py.c a2p.h EXTERN.h util.h INTERN.h handy.h ../config.h
  	$(CC) -c $(CFLAGS) $(LARGE) a2p.c
  
- # if a .h file depends on another .h file...
- $(h):
- 	touch $@
  install: a2p s2p
  # won't work with csh
  	export PATH || exit 1
--- 89,94 ----
diff -c -r beta/x2p/a2p.h gamma/x2p/a2p.h
*** beta/x2p/a2p.h	Fri Sep 15 16:07:37 1989
--- gamma/x2p/a2p.h	Fri Sep 15 16:12:14 1989
***************
*** 6,17 ****
   *    as specified in the README file that comes with the perl 3.0 kit.
   *
   * $Log:	a2p.h,v $
-  * Revision 2.0.1.1  88/07/11  23:14:35  root
-  * patch2: added tokens from 1985 awk
-  * 
-  * Revision 2.0  88/06/05  00:15:33  root
-  * Baseline version 2.0.
-  * 
   */
  
  #define VOIDUSED 1
--- 6,11 ----
diff -c -r beta/x2p/a2p.y gamma/x2p/a2p.y
*** beta/x2p/a2p.y	Fri Sep 15 16:07:15 1989
--- gamma/x2p/a2p.y	Fri Sep 15 16:11:59 1989
***************
*** 7,24 ****
   *    as specified in the README file that comes with the perl 3.0 kit.
   *
   * $Log:	a2p.y,v $
-  * Revision 2.0.1.3  88/08/05  01:30:15  root
-  * patch13: a2p was treating strings and numbers as variables
-  * 
-  * Revision 2.0.1.2  88/08/03  22:49:27  root
-  * patch11: in a2p, newlines weren't allowed following comma
-  * 
-  * Revision 2.0.1.1  88/07/11  23:20:14  root
-  * patch2: changes to support translation of 1985 awk
-  * 
-  * Revision 2.0  88/06/05  00:15:38  root
-  * Baseline version 2.0.
-  * 
   */
  
  #include "INTERN.h"
--- 7,12 ----
diff -c -r beta/x2p/a2py.c gamma/x2p/a2py.c
*** beta/x2p/a2py.c	Fri Sep 15 16:07:00 1989
--- gamma/x2p/a2py.c	Fri Sep 15 16:11:30 1989
***************
*** 6,28 ****
   *    as specified in the README file that comes with the perl 3.0 kit.
   *
   * $Log:	a2py.c,v $
-  * Revision 2.0.1.4  88/10/31  16:52:13  lwall
-  * patch15: deleted some duplicate $ characters
-  * 
-  * Revision 2.0.1.3  88/09/07  17:15:57  lwall
-  * patch14: walk() needed to be declared outside of main()
-  * 
-  * Revision 2.0.1.2  88/08/03  22:50:05  root
-  * patch11: in a2p, numbers couldn't start with '.'
-  * 
-  * Revision 2.0.1.1  88/07/11  23:25:33  root
-  * patch2: changes to support translation of 1985 awk
-  * patch2: now fixes any perl reserved words it finds
-  * patch2: now checks for overflow of ops storage area
-  * 
-  * Revision 2.0  88/06/05  00:15:41  root
-  * Baseline version 2.0.
-  * 
   */
  
  #include "util.h"
--- 6,11 ----
***************
*** 135,141 ****
      /* second pass to produce new program */
  
      tmpstr = walk(0,0,root,&i,P_MIN);
!     str = str_make("#!/usr/bin/perl\neval \"exec /usr/bin/perl -S $0 $*\"\n\
      if $running_under_some_shell;\n\
  			# this emulates #! processing on NIH machines.\n\
  			# (remove #! line above if indigestible)\n\n");
--- 118,128 ----
      /* second pass to produce new program */
  
      tmpstr = walk(0,0,root,&i,P_MIN);
!     str = str_make("#!");
!     str_cat(str, BIN);
!     str_cat(str, "/perl\neval \"exec ");
!     str_cat(str, BIN);
!     str_cat(str, "/perl -S $0 $*\"\n\
      if $running_under_some_shell;\n\
  			# this emulates #! processing on NIH machines.\n\
  			# (remove #! line above if indigestible)\n\n");
diff -c -r beta/x2p/handy.h gamma/x2p/handy.h
*** beta/x2p/handy.h	Fri Sep 15 16:08:39 1989
--- gamma/x2p/handy.h	Fri Sep 15 16:13:15 1989
***************
*** 6,14 ****
   *    as specified in the README file that comes with the perl 3.0 kit.
   *
   * $Log:	handy.h,v $
-  * Revision 2.0  88/06/05  00:15:47  root
-  * Baseline version 2.0.
-  * 
   */
  
  #define Null(type) ((type)0)
--- 6,11 ----
diff -c -r beta/x2p/hash.c gamma/x2p/hash.c
*** beta/x2p/hash.c	Fri Sep 15 16:07:38 1989
--- gamma/x2p/hash.c	Fri Sep 15 16:12:18 1989
***************
*** 6,14 ****
   *    as specified in the README file that comes with the perl 3.0 kit.
   *
   * $Log:	hash.c,v $
-  * Revision 2.0  88/06/05  00:15:50  root
-  * Baseline version 2.0.
-  * 
   */
  
  #include <stdio.h>
--- 6,11 ----
diff -c -r beta/x2p/hash.h gamma/x2p/hash.h
*** beta/x2p/hash.h	Fri Sep 15 16:08:21 1989
--- gamma/x2p/hash.h	Fri Sep 15 16:12:54 1989
***************
*** 6,14 ****
   *    as specified in the README file that comes with the perl 3.0 kit.
   *
   * $Log:	hash.h,v $
-  * Revision 2.0  88/06/05  00:15:52  root
-  * Baseline version 2.0.
-  * 
   */
  
  #define FILLPCT 60		/* don't make greater than 99 */
--- 6,11 ----
diff -c -r beta/x2p/str.c gamma/x2p/str.c
*** beta/x2p/str.c	Fri Sep 15 16:07:22 1989
--- gamma/x2p/str.c	Fri Sep 15 16:11:57 1989
***************
*** 6,14 ****
   *    as specified in the README file that comes with the perl 3.0 kit.
   *
   * $Log:	str.c,v $
-  * Revision 2.0  88/06/05  00:16:02  root
-  * Baseline version 2.0.
-  * 
   */
  
  #include "handy.h"
--- 6,11 ----
diff -c -r beta/x2p/str.h gamma/x2p/str.h
*** beta/x2p/str.h	Fri Sep 15 16:08:28 1989
--- gamma/x2p/str.h	Fri Sep 15 16:13:04 1989
***************
*** 6,14 ****
   *    as specified in the README file that comes with the perl 3.0 kit.
   *
   * $Log:	str.h,v $
-  * Revision 2.0  88/06/05  00:16:05  root
-  * Baseline version 2.0.
-  * 
   */
  
  struct string {
--- 6,11 ----
diff -c -r beta/x2p/util.c gamma/x2p/util.c
*** beta/x2p/util.c	Fri Sep 15 16:07:18 1989
--- gamma/x2p/util.c	Fri Sep 15 16:12:15 1989
***************
*** 6,14 ****
   *    as specified in the README file that comes with the perl 3.0 kit.
   *
   * $Log:	util.c,v $
-  * Revision 2.0  88/06/05  00:16:07  root
-  * Baseline version 2.0.
-  * 
   */
  
  #include <stdio.h>
--- 6,11 ----
***************
*** 231,236 ****
--- 228,240 ----
  {
      fprintf(stderr,pat,a1,a2,a3,a4);
      exit(1);
+ }
+ 
+ /*VARARGS1*/
+ warn(pat,a1,a2,a3,a4)
+ char *pat;
+ {
+     fprintf(stderr,pat,a1,a2,a3,a4);
  }
  
  static bool firstsetenv = TRUE;
diff -c -r beta/x2p/util.h gamma/x2p/util.h
*** beta/x2p/util.h	Fri Sep 15 16:08:40 1989
--- gamma/x2p/util.h	Fri Sep 15 16:13:16 1989
***************
*** 6,14 ****
   *    as specified in the README file that comes with the perl 3.0 kit.
   *
   * $Log:	util.h,v $
-  * Revision 2.0  88/06/05  00:16:10  root
-  * Baseline version 2.0.
-  * 
   */
  
  /* is the string for makedir a directory name or a filename? */
--- 6,11 ----
diff -c -r beta/x2p/walk.c gamma/x2p/walk.c
*** beta/x2p/walk.c	Fri Sep 15 16:05:33 1989
--- gamma/x2p/walk.c	Fri Sep 15 16:10:01 1989
***************
*** 6,33 ****
   *    as specified in the README file that comes with the perl 3.0 kit.
   *
   * $Log:	walk.c,v $
-  * Revision 2.0.1.4  88/08/05  01:31:14  root
-  * patch13: dumb typo in last patch
-  * 
-  * Revision 2.0.1.3  88/08/03  22:54:39  root
-  * patch11: a2p was being really stupid about comparisons with literal strings
-  * patch11: a2p tried to make a local declaration on a null argument list
-  * patch11: fixed possible null pointer dereference
-  * patch11: comma didn't allow newline after it
-  * 
-  * Revision 2.0.1.2  88/07/15  01:39:36  root
-  * patch9: gcc complained about "\$", so it's now "\\$"
-  * 
-  * Revision 2.0.1.1  88/07/11  23:35:57  root
-  * patch2: changes to support translation of 1985 awk
-  * patch2: handles multiple opens to same file better
-  * patch2: now handles absence of line actions
-  * patch2: now takes advantage of perl's filehandle indirection
-  * patch2: now uses keys() instead of each() to protect against deletes in loop
-  * 
-  * Revision 2.0  88/06/05  00:16:12  root
-  * Baseline version 2.0.
-  * 
   */
  
  #include "handy.h"
--- 6,11 ----
diff -c -r beta/PACKINGLIST gamma/PACKINGLIST
*** beta/PACKINGLIST	Fri Sep 15 16:07:24 1989
--- gamma/PACKINGLIST	Fri Sep 15 16:11:48 1989
***************
*** 3,195 ****
  Filename		Kit Description
  --------		--- -----------
  Changes                 19 Differences between 2.0 level 18 and 3.0 level 0
! Configure                3 Run this first
! Copying                 12 The GNU General Public License
  EXTERN.h                23 Included before foreign .h files
  INTERN.h                23 Included before domestic .h files
! MANIFEST                18 This list of files
! Makefile.SH             18 Precursor to Makefile
! PACKINGLIST             18 Which files came from which kits
  README                   1 The Instructions
  Wishlist                18 Some things that may or may not happen
! arg.h                    9 Public declarations for the above
! array.c                  6 Numerically subscripted arrays
! array.h                 22 Public declarations for the above
! client                  22 A client to test sockets
  cmd.c                   14 Command interpreter
! cmd.h                   20 Public declarations for the above
! config.H                 4 Sample config.h
! config.h.SH              8 Produces config.h
! cons.c                   9 Routines to construct cmd nodes of a parse tree
  consarg.c               13 Routines to construct arg nodes of a parse tree
  doarg.c                 11 Scalar expression evaluation
! doio.c                   8 I/O operations
  dolist.c                16 Array expression evaluation
  dump.c                  18 Debugging output
! eg/ADB                  23 An adb wrapper to put in your crash dir
  eg/README                1 Intro to example perl scripts
! eg/changes              22 A program to list recently changed files
  eg/down                 23 A program to do things to subdirectories
  eg/dus                  23 A program to do du -s on non-mounted dirs
  eg/findcp               22 A find wrapper that implements a -cp switch
  eg/findtar              23 A find wrapper that pumps out a tar file
! eg/g/gcp.man            21 Manual page for gcp
  eg/g/gcp                21 A program to do a global rcp
  eg/g/ged                23 A program to do a global edit
! eg/g/ghosts             22 A sample /etc/ghosts file
! eg/g/gsh.man            21 Manual page for gsh
! eg/g/gsh                20 A program to do a global rsh
  eg/muck.man             23 Manual page for muck
  eg/muck                 21 A program to find missing make dependencies
! eg/myrup                22 A program to find lightly loaded machines
  eg/nih                  23 Script to insert #! workaround
! eg/rmfrom               17 A program to feed doomed filenames to
  eg/scan/scan_df         22 Scan for filesystem anomalies
  eg/scan/scan_last       22 Scan for login anomalies
! eg/scan/scan_messages   18 Scan for console message anomalies
! eg/scan/scan_passwd     15 Scan for passwd file anomalies
! eg/scan/scan_ps         22 Scan for process anomalies
  eg/scan/scan_sudo       22 Scan for sudo anomalies
! eg/scan/scan_suid       21 Scan for setuid anomalies
! eg/scan/scanner         21 An anomaly reporter
  eg/shmkill              23 A program to remove unused shared memory
  eg/van/empty            22 A program to empty the trashcan
! eg/van/unvanish         21 A program to undo what vanish does
  eg/van/vanexp           23 A program to expire vanished files
! eg/van/vanish           21 A program to put files in a trashcan
  eg/who                  23 A sample who program
! eval.c                   5 The expression evaluator
! evalargs.xc             12 The arg evaluator of eval.c
  form.c                  19 Format processing
! form.h                  22 Public declarations for the above
  gettest                 23 A little script to test the get* routines
! handy.h                 21 Handy definitions
  hash.c                  17 Associative arrays
! hash.h                   8 Public declarations for the above
! hdef                    22 Build database of .h definition locations
! ioctl.pl                20 Sample ioctl.pl
! lib/complete.pl         21 A command completion subroutine
  lib/dumpvar.pl          23 A variable dumper
! lib/getopt.pl            7 Perl library supporting option parsing
  lib/importenv.pl        23 Perl routine to get environment into variables
  lib/perldb.pl           17 Perl debugging routines
! lib/stat.pl             22 Perl library supporting stat function
! lib/termcap.pl          16 Perl library supporting termcap usage
! lib/validate.pl         20 Perl library supporting wholesale file mode validation
  makedepend.SH           20 Precursor to makedepend
  makedir.SH              22 Precursor to makedir
  makelib.SH              20 A thing to turn C .h file into perl .h files
! malloc.c                13 A version of malloc you might not want
! munch                   19 Try to make some .h equivalents
! patchlevel.h             6 The current patch level of perl
! perl.h                  17 Global declarations
  perl.man.1               1 The manual page(s), first fourth
! perl.man.2              10 The manual page(s), second fourth
! perl.man.3               7 The manual page(s), third fourth
  perl.man.4               6 The manual page(s), fourth fourth
! perl.y                  10 Yacc grammar for perl
  perlsh                  23 A poor man's perl shell
! perly.c                 16 main()
  regcomp.c               12 Regular expression compiler
  regcomp.h               19 Private declarations for above
! regexec.c               11 Regular expression evaluator
! regexp.h                22 Public declarations for the above
  server                  23 A server to test sockets
! spat.h                  22 Search pattern declarations
! stab.c                   7 Symbol table stuff
! stab.h                  20 Public declarations for the above
! str.c                   14 String handling package
  str.h                   20 Public declarations for the above
  t/README                 1 Instructions for regression tests
! t/TEST                  21 The regression tester
  t/base.cond             23 See if conditionals work
! t/base.if               23 See if if works
  t/base.lex              22 See if lexical items work
! t/base.pat               3 See if pattern matching works
! t/base.term             22 See if various terms work
  t/cmd.elsif             23 See if else-if works
! t/cmd.for               22 See if for loops work
! t/cmd.mod               22 See if statement modifiers work
! t/cmd.subval            21 See if subroutine values work
! t/cmd.switch            21 See if switch optimizations work
! t/cmd.while             21 See if while loops work
  t/comp.cmdopt           21 See if command optimization works
! t/comp.cpp              22 See if C preprocessor works
  t/comp.decl             23 See if declarations work
! t/comp.multiline        22 See if multiline strings work
! t/comp.package          22 See if packages work
  t/comp.script           23 See if script invokation works
  t/comp.term             22 See if more terms work
! t/io.argv               22 See if ARGV stuff works
  t/io.dup                23 See if >& works right
  t/io.fs                 21 See if directory manipulations work
  t/io.inplace            23 See if inplace editing works
! t/io.pipe               23 See if secure pipes work
  t/io.print              23 See if print commands work
! t/io.tell               11 See if file seeking works
  t/op.append             23 See if . works
! t/op.array               5 See if array operations work
! t/op.auto               21 See if autoincrement et all work
! t/op.chop               23 See if chop works
! t/op.cond               23 See if conditional expressions work
! t/op.dbm                21 See if dbm binding works
! t/op.delete             22 See if delete works
! t/op.do                 22 See if subroutines work
  t/op.each               22 See if associative iterators work
  t/op.eval               22 See if eval operator works
! t/op.exec                9 See if exec and system work
! t/op.exp                22 See if math functions work
  t/op.flip               23 See if range operator works
! t/op.fork               23 See if fork works
  t/op.glob               23 See if <*> works
! t/op.goto               22 See if goto works
! t/op.index              22 See if index works
! t/op.int                23 See if int works
! t/op.join               23 See if join works
! t/op.list               21 See if array lists work
! t/op.local              22 See if local works
! t/op.magic              22 See if magic variables work
  t/op.mkdir              23 See if mkdir works
! t/op.oct                23 See if oct and hex work
  t/op.ord                23 See if ord works
  t/op.pack               23 See if pack and unpack work
! t/op.pat                20 See if esoteric patterns work
! t/op.push               23 See if push and pop work
! t/op.range              22 See if .. works
! t/op.read               22 See if read() works
! t/op.regexp             22 See if regular expressions work
! t/op.repeat             22 See if x operator works
! t/op.sleep              14 See if sleep works
  t/op.sort               23 See if sort works
  t/op.split               1 See if split works
! t/op.sprintf            23 See if sprintf works
! t/op.stat               19 See if stat works
! t/op.study              21 See if study works
! t/op.substr             20 See if substr works
! t/op.subst              20 See if substitutions work
  t/op.time               22 See if time functions work
  t/op.undef              22 See if undef works
! t/op.unshift            23 See if unshift works
! t/op.vec                22 See if vectors work
! t/op.write              22 See if write works
! t/re_tests              20 Input file for op.regexp
! toke.c                   4 The tokener
! util.c                  15 Utility routines
! util.h                  22 Public declarations for the above
  x2p/EXTERN.h            23 Same as above
  x2p/INTERN.h            23 Same as above
! x2p/Makefile.SH         20 Precursor to Makefile
! x2p/a2p.h               19 Global declarations
  x2p/a2p.man             19 Manual page for awk to perl translator
! x2p/a2p.y               17 A yacc grammer for awk
  x2p/a2py.c              15 Awk compiler, sort of
! x2p/handy.h             22 Handy definitions
! x2p/hash.c              19 Associative arrays again
  x2p/hash.h              22 Public declarations for the above
! x2p/s2p.SH              13 Sed to perl translator
! x2p/s2p.man             21 Manual page for sed to perl translator
  x2p/str.c               18 String handling package
! x2p/str.h               22 Public declarations for the above
! x2p/util.c              17 Utility routines
! x2p/util.h              22 Public declarations for the above
! x2p/walk.c               2 Parse tree walker
--- 3,194 ----
  Filename		Kit Description
  --------		--- -----------
  Changes                 19 Differences between 2.0 level 18 and 3.0 level 0
! Configure                2 Run this first
! Copying                 17 The GNU General Public License
  EXTERN.h                23 Included before foreign .h files
  INTERN.h                23 Included before domestic .h files
! MANIFEST                 7 This list of files
! Makefile.SH             19 Precursor to Makefile
! PACKINGLIST             17 Which files came from which kits
  README                   1 The Instructions
  Wishlist                18 Some things that may or may not happen
! arg.h                   13 Public declarations for the above
! array.c                 20 Numerically subscripted arrays
! array.h                 23 Public declarations for the above
! client                  23 A client to test sockets
  cmd.c                   14 Command interpreter
! cmd.h                   21 Public declarations for the above
! config.H                22 Sample config.h
! config.h.SH             10 Produces config.h
! cons.c                  10 Routines to construct cmd nodes of a parse tree
  consarg.c               13 Routines to construct arg nodes of a parse tree
  doarg.c                 11 Scalar expression evaluation
! doio.c                   7 I/O operations
  dolist.c                16 Array expression evaluation
  dump.c                  18 Debugging output
! eg/ADB                   6 An adb wrapper to put in your crash dir
  eg/README                1 Intro to example perl scripts
! eg/changes              23 A program to list recently changed files
  eg/down                 23 A program to do things to subdirectories
  eg/dus                  23 A program to do du -s on non-mounted dirs
  eg/findcp               22 A find wrapper that implements a -cp switch
  eg/findtar              23 A find wrapper that pumps out a tar file
! eg/g/gcp.man            22 Manual page for gcp
  eg/g/gcp                21 A program to do a global rcp
  eg/g/ged                23 A program to do a global edit
! eg/g/ghosts             23 A sample /etc/ghosts file
! eg/g/gsh.man            22 Manual page for gsh
! eg/g/gsh                21 A program to do a global rsh
  eg/muck.man             23 Manual page for muck
  eg/muck                 21 A program to find missing make dependencies
! eg/myrup                23 A program to find lightly loaded machines
  eg/nih                  23 Script to insert #! workaround
! eg/rmfrom                8 A program to feed doomed filenames to
  eg/scan/scan_df         22 Scan for filesystem anomalies
  eg/scan/scan_last       22 Scan for login anomalies
! eg/scan/scan_messages   20 Scan for console message anomalies
! eg/scan/scan_passwd     23 Scan for passwd file anomalies
! eg/scan/scan_ps         23 Scan for process anomalies
  eg/scan/scan_sudo       22 Scan for sudo anomalies
! eg/scan/scan_suid       17 Scan for setuid anomalies
! eg/scan/scanner         22 An anomaly reporter
  eg/shmkill              23 A program to remove unused shared memory
  eg/van/empty            22 A program to empty the trashcan
! eg/van/unvanish          9 A program to undo what vanish does
  eg/van/vanexp           23 A program to expire vanished files
! eg/van/vanish           12 A program to put files in a trashcan
  eg/who                  23 A sample who program
! eval.c                   4 The expression evaluator
! evalargs.xc             19 The arg evaluator of eval.c
  form.c                  19 Format processing
! form.h                  23 Public declarations for the above
  gettest                 23 A little script to test the get* routines
! handy.h                 22 Handy definitions
  hash.c                  17 Associative arrays
! hash.h                  19 Public declarations for the above
! ioctl.pl                13 Sample ioctl.pl
! lib/complete.pl         22 A command completion subroutine
  lib/dumpvar.pl          23 A variable dumper
! lib/getopt.pl           23 Perl library supporting option parsing
! lib/getopts.pl          16 Perl library supporting option parsing
  lib/importenv.pl        23 Perl routine to get environment into variables
  lib/perldb.pl           17 Perl debugging routines
! lib/stat.pl             23 Perl library supporting stat function
! lib/termcap.pl          21 Perl library supporting termcap usage
! lib/validate.pl         21 Perl library supporting wholesale file mode validation
  makedepend.SH           20 Precursor to makedepend
  makedir.SH              22 Precursor to makedir
  makelib.SH              20 A thing to turn C .h file into perl .h files
! malloc.c                18 A version of malloc you might not want
! patchlevel.h             9 The current patch level of perl
! perl.h                  18 Global declarations
  perl.man.1               1 The manual page(s), first fourth
! perl.man.2               9 The manual page(s), second fourth
! perl.man.3               8 The manual page(s), third fourth
  perl.man.4               6 The manual page(s), fourth fourth
! perl.y                  11 Yacc grammar for perl
  perlsh                  23 A poor man's perl shell
! perly.c                 14 main()
  regcomp.c               12 Regular expression compiler
  regcomp.h               19 Private declarations for above
! regexec.c               12 Regular expression evaluator
! regexp.h                23 Public declarations for the above
  server                  23 A server to test sockets
! spat.h                   4 Search pattern declarations
! stab.c                   9 Symbol table stuff
! stab.h                  21 Public declarations for the above
! str.c                   15 String handling package
  str.h                   20 Public declarations for the above
  t/README                 1 Instructions for regression tests
! t/TEST                  22 The regression tester
  t/base.cond             23 See if conditionals work
! t/base.if               24 See if if works
  t/base.lex              22 See if lexical items work
! t/base.pat              24 See if pattern matching works
! t/base.term             23 See if various terms work
  t/cmd.elsif             23 See if else-if works
! t/cmd.for               23 See if for loops work
! t/cmd.mod               23 See if statement modifiers work
! t/cmd.subval            22 See if subroutine values work
! t/cmd.switch             5 See if switch optimizations work
! t/cmd.while             22 See if while loops work
  t/comp.cmdopt           21 See if command optimization works
! t/comp.cpp              23 See if C preprocessor works
  t/comp.decl             23 See if declarations work
! t/comp.multiline        23 See if multiline strings work
! t/comp.package          23 See if packages work
  t/comp.script           23 See if script invokation works
  t/comp.term             22 See if more terms work
! t/io.argv               23 See if ARGV stuff works
  t/io.dup                23 See if >& works right
  t/io.fs                 21 See if directory manipulations work
  t/io.inplace            23 See if inplace editing works
! t/io.pipe               24 See if secure pipes work
  t/io.print              23 See if print commands work
! t/io.tell               22 See if file seeking works
  t/op.append             23 See if . works
! t/op.array              21 See if array operations work
! t/op.auto               22 See if autoincrement et all work
! t/op.chop               15 See if chop works
! t/op.cond               24 See if conditional expressions work
! t/op.dbm                22 See if dbm binding works
! t/op.delete             14 See if delete works
! t/op.do                 23 See if subroutines work
  t/op.each               22 See if associative iterators work
  t/op.eval               22 See if eval operator works
! t/op.exec               23 See if exec and system work
! t/op.exp                23 See if math functions work
  t/op.flip               23 See if range operator works
! t/op.fork               24 See if fork works
  t/op.glob               23 See if <*> works
! t/op.goto               23 See if goto works
! t/op.index              23 See if index works
! t/op.int                12 See if int works
! t/op.join               24 See if join works
! t/op.list               20 See if array lists work
! t/op.local              23 See if local works
! t/op.magic              23 See if magic variables work
  t/op.mkdir              23 See if mkdir works
! t/op.oct                24 See if oct and hex work
  t/op.ord                23 See if ord works
  t/op.pack               23 See if pack and unpack work
! t/op.pat                21 See if esoteric patterns work
! t/op.push               24 See if push and pop work
! t/op.range              23 See if .. works
! t/op.read               23 See if read() works
! t/op.regexp             23 See if regular expressions work
! t/op.repeat             23 See if x operator works
! t/op.sleep               7 See if sleep works
  t/op.sort               23 See if sort works
  t/op.split               1 See if split works
! t/op.sprintf            24 See if sprintf works
! t/op.stat               20 See if stat works
! t/op.study              22 See if study works
! t/op.substr              6 See if substr works
! t/op.subst              21 See if substitutions work
  t/op.time               22 See if time functions work
  t/op.undef              22 See if undef works
! t/op.unshift            24 See if unshift works
! t/op.vec                23 See if vectors work
! t/op.write              23 See if write works
! t/re_tests              21 Input file for op.regexp
! toke.c                   5 The tokener
! util.c                  16 Utility routines
! util.h                  23 Public declarations for the above
  x2p/EXTERN.h            23 Same as above
  x2p/INTERN.h            23 Same as above
! x2p/Makefile.SH         21 Precursor to Makefile
! x2p/a2p.h               20 Global declarations
  x2p/a2p.man             19 Manual page for awk to perl translator
! x2p/a2p.y               18 A yacc grammer for awk
  x2p/a2py.c              15 Awk compiler, sort of
! x2p/handy.h             23 Handy definitions
! x2p/hash.c              20 Associative arrays again
  x2p/hash.h              22 Public declarations for the above
! x2p/s2p.SH               8 Sed to perl translator
! x2p/s2p.man             22 Manual page for sed to perl translator
  x2p/str.c               18 String handling package
! x2p/str.h               23 Public declarations for the above
! x2p/util.c              20 Utility routines
! x2p/util.h              23 Public declarations for the above
! x2p/walk.c               3 Parse tree walker



More information about the Alt.sources mailing list