/* 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; } }
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 (); }
/* 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; }