194 * demangled section of the result.
195 */
196 static int
197 mdb_dem_process(mdb_demangler_t *dmp, const char *name)
198 {
199 char *res = NULL;
200 size_t reslen = 0;
201
202 char *prefix = strrchr(name, '`');
203 size_t prefixlen = 0;
204
205 if (prefix) {
206 prefix++; /* the ` is part of the prefix */
207 prefixlen = prefix - name;
208 }
209
210 res = sysdemangle(name + prefixlen, dmp->dm_lang, &mdb_dem_demops);
211 if (res == NULL && errno != EINVAL)
212 mdb_warn("Error while demangling");
213
214 mdb_free(dmp->dm_buf, dmp->dm_len);
215 dmp->dm_dem = NULL;
216 dmp->dm_len = 0;
217
218 reslen = (res != NULL) ? strlen(res) : 0;
219 reslen += prefixlen;
220 reslen += 1;
221
222 dmp->dm_buf = mdb_zalloc(reslen, UM_SLEEP);
223 if (dmp->dm_buf == NULL) {
224 mdb_warn("Unable to allocate memory for demangling");
225 return (-1);
226 }
227
228 dmp->dm_len = reslen;
229
230 if (prefixlen > 0)
231 (void) strlcpy(dmp->dm_buf, name, prefixlen);
232 if (res != NULL)
233 (void) strlcat(dmp->dm_buf, res, dmp->dm_len);
234
235 /*
236 * Save the position of the demangled string for mdb_dem_filter()
237 */
238 dmp->dm_dem = dmp->dm_buf + prefixlen;
239
240 return (0);
241 }
242
243 /* used by mdb_io.c:iob_addr2str */
244 const char *
245 mdb_dem_convert(mdb_demangler_t *dmp, const char *name)
246 {
247 if (mdb_dem_process(dmp, name) != 0 ||
248 strcmp(dmp->dm_buf, name) == 0)
|
194 * demangled section of the result.
195 */
196 static int
197 mdb_dem_process(mdb_demangler_t *dmp, const char *name)
198 {
199 char *res = NULL;
200 size_t reslen = 0;
201
202 char *prefix = strrchr(name, '`');
203 size_t prefixlen = 0;
204
205 if (prefix) {
206 prefix++; /* the ` is part of the prefix */
207 prefixlen = prefix - name;
208 }
209
210 res = sysdemangle(name + prefixlen, dmp->dm_lang, &mdb_dem_demops);
211 if (res == NULL && errno != EINVAL)
212 mdb_warn("Error while demangling");
213
214 reslen = (res != NULL) ? strlen(res) : 0;
215 reslen += prefixlen;
216 reslen += 1;
217
218 if (reslen > dmp->dm_len) {
219 mdb_free(dmp->dm_buf, dmp->dm_len);
220
221 dmp->dm_buf = mdb_zalloc(reslen, UM_SLEEP);
222 if (dmp->dm_buf == NULL) {
223 dmp->dm_len = 0;
224 mdb_warn("Unable to allocate memory for demangling");
225 return (-1);
226 }
227 dmp->dm_len = reslen;
228 }
229
230 if (prefixlen > 0)
231 (void) strlcpy(dmp->dm_buf, name, prefixlen);
232 if (res != NULL)
233 (void) strlcat(dmp->dm_buf, res, dmp->dm_len);
234
235 /*
236 * Save the position of the demangled string for mdb_dem_filter()
237 */
238 dmp->dm_dem = dmp->dm_buf + prefixlen;
239
240 return (0);
241 }
242
243 /* used by mdb_io.c:iob_addr2str */
244 const char *
245 mdb_dem_convert(mdb_demangler_t *dmp, const char *name)
246 {
247 if (mdb_dem_process(dmp, name) != 0 ||
248 strcmp(dmp->dm_buf, name) == 0)
|