Path: utzoo!attcan!uunet!lll-winken!lll-lcc!ames!elroy!devvax!lroot
From: lroot@devvax.JPL.NASA.GOV (The Superuser)
Newsgroups: comp.sources.bugs
Subject: perl 2.0 patch #3
Summary: This is an official patch for perl 2.0.  Please apply it.
Message-ID: <2438@devvax.JPL.NASA.GOV>
Date: 13 Jul 88 00:54:17 GMT
Organization: Jet Propulsion Laboratory, Pasadena, CA
Lines: 1017

System: perl version 2.0
Patch #: 3
Priority: MEDIUM
Subject: patch 2 continued

Description:
	See patch 2.

Fix:	From rn, say "| patch -p -N -d DIR", where DIR is your perl source
	directory.  Outside of rn, say "cd DIR; patch -p -N  #define PATCHLEVEL 3

Index: perl.y
Prereq: 2.0
*** perl.y.old	Mon Jul 11 23:38:01 1988
--- perl.y	Mon Jul 11 23:38:03 1988
***************
*** 1,6 ****
! /* $Header: perl.y,v 2.0 88/06/05 00:09:36 root Exp $
   *
   * $Log:	perl.y,v $
   * Revision 2.0  88/06/05  00:09:36  root
   * Baseline version 2.0.
   * 
--- 1,11 ----
! /* $Header: perl.y,v 2.0.1.1 88/07/11 22:46:03 root Exp $
   *
   * $Log:	perl.y,v $
+  * Revision 2.0.1.1  88/07/11  22:46:03  root
+  * patch2: added **
+  * patch2: no longer blows yacc stack on long LISTs (made , left associative)
+  * patch2: added j() to join multidimensional subscripts
+  * 
   * Revision 2.0  88/06/05  00:09:36  root
   * Baseline version 2.0.
   * 
***************
*** 32,39 ****
  "unary operation",
  "file test",
  "<<",">>",
! "=~","!~",
! "unary -",
  "++", "--",
  "???"
  };
--- 37,44 ----
  "unary operation",
  "file test",
  "<<",">>",
! "=~","!~", "unary -",
! "**",
  "++", "--",
  "???"
  };
***************
*** 93,98 ****
--- 98,104 ----
  %left '*' '/' '%' 'x'
  %left MATCH NMATCH 
  %right '!' '~' UMINUS
+ %right POW
  %nonassoc INC DEC
  %left '('
  
***************
*** 298,304 ****
  			{ make_sub($2,$3); }
  	;
  
! expr	:	sexpr ',' expr
  			{ $$ = make_op(O_COMMA, 2, $1, $3, Nullarg,0); }
  	|	sexpr
  	;
--- 304,310 ----
  			{ make_sub($2,$3); }
  	;
  
! expr	:	expr ',' sexpr
  			{ $$ = make_op(O_COMMA, 2, $1, $3, Nullarg,0); }
  	|	sexpr
  	;
***************
*** 308,313 ****
--- 314,321 ----
  			    if ($1->arg_type == O_LIST)
  				$3 = listish($3);
  			    $$ = l(make_op(O_ASSIGN, 2, $1, $3, Nullarg,1)); }
+ 	|	sexpr POW '=' sexpr
+ 			{ $$ = l(make_op(O_POW, 2, $1, $4, Nullarg,0)); }
  	|	sexpr '*' '=' sexpr
  			{ $$ = l(make_op(O_MULTIPLY, 2, $1, $4, Nullarg,0)); }
  	|	sexpr '/' '=' sexpr
***************
*** 334,339 ****
--- 342,349 ----
  			{ $$ = l(make_op(O_CONCAT, 2, $1, $4, Nullarg,0)); }
  
  
+ 	|	sexpr POW sexpr
+ 			{ $$ = make_op(O_POW, 2, $1, $3, Nullarg,0); }
  	|	sexpr '*' sexpr
  			{ $$ = make_op(O_MULTIPLY, 2, $1, $3, Nullarg,0); }
  	|	sexpr '/' sexpr
***************
*** 456,465 ****
  				Nullarg, Nullarg, 1); }
  	|	REG '{' expr '}'	%prec '('
  			{ $$ = make_op(O_HASH, 2,
! 				$3, stab2arg(A_STAB,hadd($1)), Nullarg,0); }
  	|	DELETE REG '{' expr '}'	%prec '('
  			{ $$ = make_op(O_DELETE, 2,
! 				$4, stab2arg(A_STAB,hadd($2)), Nullarg,0); }
  	|	ARYLEN	%prec '('
  			{ $$ = stab2arg(A_ARYLEN,$1); }
  	|	RSTRING	%prec '('
--- 466,475 ----
  				Nullarg, Nullarg, 1); }
  	|	REG '{' expr '}'	%prec '('
  			{ $$ = make_op(O_HASH, 2,
! 				j($3), stab2arg(A_STAB,hadd($1)), Nullarg,0); }
  	|	DELETE REG '{' expr '}'	%prec '('
  			{ $$ = make_op(O_DELETE, 2,
! 				j($4), stab2arg(A_STAB,hadd($2)), Nullarg,0); }
  	|	ARYLEN	%prec '('
  			{ $$ = stab2arg(A_ARYLEN,$1); }
  	|	RSTRING	%prec '('

Index: perly.c
Prereq: 2.0.1.1
*** perly.c.old	Mon Jul 11 23:38:12 1988
--- perly.c	Mon Jul 11 23:38:14 1988
***************
*** 1,6 ****
! char rcsid[] = "$Header: perly.c,v 2.0.1.1 88/06/28 16:36:49 root Exp $";
  /*
   * $Log:	perly.c,v $
   * Revision 2.0.1.1  88/06/28  16:36:49  root
   * patch1: added DOSUID code
   * 
--- 1,18 ----
! char rcsid[] = "$Header: perly.c,v 2.0.1.2 88/07/11 23:02:05 root Exp $";
  /*
   * $Log:	perly.c,v $
+  * Revision 2.0.1.2  88/07/11  23:02:05  root
+  * patch2: added $` and $'
+  * patch2: kludged in a BLOCK for return to refer to
+  * patch2: doubled possible size of error message
+  * patch2: fixed bogus copy into string space
+  * patch2: kludged in a join around multiple subscripts
+  * patch2: changed make_list() to handle left-associative COMMA op
+  * patch2: portabilized some structure copies in make_list()
+  * patch2: put 1-deep cache of last expression eval'ed to save reparse on s///e
+  * patch2: eval no longer needs trailing ;
+  * patch2: LIB/*.pl in "do" may now be > 256 chars
+  * 
   * Revision 2.0.1.1  88/06/28  16:36:49  root
   * patch1: added DOSUID code
   * 
***************
*** 20,25 ****
--- 32,39 ----
  static int arg_tosave();
  static int spat_tosave();
  
+ static bool saw_return;
+ 
  main(argc,argv,env)
  register int argc;
  register char **argv;
***************
*** 350,358 ****
      if (sigstab = stabent("SIG",allstabs))
  	hadd(sigstab);
  
!     magicalize("!#?^~=-%0123456789.+&*()<>,\\/[|");
  
!     sawampersand = (stabent("&",FALSE) != Nullstab);
      if (tmpstab = stabent("0",allstabs))
  	str_set(STAB_STR(tmpstab),origfilename);
      if (tmpstab = stabent("$",allstabs))
--- 364,379 ----
      if (sigstab = stabent("SIG",allstabs))
  	hadd(sigstab);
  
!     magicalize("!#?^~=-%0123456789.+&*()<>,\\/[|`'");
  
!     amperstab = stabent("&",allstabs);
!     leftstab = stabent("`",allstabs);
!     rightstab = stabent("'",allstabs);
!     sawampersand = (amperstab || leftstab || rightstab);
! 
!     /* these aren't necessarily magical */
!     if (tmpstab = stabent(";",allstabs))
! 	str_set(STAB_STR(tmpstab),"\034");
      if (tmpstab = stabent("0",allstabs))
  	str_set(STAB_STR(tmpstab),origfilename);
      if (tmpstab = stabent("$",allstabs))
***************
*** 459,470 ****
  	safefree((char*)stab->stab_sub);
      }
      bzero((char *)sub, sizeof(SUBR));
-     sub->cmd = cmd;
      sub->filename = filename;
      tosave = anew(Nullstab);
      tosave->ary_fill = 0;	/* make 1 based */
      cmd_tosave(cmd);		/* this builds the tosave array */
      sub->tosave = tosave;
      stab->stab_sub = sub;
  }
  
--- 480,500 ----
  	safefree((char*)stab->stab_sub);
      }
      bzero((char *)sub, sizeof(SUBR));
      sub->filename = filename;
+     saw_return = FALSE;
      tosave = anew(Nullstab);
      tosave->ary_fill = 0;	/* make 1 based */
      cmd_tosave(cmd);		/* this builds the tosave array */
      sub->tosave = tosave;
+     if (saw_return) {
+ 	struct compcmd mycompblock;
+ 
+ 	mycompblock.comp_true = cmd;
+ 	mycompblock.comp_alt = Nullcmd;
+ 	cmd = add_label("SUB",make_ccmd(C_BLOCK,Nullarg,mycompblock));
+ 	saw_return = FALSE;
+     }
+     sub->cmd = cmd;
      stab->stab_sub = sub;
  }
  
***************
*** 911,926 ****
  yyerror(s)
  char *s;
  {
!     char tmpbuf[128];
      char *tname = tmpbuf;
  
      if (yychar > 256) {
! 	tname = tokename[yychar-256];
! 	if (strEQ(tname,"word"))
  	    strcpy(tname,tokenbuf);
! 	else if (strEQ(tname,"register"))
  	    sprintf(tname,"$%s",tokenbuf);
! 	else if (strEQ(tname,"array_length"))
  	    sprintf(tname,"$#%s",tokenbuf);
      }
      else if (!yychar)
--- 941,957 ----
  yyerror(s)
  char *s;
  {
!     char tmpbuf[258];
      char *tname = tmpbuf;
+     char *t;
  
      if (yychar > 256) {
! 	t = tokename[yychar-256];
! 	if (strEQ(t,"word"))
  	    strcpy(tname,tokenbuf);
! 	else if (strEQ(t,"register"))
  	    sprintf(tname,"$%s",tokenbuf);
! 	else if (strEQ(t,"array_length"))
  	    sprintf(tname,"$#%s",tokenbuf);
      }
      else if (!yychar)
***************
*** 931,942 ****
  	strcpy(tname,"^?");
      else
  	sprintf(tname,"%c",yychar);
!     sprintf(tokenbuf, "%s in file %s at line %d, next token \"%s\"\n",
        s,filename,line,tname);
      if (in_eval)
! 	str_set(stabent("@",TRUE)->stab_val,tokenbuf);
      else
! 	fputs(tokenbuf,stderr);
  }
  
  ARG *
--- 962,973 ----
  	strcpy(tname,"^?");
      else
  	sprintf(tname,"%c",yychar);
!     sprintf(buf, "%s in file %s at line %d, next token \"%s\"\n",
        s,filename,line,tname);
      if (in_eval)
! 	str_set(stabent("@",TRUE)->stab_val,buf);
      else
! 	fputs(buf,stderr);
  }
  
  ARG *
***************
*** 1437,1443 ****
--- 1468,1490 ----
      return arg;
  }
  
+ /* maybe do a join on multiple array dimensions */
+ 
  ARG *
+ j(arg)
+ register ARG *arg;
+ {
+     if (arg && arg->arg_type == O_COMMA) {
+ 	arg = listish(arg);
+ 	arg = make_op(O_JOIN, 2,
+ 	    stab2arg(A_STAB,stabent(";",TRUE)),
+ 	    arg,
+ 	    Nullarg, 0);
+     }
+     return arg;
+ }
+ 
+ ARG *
  make_list(arg)
  register ARG *arg;
  {
***************
*** 1458,1466 ****
      for (i = 2, node = arg; ; i++) {
  	if (node->arg_len < 2)
  	    break;
!         if (node[2].arg_type != A_EXPR)
  	    break;
! 	node = node[2].arg_ptr.arg_arg;
  	if (node->arg_type != O_COMMA)
  	    break;
      }
--- 1505,1513 ----
      for (i = 2, node = arg; ; i++) {
  	if (node->arg_len < 2)
  	    break;
!         if (node[1].arg_type != A_EXPR)
  	    break;
! 	node = node[1].arg_ptr.arg_arg;
  	if (node->arg_type != O_COMMA)
  	    break;
      }
***************
*** 1468,1484 ****
  	node = arg;
  	arg = op_new(i);
  	tmpstr = arg->arg_ptr.arg_str;
  	*arg = *node;		/* copy everything except the STR */
  	arg->arg_ptr.arg_str = tmpstr;
! 	for (j = 1; ; ) {
! 	    arg[j] = node[1];
! 	    ++j;		/* Bug in Xenix compiler */
! 	    if (j >= i) {
! 		arg[j] = node[2];
  		free_arg(node);
  		break;
  	    }
! 	    nxtnode = node[2].arg_ptr.arg_arg;
  	    free_arg(node);
  	    node = nxtnode;
  	}
--- 1515,1543 ----
  	node = arg;
  	arg = op_new(i);
  	tmpstr = arg->arg_ptr.arg_str;
+ #ifdef STRUCTCOPY
  	*arg = *node;		/* copy everything except the STR */
+ #else
+ 	bcopy((char *)node, (char *)arg, sizeof(ARG));
+ #endif
  	arg->arg_ptr.arg_str = tmpstr;
! 	for (j = i; ; ) {
! #ifdef STRUCTCOPY
! 	    arg[j] = node[2];
! #else
! 	    bcopy((char *)(node+2), (char *)(arg+j), sizeof(ARG));
! #endif
! 	    --j;		/* Bug in Xenix compiler */
! 	    if (j < 2) {
! #ifdef STRUCTCOPY
! 		arg[1] = node[1];
! #else
! 		bcopy((char *)(node+1), (char *)(arg+1), sizeof(ARG));
! #endif
  		free_arg(node);
  		break;
  	    }
! 	    nxtnode = node[1].arg_ptr.arg_arg;
  	    free_arg(node);
  	    node = nxtnode;
  	}
***************
*** 1709,1714 ****
--- 1768,1775 ----
      line_t oldline = line;
      int oldtmps_base = tmps_base;
      int oldsave = savestack->ary_fill;
+     static char *last_eval = Nullch;
+     static CMD *last_root = Nullcmd;
  
      tmps_base = tmps_max;
      str_set(stabent("@",TRUE)->stab_val,"");
***************
*** 1716,1721 ****
--- 1777,1783 ----
  	filename = "(eval)";
  	line = 1;
  	str_sset(linestr,str);
+ 	str_cat(linestr,";");		/* be kind to them */
      }
      else {
  	filename = savestr(str_get(str));	/* can't free this easily */
***************
*** 1724,1734 ****
  	ar = incstab->stab_array;
  	if (!rsfp && *filename != '/') {
  	    for (i = 0; i <= ar->ary_fill; i++) {
! 		sprintf(tokenbuf,"%s/%s",str_get(afetch(ar,i)),filename);
! 		rsfp = fopen(tokenbuf,"r");
  		if (rsfp) {
  		    free(filename);
! 		    filename = savestr(tokenbuf);
  		    break;
  		}
  	    }
--- 1786,1796 ----
  	ar = incstab->stab_array;
  	if (!rsfp && *filename != '/') {
  	    for (i = 0; i <= ar->ary_fill; i++) {
! 		sprintf(buf,"%s/%s",str_get(afetch(ar,i)),filename);
! 		rsfp = fopen(buf,"r");
  		if (rsfp) {
  		    free(filename);
! 		    filename = savestr(buf);
  		    break;
  		}
  	    }
***************
*** 1742,1758 ****
      }
      in_eval++;
      bufptr = str_get(linestr);
!     if (setjmp(eval_env))
  	retval = 1;
!     else
! 	retval = yyparse();
      myroot = eval_root;		/* in case cmd_exec does another eval! */
!     if (retval)
  	str = &str_no;
      else {
  	str = str_static(cmd_exec(eval_root));
  				/* if we don't save str, free zaps it */
! 	cmd_free(myroot);	/* can't free on error, for some reason */
      }
      in_eval--;
      filename = oldfile;
--- 1804,1842 ----
      }
      in_eval++;
      bufptr = str_get(linestr);
!     if (setjmp(eval_env)) {
  	retval = 1;
! 	last_root = Nullcmd;
!     }
!     else {
! 	if (last_root && *bufptr == *last_eval && strEQ(bufptr,last_eval)) {
! 	    retval = 0;
! 	    eval_root = last_root;	/* no point in reparsing */
! 	}
! 	else if (in_eval == 1) {
! 	    if (last_root) {
! 		safefree(last_eval);
! 		cmd_free(last_root);
! 	    }
! 	    last_eval = savestr(bufptr);
! 	    last_root = Nullcmd;
! 	    retval = yyparse();
! 	    if (!retval)
! 		last_root = eval_root;
! 	}
! 	else
! 	    retval = yyparse();
!     }
      myroot = eval_root;		/* in case cmd_exec does another eval! */
!     if (retval) {
  	str = &str_no;
+ 	last_root = Nullcmd;	/* can't free on error, for some reason */
+     }
      else {
  	str = str_static(cmd_exec(eval_root));
  				/* if we don't save str, free zaps it */
! 	if (in_eval != 1 && myroot != last_root)
! 	    cmd_free(myroot);
      }
      in_eval--;
      filename = oldfile;
***************
*** 1940,1948 ****
--- 2024,2036 ----
  	}
      }
      switch (arg->arg_type) {
+     case O_RETURN:
+ 	saw_return = TRUE;
+ 	break;
      case O_EVAL:
      case O_SUBR:
  	saving = TRUE;
+ 	break;
      }
      if (saving)
  	apush(tosave,arg->arg_ptr.arg_str);

Index: regexp.c
Prereq: 2.0.1.1
*** regexp.c.old	Mon Jul 11 23:38:31 1988
--- regexp.c	Mon Jul 11 23:38:34 1988
***************
*** 7,15 ****
   * blame Henry for some of the lack of readability.
   */
  
! /* $Header: regexp.c,v 2.0.1.1 88/06/28 16:37:19 root Exp $
   *
   * $Log:	regexp.c,v $
   * Revision 2.0.1.1  88/06/28  16:37:19  root
   * patch1: removed redundant debugging code
   * 
--- 7,20 ----
   * blame Henry for some of the lack of readability.
   */
  
! /* $Header: regexp.c,v 2.0.1.2 88/07/11 23:05:53 root Exp $
   *
   * $Log:	regexp.c,v $
+  * Revision 2.0.1.2  88/07/11  23:05:53  root
+  * patch2: added Hokey's workaround for 68000 addlepation
+  * patch2: changed some savestr's to avoid recalculating length when we know it
+  * patch2: fixed dumper in dumper
+  * 
   * Revision 2.0.1.1  88/06/28  16:37:19  root
   * patch1: removed redundant debugging code
   * 
***************
*** 801,807 ****
--- 806,823 ----
  			*flagp |= HASWIDTH;
  			if (len == 1)
  				*flagp |= SIMPLE;
+ #ifdef m68k
+ #define Vomit	/* Hokey's workaround */
+ #endif
+ #ifdef Vomit
+ 			{
+ 				char *rs = regcode;
+ #endif Vomit
  			*OPERAND(ret) = len;
+ #ifdef Vomit
+ 				regcode = rs;
+ 			}
+ #endif Vomit
  			regc('\0');
  		}
  		break;
***************
*** 1225,1231 ****
  	register int tmp, i;
  	register char *string = stringarg;
  	register char *c;
- 	extern char *savestr();
  
  	/* Be paranoid... */
  	if (prog == NULL || string == NULL) {
--- 1241,1246 ----
***************
*** 1241,1247 ****
  
  	if (prog->do_folding) {
  		i = strend - string;
! 		string = savestr(string);
  		strend = string + i;
  		for (s = string; *s; s++)
  			if (isupper(*s))
--- 1256,1264 ----
  
  	if (prog->do_folding) {
  		i = strend - string;
! 		c = safemalloc((MEM_SIZE)(i+1));
! 		bcopy(string, c, i+1);
! 		string = c;
  		strend = string + i;
  		for (s = string; *s; s++)
  			if (isupper(*s))
***************
*** 1421,1427 ****
  
      got_it:
  	if (prog->nparens || sawampersand || prog->do_folding) {
! 		s = savestr(stringarg);	/* so $digit will always work */
  		if (prog->subbase)
  			safefree(prog->subbase);
  		prog->subbase = s;
--- 1438,1446 ----
  
      got_it:
  	if (prog->nparens || sawampersand || prog->do_folding) {
! 		i = strend - string;
! 		s = safemalloc((MEM_SIZE)(i+1)); /* so $digit will work later */
! 		bcopy(stringarg, s, i+1);
  		if (prog->subbase)
  			safefree(prog->subbase);
  		prog->subbase = s;
***************
*** 1942,1948 ****
  	if (r->regstart)
  		printf("start `%s' ", r->regstart->str_ptr);
  	if (r->regstclass)
! 		printf("stclass `%s' ", regprop(OP(r->regstclass)));
  	if (r->reganch)
  		printf("anchored ");
  	if (r->regmust != NULL)
--- 1961,1967 ----
  	if (r->regstart)
  		printf("start `%s' ", r->regstart->str_ptr);
  	if (r->regstclass)
! 		printf("stclass `%s' ", regprop(r->regstclass));
  	if (r->reganch)
  		printf("anchored ");
  	if (r->regmust != NULL)
***************
*** 1959,1965 ****
  char *op;
  {
  	register char *p;
- 	static char buf[50];
  
  	(void) strcpy(buf, ":");
  
--- 1978,1983 ----


Index: stab.c
Prereq: 2.0
*** stab.c.old	Mon Jul 11 23:38:45 1988
--- stab.c	Mon Jul 11 23:38:46 1988
***************
*** 1,6 ****
! /* $Header: stab.c,v 2.0 88/06/05 00:11:01 root Exp $
   *
   * $Log:	stab.c,v $
   * Revision 2.0  88/06/05  00:11:01  root
   * Baseline version 2.0.
   * 
--- 1,10 ----
! /* $Header: stab.c,v 2.0.1.1 88/07/11 23:07:44 root Exp $
   *
   * $Log:	stab.c,v $
+  * Revision 2.0.1.1  88/07/11  23:07:44  root
+  * patch2: added $` and $'
+  * patch2: maximum length of groups list can now exceed 256 chars
+  * 
   * Revision 2.0  88/06/05  00:11:01  root
   * Baseline version 2.0.
   * 
***************
*** 96,101 ****
--- 100,129 ----
  	    goto getparen;
  	}
  	break;
+     case '`':
+ 	if (curspat) {
+ 	    if (curspat->spat_regexp &&
+ 	      (s = curspat->spat_regexp->subbase) ) {
+ 		i = curspat->spat_regexp->startp[0] - s;
+ 		if (i >= 0)
+ 		    str_nset(stab->stab_val,s,i);
+ 		else
+ 		    str_nset(stab->stab_val,"",0);
+ 	    }
+ 	    else
+ 		str_nset(stab->stab_val,"",0);
+ 	}
+ 	break;
+     case '\'':
+ 	if (curspat) {
+ 	    if (curspat->spat_regexp &&
+ 	      (s = curspat->spat_regexp->endp[0]) ) {
+ 		str_set(stab->stab_val,s);
+ 	    }
+ 	    else
+ 		str_nset(stab->stab_val,"",0);
+ 	}
+ 	break;
      case '.':
  	if (last_in_stab) {
  	    str_numset(stab->stab_val,(double)last_in_stab->stab_io->lines);
***************
*** 155,165 ****
  	str_numset(stab->stab_val,(double)euid);
  	break;
      case '(':
! 	s = tokenbuf;
  	sprintf(s,"%d",(int)getgid());
  	goto add_groups;
      case ')':
! 	s = tokenbuf;
  	sprintf(s,"%d",(int)getegid());
        add_groups:
  	while (*s) s++;
--- 183,193 ----
  	str_numset(stab->stab_val,(double)euid);
  	break;
      case '(':
! 	s = buf;
  	sprintf(s,"%d",(int)getgid());
  	goto add_groups;
      case ')':
! 	s = buf;
  	sprintf(s,"%d",(int)getegid());
        add_groups:
  	while (*s) s++;
***************
*** 177,183 ****
  	    }
  	}
  #endif
! 	str_set(stab->stab_val,tokenbuf);
  	break;
      }
      return stab->stab_val;
--- 205,211 ----
  	    }
  	}
  #endif
! 	str_set(stab->stab_val,buf);
  	break;
      }
      return stab->stab_val;

Index: toke.c
Prereq: 2.0.1.1
*** toke.c.old	Mon Jul 11 23:39:11 1988
--- toke.c	Mon Jul 11 23:39:13 1988
***************
*** 1,6 ****
! /* $Header: toke.c,v 2.0.1.1 88/06/28 16:39:50 root Exp $
   *
   * $Log:	toke.c,v $
   * Revision 2.0.1.1  88/06/28  16:39:50  root
   * patch1: tr/x/y/ can dump core if y is shorter than x
   * 
--- 1,9 ----
! /* $Header: toke.c,v 2.0.1.2 88/07/11 23:11:41 root Exp $
   *
   * $Log:	toke.c,v $
+  * Revision 2.0.1.2  88/07/11  23:11:41  root
+  * patch2: added tokens for new operators
+  * 
   * Revision 2.0.1.1  88/06/28  16:39:50  root
   * patch1: tr/x/y/ can dump core if y is shorter than x
   * 
***************
*** 47,53 ****
      switch (*s) {
      default:
  	fprintf(stderr,
! 	    "Unrecognized character %c in file %s line %ld--ignoring.\n",
  	     *s++,filename,(long)line);
  	goto retry;
      case 0:
--- 50,56 ----
      switch (*s) {
      default:
  	fprintf(stderr,
! 	    "Unrecognized character \\%03o in file %s line %ld--ignoring.\n",
  	     *s++,filename,(long)line);
  	goto retry;
      case 0:
***************
*** 162,177 ****
  	    }
  	}
  	/*FALL THROUGH*/
      case '+':
  	if (s[1] == *s) {
! 	    s++;
  	    if (*s++ == '+')
  		RETURN(INC);
! 	    else
  		RETURN(DEC);
  	}
  	/* FALL THROUGH */
-     case '*':
      case '%':
      case '^':
      case '~':
--- 165,182 ----
  	    }
  	}
  	/*FALL THROUGH*/
+     case '*':
      case '+':
  	if (s[1] == *s) {
! 	    tmp = *s++;
  	    if (*s++ == '+')
  		RETURN(INC);
! 	    else if (tmp == '-')
  		RETURN(DEC);
+ 	    else
+ 		OPERATOR(POW);
  	}
  	/* FALL THROUGH */
      case '%':
      case '^':
      case '~':
***************
*** 311,316 ****
--- 316,323 ----
  	OPERATOR(WORD);
      case 'a': case 'A':
  	SNARFWORD;
+ 	if (strEQ(d,"atan2"))
+ 	    FUN2(O_ATAN2);
  	yylval.cval = savestr(d);
  	OPERATOR(WORD);
      case 'b': case 'B':
***************
*** 337,342 ****
--- 344,351 ----
  	    yylval.ival = O_CHOWN;
  	    OPERATOR(LISTOP);
  	}
+ 	if (strEQ(d,"cos"))
+ 	    FUN1(O_COS);
  	yylval.cval = savestr(d);
  	OPERATOR(WORD);
      case 'd': case 'D':
***************
*** 507,512 ****
--- 516,523 ----
  	OPERATOR(WORD);
      case 'r': case 'R':
  	SNARFWORD;
+ 	if (strEQ(d,"return"))
+ 	    UNI(O_RETURN);
  	if (strEQ(d,"reset"))
  	    UNI(O_RESET);
  	if (strEQ(d,"redo"))
***************
*** 513,518 ****
--- 524,531 ----
  	    LOOPX(O_REDO);
  	if (strEQ(d,"rename"))
  	    FUN2(O_RENAME);
+ 	if (strEQ(d,"rand"))
+ 	    UNI(O_RAND);
  	yylval.cval = savestr(d);
  	OPERATOR(WORD);
      case 's': case 'S':
***************
*** 555,560 ****
--- 568,577 ----
  	    yylval.ival = O_SORT;
  	    OPERATOR(LISTOP);
  	}
+ 	if (strEQ(d,"srand"))
+ 	    FUN1(O_SRAND);
+ 	if (strEQ(d,"sin"))
+ 	    FUN1(O_SIN);
  	yylval.cval = savestr(d);
  	OPERATOR(WORD);
      case 't': case 'T':
***************
*** 843,849 ****
  	fatal("Substitution replacement not terminated");
      spat->spat_repl = yylval.arg;
      spat->spat_flags |= SPAT_ONCE;
!     while (*s == 'g' || *s == 'i') {
  	if (*s == 'g') {
  	    s++;
  	    spat->spat_flags &= ~SPAT_ONCE;
--- 860,875 ----
  	fatal("Substitution replacement not terminated");
      spat->spat_repl = yylval.arg;
      spat->spat_flags |= SPAT_ONCE;
!     while (*s == 'g' || *s == 'i' || *s == 'e') {
! 	if (*s == 'e') {
! 	    s++;
! 	    if (spat->spat_repl[1].arg_type == A_DOUBLE)
! 		spat->spat_repl[1].arg_type = A_SINGLE;
! 	    spat->spat_repl = make_op(O_EVAL,1,
! 		spat->spat_repl,
! 		Nullarg,
! 		Nullarg,0);
! 	}
  	if (*s == 'g') {
  	    s++;
  	    spat->spat_flags &= ~SPAT_ONCE;

Index: util.c
Prereq: 2.0
*** util.c.old	Mon Jul 11 23:39:21 1988
--- util.c	Mon Jul 11 23:39:22 1988
***************
*** 1,6 ****
! /* $Header: util.c,v 2.0 88/06/05 00:15:11 root Exp $
   *
   * $Log:	util.c,v $
   * Revision 2.0  88/06/05  00:15:11  root
   * Baseline version 2.0.
   * 
--- 1,9 ----
! /* $Header: util.c,v 2.0.1.1 88/07/11 23:12:55 root Exp $
   *
   * $Log:	util.c,v $
+  * Revision 2.0.1.1  88/07/11  23:12:55  root
+  * patch2: increased maximum error message size from 256 to 1024
+  * 
   * Revision 2.0  88/06/05  00:15:11  root
   * Baseline version 2.0.
   * 
***************
*** 437,443 ****
  {
      char *s;
  
!     s = tokenbuf;
      sprintf(s,pat,a1,a2,a3,a4);
      s += strlen(s);
      if (s[-1] != '\n') {
--- 440,446 ----
  {
      char *s;
  
!     s = buf;
      sprintf(s,pat,a1,a2,a3,a4);
      s += strlen(s);
      if (s[-1] != '\n') {
***************
*** 467,476 ****
  
      mess(pat,a1,a2,a3,a4);
      if (in_eval) {
! 	str_set(stabent("@",TRUE)->stab_val,tokenbuf);
  	longjmp(eval_env,1);
      }
!     fputs(tokenbuf,stderr);
      fflush(stderr);
      if (e_fp)
  	UNLINK(e_tmpname);
--- 470,479 ----
  
      mess(pat,a1,a2,a3,a4);
      if (in_eval) {
! 	str_set(stabent("@",TRUE)->stab_val,buf);
  	longjmp(eval_env,1);
      }
!     fputs(buf,stderr);
      fflush(stderr);
      if (e_fp)
  	UNLINK(e_tmpname);
***************
*** 483,489 ****
  char *pat;
  {
      mess(pat,a1,a2,a3,a4);
!     fputs(tokenbuf,stderr);
      fflush(stderr);
  }
  
--- 486,492 ----
  char *pat;
  {
      mess(pat,a1,a2,a3,a4);
!     fputs(buf,stderr);
      fflush(stderr);
  }