libctf: add ctf_type_name_raw
authorNick Alcock <nick.alcock@oracle.com>
Tue, 2 Jun 2020 20:06:18 +0000 (21:06 +0100)
committerNick Alcock <nick.alcock@oracle.com>
Wed, 22 Jul 2020 16:57:36 +0000 (17:57 +0100)
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.

include/ChangeLog
include/ctf-api.h
libctf/ChangeLog
libctf/ctf-types.c
libctf/libctf.ver

index f5be0c0154e65afe2b8180dd5bf7b020228f7722..2acc42a0149dd2f7cb1abaf78b674ab9e80004c0 100644 (file)
@@ -1,3 +1,7 @@
+2020-07-22  Nick Alcock  <nick.alcock@oracle.com>
+
+       * ctf-api.c (ctf_type_name_raw): New.
+
 2020-07-22  Nick Alcock  <nick.alcock@oracle.com>
 
        * ctf-api.h (ECTF_*): Improve comments.
index 2e3e28b840c09c4efbda35950c97ccb19c14f934..363b5c258ca654c83f592673c50f0bc74e07a041 100644 (file)
@@ -324,6 +324,7 @@ extern char *ctf_type_aname (ctf_file_t *, ctf_id_t);
 extern char *ctf_type_aname_raw (ctf_file_t *, ctf_id_t);
 extern ssize_t ctf_type_lname (ctf_file_t *, ctf_id_t, char *, size_t);
 extern char *ctf_type_name (ctf_file_t *, ctf_id_t, char *, size_t);
+extern const char *ctf_type_name_raw (ctf_file_t *, ctf_id_t);
 extern ssize_t ctf_type_size (ctf_file_t *, ctf_id_t);
 extern ssize_t ctf_type_align (ctf_file_t *, ctf_id_t);
 extern int ctf_type_kind (ctf_file_t *, ctf_id_t);
index 48798043efdf063ebd8aed50961fd9057821761a..1754baf83db289d7ed384f8277bf1e9ea8fe2843 100644 (file)
@@ -1,3 +1,8 @@
+2020-07-22  Nick Alcock  <nick.alcock@oracle.com>
+
+       * ctf-types.c (ctf_type_name_raw): New.
+       (ctf_type_aname_raw): Reimplement accordingly.
+
 2020-07-22  Nick Alcock  <nick.alcock@oracle.com>
 
        * ctf-subr.c (ctf_dprintf): _libctf_debug is unlikely to be set.
index db42b9e8a90d62feb745e461b2197a47e45db62b..ce3890c33a68f7e7be10ad1a462072911dafbc22 100644 (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;
 }
index aad304bc0d9caf9f84e80b848bd09fa3cf9b7be1..30a0b087bd657b13e5512f9b8c216a40835271b3 100644 (file)
@@ -57,6 +57,7 @@ LIBCTF_1.0 {
        ctf_type_resolve;
        ctf_type_lname;
        ctf_type_name;
+       ctf_type_name_raw;
        ctf_type_aname;
        ctf_type_aname_raw;
        ctf_type_size;