aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/adadecode.c
diff options
context:
space:
mode:
authorNicolas Setton <setton@adacore.com>2006-02-15 10:30:24 +0100
committerArnaud Charlet <charlet@gcc.gnu.org>2006-02-15 10:30:24 +0100
commit4f37ea7d5f6ff5a77db8895034a682ff996b8bed (patch)
treeed585ce6c8c394decfc3a91560c18f3b99c07e72 /gcc/ada/adadecode.c
parente7c9a05835d72aae7cdb360c9b25368df67802f5 (diff)
downloadgcc-4f37ea7d5f6ff5a77db8895034a682ff996b8bed.zip
gcc-4f37ea7d5f6ff5a77db8895034a682ff996b8bed.tar.gz
gcc-4f37ea7d5f6ff5a77db8895034a682ff996b8bed.tar.bz2
adadecode.h, [...]: (__gnat_decode): Improve support of types.
2006-02-13 Nicolas Setton <setton@adacore.com> * adadecode.h, adadecode.c: (__gnat_decode): Improve support of types. (get_encoding): New subprogram. Extracts the encodings from an encoded Ada name. From-SVN: r111028
Diffstat (limited to 'gcc/ada/adadecode.c')
-rw-r--r--gcc/ada/adadecode.c58
1 files changed, 55 insertions, 3 deletions
diff --git a/gcc/ada/adadecode.c b/gcc/ada/adadecode.c
index 428c37d..12fcd02 100644
--- a/gcc/ada/adadecode.c
+++ b/gcc/ada/adadecode.c
@@ -6,7 +6,7 @@
* *
* C Implementation File *
* *
- * Copyright (C) 2001-2003, Free Software Foundation, Inc. *
+ * Copyright (C) 2001-2006, Free Software Foundation, Inc. *
* *
* GNAT is free software; you can redistribute it and/or modify it under *
* terms of the GNU General Public License as published by the Free Soft- *
@@ -98,8 +98,8 @@ ostrcpy (char *s1, char *s2)
/* This function will return the Ada name from the encoded form.
The Ada coding is done in exp_dbug.ads and this is the inverse function.
see exp_dbug.ads for full encoding rules, a short description is added
- below. Right now only objects and routines are handled. There is no support
- for Ada types.
+ below. Right now only objects and routines are handled. Ada types are
+ stripped of their encodings.
CODED_NAME is the encoded entity name.
@@ -159,6 +159,18 @@ __gnat_decode (const char *coded_name, char *ada_name, int verbose)
else
strcpy (ada_name, coded_name);
+ /* Check for the first triple underscore in the name. This indicates
+ that the name represents a type with encodings; in this case, we
+ need to strip the encodings. */
+ {
+ char *encodings;
+
+ if ((encodings = (char *) strstr (ada_name, "___")) != NULL)
+ {
+ *encodings = '\0';
+ }
+ }
+
/* Check for task body. */
if (has_suffix (ada_name, "TKB"))
{
@@ -321,3 +333,43 @@ ada_demangle (const char *coded_name)
__gnat_decode (coded_name, ada_name, 0);
return xstrdup (ada_name);
}
+
+void
+get_encoding (const char *coded_name, char *encoding)
+{
+ char * dest_index = encoding;
+ const char *p;
+ int found = 0;
+ int count = 0;
+
+ /* The heuristics is the following: we assume that the first triple
+ underscore in an encoded name indicates the beginning of the
+ first encoding, and that subsequent triple underscores indicate
+ the next encodings. We assume that the encodings are always at the
+ end of encoded names. */
+
+ for (p = coded_name; *p != '\0'; p++)
+ {
+ if (*p != '_')
+ count = 0;
+ else
+ if (++count == 3)
+ {
+ count = 0;
+
+ if (found)
+ {
+ dest_index = dest_index - 2;
+ *dest_index++ = ':';
+ }
+
+ p++;
+ found = 1;
+ }
+
+ if (found)
+ *dest_index++ = *p;
+ }
+
+ *dest_index = '\0';
+}