libctf: add ctf_type_name_raw

We already have a function ctf_type_aname_raw, which returns the raw
name of a type with no decoration for structures or arrays or anything
like that: just the underlying name of whatever it is that's being
ultimately pointed at.

But this can be inconvenient to use, becauswe it always allocates new
storage for the string and copies it in, so it can potentially fail.
Add ctf_type_name_raw, which just returns the string directly out of
libctf's guts: it will live until the ctf_file_t is closed (if we later
gain the ability to remove types from writable dicts, it will live as
long as the type lives).

Reimplement ctf_type_aname_raw in terms of it.

include/
	* ctf-api.c (ctf_type_name_raw): New.

libctf/
	* ctf-types.c (ctf_type_name_raw): New.
	(ctf_type_aname_raw): Reimplement accordingly.
This commit is contained in:
Nick Alcock 2020-06-02 21:06:18 +01:00
parent 5ec7465fec
commit 01d9317436
5 changed files with 28 additions and 6 deletions

View file

@ -472,19 +472,30 @@ ctf_type_name (ctf_file_t *fp, ctf_id_t type, char *buf, size_t len)
return (rv >= 0 && (size_t) rv < len ? buf : NULL);
}
/* Lookup the given type ID and return its raw, unadorned, undecorated name as a
new dynamcally-allocated string. */
/* Lookup the given type ID and return its raw, unadorned, undecorated name.
The name will live as long as its ctf_file_t does. */
char *
ctf_type_aname_raw (ctf_file_t *fp, ctf_id_t type)
const char *
ctf_type_name_raw (ctf_file_t *fp, ctf_id_t type)
{
const ctf_type_t *tp;
if ((tp = ctf_lookup_by_id (&fp, type)) == NULL)
return NULL; /* errno is set for us. */
if (ctf_strraw (fp, tp->ctt_name) != NULL)
return strdup (ctf_strraw (fp, tp->ctt_name));
return ctf_strraw (fp, tp->ctt_name);
}
/* Lookup the given type ID and return its raw, unadorned, undecorated name as a
new dynamically-allocated string. */
char *
ctf_type_aname_raw (ctf_file_t *fp, ctf_id_t type)
{
const char *name = ctf_type_name_raw (fp, type);
if (name != NULL)
return strdup (name);
return NULL;
}