Beispiel #1
0
/* Extract and demangle type from MANGLED_STR and append it to TEMPBUF.
   Return 1 on success or 0 on failure.  */
static int
extract_type_info (const char *mangled_str, struct obstack *tempbuf)
{
  if (*mangled_str == '\0')
    return 0;
  switch (*mangled_str++)
    {
      case 'A': /* dynamic array */
      case 'G': /* static array */
      case 'H': /* associative array */
	if (!extract_type_info (mangled_str, tempbuf))
	  return 0;
	obstack_grow_str (tempbuf, "[]");
	return 1;
      case 'P': /* pointer */
	if (!extract_type_info (mangled_str, tempbuf))
	  return 0;
	obstack_grow_str (tempbuf, "*");
	return 1;
      case 'R': /* reference */
	if (!extract_type_info (mangled_str, tempbuf))
	  return 0;
	obstack_grow_str (tempbuf, "&");
	return 1;
      case 'Z': /* return value */
	return extract_type_info (mangled_str, tempbuf);
      case 'J': /* out */
	obstack_grow_str (tempbuf, "out ");
	return extract_type_info (mangled_str, tempbuf);
      case 'K': /* inout */
	obstack_grow_str (tempbuf, "inout ");
	return extract_type_info (mangled_str, tempbuf);
      case 'E': /* enum */
      case 'T': /* typedef */
      case 'D': /* delegate */
      case 'C': /* class */
      case 'S': /* struct */
	return extract_identifiers (mangled_str, tempbuf);

      /* basic types: */
      case 'n': obstack_grow_str (tempbuf, "none"); return 1;
      case 'v': obstack_grow_str (tempbuf, "void"); return 1;
      case 'g': obstack_grow_str (tempbuf, "byte"); return 1;
      case 'h': obstack_grow_str (tempbuf, "ubyte"); return 1;
      case 's': obstack_grow_str (tempbuf, "short"); return 1;
      case 't': obstack_grow_str (tempbuf, "ushort"); return 1;
      case 'i': obstack_grow_str (tempbuf, "int"); return 1;
      case 'k': obstack_grow_str (tempbuf, "uint"); return 1;
      case 'l': obstack_grow_str (tempbuf, "long"); return 1;
      case 'm': obstack_grow_str (tempbuf, "ulong"); return 1;
      case 'f': obstack_grow_str (tempbuf, "float"); return 1;
      case 'd': obstack_grow_str (tempbuf, "double"); return 1;
      case 'e': obstack_grow_str (tempbuf, "real"); return 1;

      /* imaginary and complex: */
      case 'o': obstack_grow_str (tempbuf, "ifloat"); return 1;
      case 'p': obstack_grow_str (tempbuf, "idouble"); return 1;
      case 'j': obstack_grow_str (tempbuf, "ireal"); return 1;
      case 'q': obstack_grow_str (tempbuf, "cfloat"); return 1;
      case 'r': obstack_grow_str (tempbuf, "cdouble"); return 1;
      case 'c': obstack_grow_str (tempbuf, "creal"); return 1;

      /* other types: */
      case 'b': obstack_grow_str (tempbuf, "bit"); return 1;
      case 'a': obstack_grow_str (tempbuf, "char"); return 1;
      case 'u': obstack_grow_str (tempbuf, "wchar"); return 1;
      case 'w': obstack_grow_str (tempbuf, "dchar"); return 1;

      default:
	obstack_grow_str (tempbuf, "unknown");
	return 1;
    }
}
Beispiel #2
0
bool SemanticVersion::parse (std::string const& input, bool debug)
{
    // May not have leading or trailing whitespace
    auto left_iter = std::find_if_not (input.begin (), input.end (),
        [](std::string::value_type c)
        {
            return std::isspace (c, std::locale::classic());
        });

    auto right_iter = std::find_if_not (input.rbegin (), input.rend (),
        [](std::string::value_type c)
        {
            return std::isspace (c, std::locale::classic());
        }).base ();

    // Must not be empty!
    if (left_iter >= right_iter)
        return false;

    std::string version (left_iter, right_iter);

    // May not have leading or trailing whitespace
    if (version != input)
        return false;

    // Must have major version number
    if (! chopUInt (majorVersion, std::numeric_limits <int>::max (), version))
        return false;
    if (! chop (".", version))
        return false;

    // Must have minor version number
    if (! chopUInt (minorVersion, std::numeric_limits <int>::max (), version))
        return false;
    if (! chop (".", version))
        return false;

    // Must have patch version number
    if (! chopUInt (patchVersion, std::numeric_limits <int>::max (), version))
        return false;

    // May have pre-release identifier list
    if (chop ("-", version))
    {
        if (!extract_identifiers (preReleaseIdentifiers, false, version))
            return false;

        // Must not be empty
        if (preReleaseIdentifiers.empty ())
            return false;
    }

    // May have metadata identifier list
    if (chop ("+", version))
    {
        if (!extract_identifiers (metaData, true, version))
            return false;

        // Must not be empty
        if (metaData.empty ())
            return false;
    }

    return version.empty ();
}
Beispiel #3
0
/* Implements the la_demangle language_defn routine for language D.  */
char *
d_demangle (const char *symbol, int options)
{
  struct obstack tempbuf;
  char *out_str;
  unsigned char is_func = 0;

  if (symbol == NULL)
    return NULL;
  else if (strcmp (symbol, "_Dmain") == 0)
    return xstrdup ("D main");

  obstack_init (&tempbuf);
  
  if (symbol[0] == '_' && symbol[1] == 'D')
    {
      symbol += 2;
      is_func = 1;
    }
  else if (strncmp (symbol, "__Class_", 8) == 0)
    symbol += 8;
  else if (strncmp (symbol, "__init_", 7) == 0)
    symbol += 7;
  else if (strncmp (symbol, "__vtbl_", 7) == 0)
    symbol += 7;
  else if (strncmp (symbol, "__modctor_", 10) == 0)
    symbol += 10;
  else if (strncmp (symbol, "__moddtor_", 10) == 0)
    symbol += 10;
  else if (strncmp (symbol, "__ModuleInfo_", 13) == 0)
    symbol += 13;
  else
    {
      obstack_free (&tempbuf, NULL);
      return NULL;
    }
  
  if (!extract_identifiers (symbol, &tempbuf))
    {
      obstack_free (&tempbuf, NULL);
      return NULL;
    }

  obstack_grow_str (&tempbuf, "(");
  if (is_func == 1 && *symbol == 'F')
    {
      symbol++;
      while (*symbol != '\0' && *symbol != 'Z')
	{
	  if (is_func == 1)
	    is_func++;
	  else
	    obstack_grow_str (&tempbuf, ", ");
	  if (!extract_type_info (symbol, &tempbuf))
	    {
	      obstack_free (&tempbuf, NULL);
	      return NULL;
	   }
	}
     }
  obstack_grow_str0 (&tempbuf, ")");

  /* Doesn't display the return type, but wouldn't be too hard to do.  */

  out_str = xstrdup (obstack_finish (&tempbuf));
  obstack_free (&tempbuf, NULL);
  return out_str;
}