Commit 4f37ea7d by Nicolas Setton Committed by Arnaud Charlet

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
parent e7c9a058
......@@ -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';
}
......@@ -6,7 +6,7 @@
* *
* C Header 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- *
......@@ -33,8 +33,8 @@
/* 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. Objects and routines are fully handled; types are stripped of their
encodings.
CODED_NAME is the encoded entity name.
ADA_NAME is a pointer to a buffer, it will receive the Ada name. A safe
......@@ -44,6 +44,10 @@
added at the end of the Ada name and surrounded by ( and ). */
extern void __gnat_decode (const char *, char *, int);
/* This function will return the GNAT encodings, in a colon-separated list,
from the encoded form. The Ada encodings are described in exp_dbug.ads. */
extern void get_encoding (const char *, char *);
/* ada_demangle is added for COMPATIBILITY ONLY. It has the name of the
function used in the binutils and GDB. Always consider using __gnat_decode
instead of ada_demangle. Caller must free the pointer returned. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment