8 #include "demangle-java.h"
10 #include "sane_ctype.h"
17 MODE_CTYPE = 3, /* class arg */
20 #define BASE_ENT(c, n) [c - 'A']=n
21 static const char *base_types['Z' - 'A' + 1] = {
22 BASE_ENT('B', "byte" ),
23 BASE_ENT('C', "char" ),
24 BASE_ENT('D', "double" ),
25 BASE_ENT('F', "float" ),
26 BASE_ENT('I', "int" ),
27 BASE_ENT('J', "long" ),
28 BASE_ENT('S', "short" ),
29 BASE_ENT('Z', "bool" ),
33 * demangle Java symbol between str and end positions and stores
34 * up to maxlen characters into buf. The parser starts in mode.
36 * Use MODE_PREFIX to process entire prototype till end position
37 * Use MODE_TYPE to process return type if str starts on return type char
44 __demangle_java_sym(const char *str, const char *end, char *buf, int maxlen, int mode)
52 end = str + strlen(str);
54 for (q = str; q != end; q++) {
56 if (rlen == (maxlen - 1))
61 if (mode == MODE_PREFIX || mode == MODE_CTYPE) {
62 if (mode == MODE_CTYPE) {
64 rlen += scnprintf(buf + rlen, maxlen - rlen, ", ");
67 rlen += scnprintf(buf + rlen, maxlen - rlen, "class ");
68 if (mode == MODE_PREFIX)
81 if (mode == MODE_TYPE) {
83 rlen += scnprintf(buf + rlen, maxlen - rlen, ", ");
84 rlen += scnprintf(buf + rlen, maxlen - rlen, "%s", base_types[*q - 'A']);
86 rlen += scnprintf(buf + rlen, maxlen - rlen, "[]");
93 if (mode == MODE_TYPE) {
94 rlen += scnprintf(buf + rlen, maxlen - rlen, "void");
96 rlen += scnprintf(buf + rlen, maxlen - rlen, "[]");
102 if (mode != MODE_TYPE)
107 if (mode != MODE_FUNC)
113 if (mode != MODE_TYPE)
119 if (mode != MODE_CLASS && mode != MODE_CTYPE)
121 /* safe because at least one other char to process */
122 if (isalpha(*(q + 1)))
123 rlen += scnprintf(buf + rlen, maxlen - rlen, ".");
124 if (mode == MODE_CLASS)
126 else if (mode == MODE_CTYPE)
130 if (mode != MODE_CLASS && mode != MODE_CTYPE)
132 rlen += scnprintf(buf + rlen, maxlen - rlen, ".");
145 * Demangle Java function signature (openJDK, not GCJ)
147 * str: string to parse. String is not modified
148 * flags: comobination of JAVA_DEMANGLE_* flags to modify demangling
150 * if input can be demangled, then a newly allocated string is returned.
151 * if input cannot be demangled, then NULL is returned
153 * Note: caller is responsible for freeing demangled string
156 java_demangle_sym(const char *str, int flags)
165 /* find start of retunr type */
166 p = strrchr(str, ')');
171 * expansion factor estimated to 3x
173 len = strlen(str) * 3 + 1;
179 if (!(flags & JAVA_DEMANGLE_NORET)) {
181 * get return type first
183 ptr = __demangle_java_sym(p + 1, NULL, buf, len, MODE_TYPE);
187 /* add space between return type and function prototype */
192 /* process function up to return type */
193 ptr = __demangle_java_sym(str, p + 1, buf + l1, len - l1, MODE_PREFIX);