aboutsummaryrefslogtreecommitdiff
path: root/gcc/java/mangle.c
diff options
context:
space:
mode:
authorDavid Daney <ddaney@avtrex.com>2008-01-23 23:00:39 +0000
committerDavid Daney <daney@gcc.gnu.org>2008-01-23 23:00:39 +0000
commit3e603aef40cb6ac7e1e900ab8d2d74ce71cb6595 (patch)
treec5724340e6d582282ffea2d456a266bb7efcdf72 /gcc/java/mangle.c
parent6c660aeb0e8079ee3267af0dc3682ce9cdc91385 (diff)
downloadgcc-3e603aef40cb6ac7e1e900ab8d2d74ce71cb6595.zip
gcc-3e603aef40cb6ac7e1e900ab8d2d74ce71cb6595.tar.gz
gcc-3e603aef40cb6ac7e1e900ab8d2d74ce71cb6595.tar.bz2
2008-01-23 David Daney <ddaney@avtrex.com>
* class.c (hide) Rename to... (java_hide_decl) ... this throughout, and make public. * resource.c (Jr_count): Remove. (compile_resource_data): Call java_mangle_resource_name to generate decl name. Make resource decl public and hidden. * mangle.c (java_mangle_resource_name): New function. * java-tree.h (java_hide_decl, java_mangle_resource_name): Declare functions. From-SVN: r131767
Diffstat (limited to 'gcc/java/mangle.c')
-rw-r--r--gcc/java/mangle.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/gcc/java/mangle.c b/gcc/java/mangle.c
index c7624d5..c92be1c 100644
--- a/gcc/java/mangle.c
+++ b/gcc/java/mangle.c
@@ -796,6 +796,59 @@ compression_table_add (tree type)
TREE_VEC_ELT (compression_table, compression_next++) = type;
}
+/* Mangle an embedded resource file name. "_ZGr" is the prefix. A
+ '_' is prepended to the name so that names starting with a digit
+ can be demangled. The length and then the resulting name itself
+ are appended while escaping '$', '.', and '/' to: "$$", "$_", and
+ "$S". */
+
+tree
+java_mangle_resource_name (const char *name)
+{
+ int len = strlen (name);
+ char *buf = (char *) alloca (2 * len + 1);
+ char *pos;
+ const unsigned char *w1 = (const unsigned char *) name;
+ const unsigned char *w2;
+ const unsigned char *limit = w1 + len;
+
+ pos = buf;
+
+ init_mangling ();
+ MANGLE_RAW_STRING ("Gr");
+
+ *pos++ = '_';
+ while (w1 < limit)
+ {
+ int ch;
+ w2 = w1;
+ ch = UTF8_GET (w1, limit);
+ gcc_assert (ch > 0);
+ switch (ch)
+ {
+ case '$':
+ *pos++ = '$';
+ *pos++ = '$';
+ break;
+ case '.':
+ *pos++ = '$';
+ *pos++ = '_';
+ break;
+ case '/':
+ *pos++ = '$';
+ *pos++ = 'S';
+ break;
+ default:
+ memcpy (pos, w2, w1 - w2);
+ pos += w1 - w2;
+ break;
+ }
+ }
+ append_gpp_mangled_name (buf, pos - buf);
+
+ return finish_mangling ();
+}
+
/* Mangling initialization routine. */
static void