if (tp[0] == '\\') if (tp[1] != '\0') tp += 2; else ++tp;
if (tp[0] == '\\' && tp[1] != '\0') tp += 2;
translate_string (char *str, struct charset_t *charset){  char *buf;  size_t bufact = 0;  size_t bufmax = 56;  buf = (char *) xmalloc (bufmax);  while (str[0] != '\0')    {      char *tp;      unsigned int value;      if (str[0] != '<')	{	  ADDC (*str++);	  continue;	}      tp = &str[1];      while (tp[0] != '\0' && tp[0] != '>')	if (tp[0] == '\\')	  if (tp[1] != '\0')	    tp += 2;	  else	    ++tp;	else	  ++tp;      if (tp[0] == '\0')	{	  free (buf);	  return NULL;	}      value = charset_find_value (&charset->char_table, str + 1,				  tp - (str + 1));      if ((wchar_t) value == ILLEGAL_CHAR_VALUE)	{	  free (buf);	  return NULL;	}      else	/* Encode string using current method.  */	ADDC (value);      str = &tp[1];    }  ADDC ('\0');  return buf;}