diff options
author | charlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-02-15 09:30:24 +0000 |
---|---|---|
committer | charlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-02-15 09:30:24 +0000 |
commit | 11ef74b2c6516991c7aeda4361c1a01c936d6444 (patch) | |
tree | ed585ce6c8c394decfc3a91560c18f3b99c07e72 /gcc/ada/adadecode.c | |
parent | e158ec764b6b58283c329a4f3b1910d7bf4671e7 (diff) | |
download | gcc-11ef74b2c6516991c7aeda4361c1a01c936d6444.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@111028 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ada/adadecode.c')
-rw-r--r-- | gcc/ada/adadecode.c | 58 |
1 files changed, 55 insertions, 3 deletions
diff --git a/gcc/ada/adadecode.c b/gcc/ada/adadecode.c index 428c37d3e99..12fcd02c702 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'; +} |