rem: eval6 (void)
add: eval6 (bool evaluate)
context: eval6 (void){  VALUE *l;  VALUE *r;  VALUE *v;  VALUE *i1;  VALUE *i2;#ifdef EVAL_TRACE  trace ("eval6");#endif  if (nextarg ("+"))    {      if (nomoreargs ())	error (2, 0, _("syntax error"));      return str_value (*args++);    }  else if (nextarg ("length"))    {      r = eval6 ();      tostring (r);      v = int_value (strlen (r->u.s));      freev (r);      return v;    }  else if (nextarg ("match"))    {      l = eval6 ();      r = eval6 ();      v = docolon (l, r);      freev (l);      freev (r);      return v;    }  else if (nextarg ("index"))    {      l = eval6 ();      r = eval6 ();      tostring (l);      tostring (r);      v = int_value (strcspn (l->u.s, r->u.s) + 1);      if (v->u.i == strlen (l->u.s) + 1)	v->u.i = 0;      freev (l);      freev (r);      return v;    }  else if (nextarg ("substr"))    {      l = eval6 ();      i1 = eval6 ();      i2 = eval6 ();      tostring (l);      if (!toarith (i1) || !toarith (i2)	  || strlen (l->u.s) < i1->u.i	  || i1->u.i <= 0 || i2->u.i <= 0)	v = str_value ("");      else	{	  v = NEW (VALUE);	  v->type = string;	  v->u.s = strncpy ((char *) xmalloc (i2->u.i + 1),			    l->u.s + i1->u.i - 1, i2->u.i);	  v->u.s[i2->u.i] = 0;	}      freev (l);      freev (i1);      freev (i2);      return v;    }  else    return eval7 ();}