Lines Matching defs:rdm
89 peek (const struct rust_demangler *rdm)
91 if (rdm->next < rdm->sym_len)
92 return rdm->sym[rdm->next];
97 eat (struct rust_demangler *rdm, char c)
99 if (peek (rdm) == c)
101 rdm->next++;
109 next (struct rust_demangler *rdm)
111 char c = peek (rdm);
113 rdm->errored = 1;
115 rdm->next++;
120 parse_integer_62 (struct rust_demangler *rdm)
125 if (eat (rdm, '_'))
129 while (!eat (rdm, '_'))
131 c = next (rdm);
141 rdm->errored = 1;
149 parse_opt_integer_62 (struct rust_demangler *rdm, char tag)
151 if (!eat (rdm, tag))
153 return 1 + parse_integer_62 (rdm);
157 parse_disambiguator (struct rust_demangler *rdm)
159 return parse_opt_integer_62 (rdm, 's');
163 parse_hex_nibbles (struct rust_demangler *rdm, uint64_t *value)
171 while (!eat (rdm, '_'))
175 c = next (rdm);
182 rdm->errored = 1;
203 parse_ident (struct rust_demangler *rdm)
215 if (rdm->version != -1)
216 is_punycode = eat (rdm, 'u');
218 c = next (rdm);
221 rdm->errored = 1;
227 while (ISDIGIT (peek (rdm)))
228 len = len * 10 + (next (rdm) - '0');
231 if (rdm->version != -1)
232 eat (rdm, '_');
234 start = rdm->next;
235 rdm->next += len;
237 if ((start > rdm->next) || (rdm->next > rdm->sym_len))
239 rdm->errored = 1;
243 ident.ascii = rdm->sym + start;
261 rdm->errored = 1;
276 print_str (struct rust_demangler *rdm, const char *data, size_t len)
278 if (!rdm->errored && !rdm->skipping_printing)
279 rdm->callback (data, len, rdm->callback_opaque);
282 #define PRINT(s) print_str (rdm, s, strlen (s))
285 print_uint64 (struct rust_demangler *rdm, uint64_t x)
293 print_uint64_hex (struct rust_demangler *rdm, uint64_t x)
377 print_ident (struct rust_demangler *rdm, struct rust_mangled_ident ident)
387 if (rdm->errored || rdm->skipping_printing)
390 if (rdm->version == -1)
410 print_str (rdm, &unescaped, 1);
414 print_str (rdm, ident.ascii, ident.ascii_len);
439 print_str (rdm, ident.ascii, len);
451 print_str (rdm, ident.ascii, ident.ascii_len);
463 rdm->errored = 1;
472 rdm->errored = 1;
522 rdm->errored = 1;
544 rdm->errored = 1;
551 rdm->errored = 1;
591 print_str (rdm, (const char *)out, j);
601 print_lifetime_from_index (struct rust_demangler *rdm, uint64_t lt)
613 depth = rdm->bound_lifetime_depth - lt;
618 print_str (rdm, &c, 1);
624 print_uint64 (rdm, depth);
630 static void demangle_binder (struct rust_demangler *rdm);
631 static void demangle_path (struct rust_demangler *rdm, int in_value);
632 static void demangle_generic_arg (struct rust_demangler *rdm);
633 static void demangle_type (struct rust_demangler *rdm);
634 static int demangle_path_maybe_open_generics (struct rust_demangler *rdm);
635 static void demangle_dyn_trait (struct rust_demangler *rdm);
636 static void demangle_const (struct rust_demangler *rdm);
637 static void demangle_const_uint (struct rust_demangler *rdm);
638 static void demangle_const_int (struct rust_demangler *rdm);
639 static void demangle_const_bool (struct rust_demangler *rdm);
640 static void demangle_const_char (struct rust_demangler *rdm);
646 demangle_binder (struct rust_demangler *rdm)
650 if (rdm->errored)
653 bound_lifetimes = parse_opt_integer_62 (rdm, 'G');
661 rdm->bound_lifetime_depth++;
662 print_lifetime_from_index (rdm, 1);
669 demangle_path (struct rust_demangler *rdm, int in_value)
677 if (rdm->errored)
680 if (rdm->recursion != RUST_NO_RECURSION_LIMIT)
682 ++ rdm->recursion;
683 if (rdm->recursion > RUST_MAX_RECURSION_COUNT)
689 switch (tag = next (rdm))
692 dis = parse_disambiguator (rdm);
693 name = parse_ident (rdm);
695 print_ident (rdm, name);
696 if (rdm->verbose)
699 print_uint64_hex (rdm, dis);
704 ns = next (rdm);
708 demangle_path (rdm, in_value);
710 dis = parse_disambiguator (rdm);
711 name = parse_ident (rdm);
726 print_str (rdm, &ns, 1);
731 print_ident (rdm, name);
734 print_uint64 (rdm, dis);
744 print_ident (rdm, name);
751 parse_disambiguator (rdm);
752 was_skipping_printing = rdm->skipping_printing;
753 rdm->skipping_printing = 1;
754 demangle_path (rdm, in_value);
755 rdm->skipping_printing = was_skipping_printing;
759 demangle_type (rdm);
763 demangle_path (rdm, 0);
768 demangle_path (rdm, in_value);
772 for (i = 0; !rdm->errored && !eat (rdm, 'E'); i++)
776 demangle_generic_arg (rdm);
781 backref = parse_integer_62 (rdm);
782 if (!rdm->skipping_printing)
784 old_next = rdm->next;
785 rdm->next = backref;
786 demangle_path (rdm, in_value);
787 rdm->next = old_next;
796 rdm->errored = 1;
798 if (rdm->recursion != RUST_NO_RECURSION_LIMIT)
799 -- rdm->recursion;
803 demangle_generic_arg (struct rust_demangler *rdm)
806 if (eat (rdm, 'L'))
808 lt = parse_integer_62 (rdm);
809 print_lifetime_from_index (rdm, lt);
811 else if (eat (rdm, 'K'))
812 demangle_const (rdm);
814 demangle_type (rdm);
871 demangle_type (struct rust_demangler *rdm)
879 if (rdm->errored)
882 tag = next (rdm);
891 if (rdm->recursion != RUST_NO_RECURSION_LIMIT)
893 ++ rdm->recursion;
894 if (rdm->recursion > RUST_MAX_RECURSION_COUNT)
898 rdm->errored = 1;
899 -- rdm->recursion;
909 if (eat (rdm, 'L'))
911 lt = parse_integer_62 (rdm);
914 print_lifetime_from_index (rdm, lt);
920 demangle_type (rdm);
929 demangle_type (rdm);
934 demangle_type (rdm);
938 demangle_const (rdm);
944 for (i = 0; !rdm->errored && !eat (rdm, 'E'); i++)
948 demangle_type (rdm);
955 old_bound_lifetime_depth = rdm->bound_lifetime_depth;
956 demangle_binder (rdm);
958 if (eat (rdm, 'U'))
961 if (eat (rdm, 'K'))
963 if (eat (rdm, 'C'))
970 abi = parse_ident (rdm);
973 rdm->errored = 1;
986 print_str (rdm, abi.ascii, i);
993 print_str (rdm, abi.ascii, abi.ascii_len);
999 for (i = 0; !rdm->errored && !eat (rdm, 'E'); i++)
1003 demangle_type (rdm);
1007 if (eat (rdm, 'u'))
1014 demangle_type (rdm);
1019 rdm->bound_lifetime_depth = old_bound_lifetime_depth;
1024 old_bound_lifetime_depth = rdm->bound_lifetime_depth;
1025 demangle_binder (rdm);
1027 for (i = 0; !rdm->errored && !eat (rdm, 'E'); i++)
1031 demangle_dyn_trait (rdm);
1035 rdm->bound_lifetime_depth = old_bound_lifetime_depth;
1037 if (!eat (rdm, 'L'))
1039 rdm->errored = 1;
1042 lt = parse_integer_62 (rdm);
1046 print_lifetime_from_index (rdm, lt);
1050 backref = parse_integer_62 (rdm);
1051 if (!rdm->skipping_printing)
1053 old_next = rdm->next;
1054 rdm->next = backref;
1055 demangle_type (rdm);
1056 rdm->next = old_next;
1061 rdm->next--;
1062 demangle_path (rdm, 0);
1065 if (rdm->recursion != RUST_NO_RECURSION_LIMIT)
1066 -- rdm->recursion;
1075 demangle_path_maybe_open_generics (struct rust_demangler *rdm)
1082 if (rdm->errored)
1085 if (eat (rdm, 'B'))
1087 backref = parse_integer_62 (rdm);
1088 if (!rdm->skipping_printing)
1090 old_next = rdm->next;
1091 rdm->next = backref;
1092 open = demangle_path_maybe_open_generics (rdm);
1093 rdm->next = old_next;
1096 else if (eat (rdm, 'I'))
1098 demangle_path (rdm, 0);
1101 for (i = 0; !rdm->errored && !eat (rdm, 'E'); i++)
1105 demangle_generic_arg (rdm);
1109 demangle_path (rdm, 0);
1114 demangle_dyn_trait (struct rust_demangler *rdm)
1119 if (rdm->errored)
1122 open = demangle_path_maybe_open_generics (rdm);
1124 while (eat (rdm, 'p'))
1132 name = parse_ident (rdm);
1133 print_ident (rdm, name);
1135 demangle_type (rdm);
1143 demangle_const (struct rust_demangler *rdm)
1148 if (rdm->errored)
1151 if (eat (rdm, 'B'))
1153 backref = parse_integer_62 (rdm);
1154 if (!rdm->skipping_printing)
1156 old_next = rdm->next;
1157 rdm->next = backref;
1158 demangle_const (rdm);
1159 rdm->next = old_next;
1164 ty_tag = next (rdm);
1179 demangle_const_uint (rdm);
1189 demangle_const_int (rdm);
1194 demangle_const_bool (rdm);
1199 demangle_const_char (rdm);
1203 rdm->errored = 1;
1207 if (rdm->errored)
1210 if (rdm->verbose)
1218 demangle_const_uint (struct rust_demangler *rdm)
1223 if (rdm->errored)
1226 hex_len = parse_hex_nibbles (rdm, &value);
1232 print_str (rdm, rdm->sym + (rdm->next - hex_len), hex_len);
1235 print_uint64 (rdm, value);
1237 rdm->errored = 1;
1241 demangle_const_int (struct rust_demangler *rdm)
1243 if (eat (rdm, 'n'))
1245 demangle_const_uint (rdm);
1249 demangle_const_bool (struct rust_demangler *rdm)
1253 if (parse_hex_nibbles (rdm, &value) != 1)
1255 rdm->errored = 1;
1264 rdm->errored = 1;
1268 demangle_const_char (struct rust_demangler *rdm)
1273 hex_len = parse_hex_nibbles (rdm, &value);
1277 rdm->errored = 1;
1294 print_str (rdm, &c, 1);
1299 print_uint64_hex (rdm, value);
1343 struct rust_demangler rdm;
1346 rdm.sym = mangled;
1347 rdm.sym_len = 0;
1349 rdm.callback_opaque = opaque;
1350 rdm.callback = callback;
1352 rdm.next = 0;
1353 rdm.errored = 0;
1354 rdm.skipping_printing = 0;
1355 rdm.verbose = (options & DMGL_VERBOSE) != 0;
1356 rdm.version = 0;
1357 rdm.recursion = (options & DMGL_NO_RECURSE_LIMIT) ? RUST_NO_RECURSION_LIMIT : 0;
1358 rdm.bound_lifetime_depth = 0;
1361 if (rdm.sym[0] == '_' && rdm.sym[1] == 'R')
1362 rdm.sym += 2;
1363 else if (rdm.sym[0] == '_' && rdm.sym[1] == 'Z' && rdm.sym[2] == 'N')
1365 rdm.sym += 3;
1366 rdm.version = -1;
1372 if (rdm.version != -1 && !ISUPPER (rdm.sym[0]))
1376 for (p = rdm.sym; *p; p++)
1379 if (rdm.version == 0 && *p == '.')
1382 rdm.sym_len++;
1389 if (rdm.version == -1 && (*p == '$' || *p == '.' || *p == ':'
1397 if (rdm.version == -1)
1402 while (rdm.sym_len > 0 &&
1403 !(dot_suffix && rdm.sym[rdm.sym_len - 1] == 'E'))
1405 dot_suffix = rdm.sym[rdm.sym_len - 1] == '.';
1406 rdm.sym_len--;
1409 if (!(rdm.sym_len > 0 && rdm.sym[rdm.sym_len - 1] == 'E'))
1411 rdm.sym_len--;
1417 if (!(rdm.sym_len > 19
1418 && !memcmp (&rdm.sym[rdm.sym_len - 19], "17h", 3)))
1423 ident = parse_ident (&rdm);
1424 if (rdm.errored || !ident.ascii)
1427 while (rdm.next < rdm.sym_len);
1434 rdm.next = 0;
1435 if (!rdm.verbose && rdm.sym_len > 19)
1438 rdm.sym_len -= 19;
1443 if (rdm.next > 0)
1444 print_str (&rdm, "::", 2);
1446 ident = parse_ident (&rdm);
1447 print_ident (&rdm, ident);
1449 while (rdm.next < rdm.sym_len);
1453 demangle_path (&rdm, 1);
1456 if (!rdm.errored && rdm.next < rdm.sym_len)
1458 rdm.skipping_printing = 1;
1459 demangle_path (&rdm, 0);
1463 rdm.errored |= rdm.next != rdm.sym_len;
1466 return !rdm.errored;