char *opname;
const char *opname;
cplus_demangle_opname (opname, result, options)     char *opname;     char *result;     int options;{  int len, i, len1, ret;  string type;  struct work_stuff work[1];  const char *tem;  len = strlen(opname);  result[0] = '\0';  ret = 0;  work->options = options;    if (opname[0] == '_' && opname[1] == '_'	  && opname[2] == 'o' && opname[3] == 'p')    {      /* ANSI.  */      /* type conversion operator.  */      tem = opname + 4;      if (do_type (work, &tem, &type))	{	  strcat (result, "operator ");	  strncat (result, type.b, type.p - type.b);	  string_delete (&type);	  ret = 1;	}    }  else if (opname[0] == '_' && opname[1] == '_'	   && opname[2] >= 'a' && opname[2] <= 'z'	   && opname[3] >= 'a' && opname[3] <= 'z')    {      if (opname[4] == '\0')	{	  /* Operator.  */	  for (i = 0; i < sizeof (optable) / sizeof (optable[0]); i++)	    {	      if (strlen (optable[i].in) == 2		  && memcmp (optable[i].in, opname + 2, 2) == 0)		{		  strcat (result, "operator");		  strcat (result, optable[i].out);		  ret = 1;		  break;		}	    }	}      else	{	  if (opname[2] == 'a' && opname[5] == '\0')	    {	      /* Assignment. */	      for (i = 0; i < sizeof (optable) / sizeof (optable[0]); i++)		{		  if (strlen (optable[i].in) == 3		      && memcmp (optable[i].in, opname + 2, 3) == 0)		    {		      strcat (result, "operator");		      strcat (result, optable[i].out);		      ret = 1;		      break;		    }		      		}	    }	}    }  else if (len >= 3       && opname[0] == 'o'      && opname[1] == 'p'      && strchr (cplus_markers, opname[2]) != NULL)    {      /* see if it's an assignment expression */      if (len >= 10 /* op$assign_ */	  && memcmp (opname + 3, "assign_", 7) == 0)	{	  for (i = 0; i < sizeof (optable) / sizeof (optable[0]); i++)	    {	      len1 = len - 10;	      if (strlen (optable[i].in) == len1		  && memcmp (optable[i].in, opname + 10, len1) == 0)		{		  strcat (result, "operator");		  strcat (result, optable[i].out);		  strcat (result, "=");		  ret = 1;		  break;		}	    }	}      else	{	  for (i = 0; i < sizeof (optable) / sizeof (optable[0]); i++)	    {	      len1 = len - 3;	      if (strlen (optable[i].in) == len1 		  && memcmp (optable[i].in, opname + 3, len1) == 0)		{		  strcat (result, "operator");		  strcat (result, optable[i].out);		  ret = 1;		  break;		}	    }	}    }  else if (len >= 5 && memcmp (opname, "type", 4) == 0	   && strchr (cplus_markers, opname[4]) != NULL)    {      /* type conversion operator */      tem = opname + 5;      if (do_type (work, &tem, &type))	{	  strcat (result, "operator ");	  strncat (result, type.b, type.p - type.b);	  string_delete (&type);	  ret = 1;	}    }  return ret;}