Print this page
Address Robert's feedback


 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)