diff options
-rw-r--r-- | include/ChangeLog | 4 | ||||
-rw-r--r-- | include/ctf-api.h | 1 | ||||
-rw-r--r-- | libctf/ChangeLog | 5 | ||||
-rw-r--r-- | libctf/ctf-types.c | 24 | ||||
-rw-r--r-- | libctf/libctf.ver | 1 |
5 files changed, 35 insertions, 0 deletions
diff --git a/include/ChangeLog b/include/ChangeLog index 18b0b0b..27ffb90 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,5 +1,9 @@ 2020-07-22 Nick Alcock <nick.alcock@oracle.com> + * ctf-api.h (ctf_member_count): New. + +2020-07-22 Nick Alcock <nick.alcock@oracle.com> + * ctf-api.h (ctf_type_kind_forwarded): New. 2020-07-22 Nick Alcock <nick.alcock@oracle.com> diff --git a/include/ctf-api.h b/include/ctf-api.h index 87446a5..7cdf4a5 100644 --- a/include/ctf-api.h +++ b/include/ctf-api.h @@ -349,6 +349,7 @@ extern const char *ctf_label_get (ctf_file_t *); extern const char *ctf_label_topmost (ctf_file_t *); extern int ctf_label_info (ctf_file_t *, const char *, ctf_lblinfo_t *); +extern int ctf_member_count (ctf_file_t *, ctf_id_t); extern int ctf_member_iter (ctf_file_t *, ctf_id_t, ctf_member_f *, void *); extern int ctf_enum_iter (ctf_file_t *, ctf_id_t, ctf_enum_f *, void *); extern int ctf_type_iter (ctf_file_t *, ctf_type_f *, void *); diff --git a/libctf/ChangeLog b/libctf/ChangeLog index 949e9d0..7df7867 100644 --- a/libctf/ChangeLog +++ b/libctf/ChangeLog @@ -1,5 +1,10 @@ 2020-07-22 Nick Alcock <nick.alcock@oracle.com> + * ctf-types.c (ctf_member_count): New. + * libctf.ver: New public function. + +2020-07-22 Nick Alcock <nick.alcock@oracle.com> + * ctf-types.c (ctf_type_kind_forwarded): New. 2020-07-22 Nick Alcock <nick.alcock@oracle.com> diff --git a/libctf/ctf-types.c b/libctf/ctf-types.c index d8f848c..93967c6 100644 --- a/libctf/ctf-types.c +++ b/libctf/ctf-types.c @@ -963,6 +963,30 @@ ctf_type_compat (ctf_file_t *lfp, ctf_id_t ltype, } } +/* Return the number of members in a STRUCT or UNION, or the number of + enumerators in an ENUM. */ + +int +ctf_member_count (ctf_file_t *fp, ctf_id_t type) +{ + ctf_file_t *ofp = fp; + const ctf_type_t *tp; + uint32_t kind; + + if ((type = ctf_type_resolve (fp, type)) == CTF_ERR) + return -1; /* errno is set for us. */ + + if ((tp = ctf_lookup_by_id (&fp, type)) == NULL) + return -1; /* errno is set for us. */ + + kind = LCTF_INFO_KIND (fp, tp->ctt_info); + + if (kind != CTF_K_STRUCT && kind != CTF_K_UNION && kind != CTF_K_ENUM) + return (ctf_set_errno (ofp, ECTF_NOTSUE)); + + return LCTF_INFO_VLEN (fp, tp->ctt_info); +} + /* Return the type and offset for a given member of a STRUCT or UNION. */ int diff --git a/libctf/libctf.ver b/libctf/libctf.ver index b8c5133..77b380c 100644 --- a/libctf/libctf.ver +++ b/libctf/libctf.ver @@ -73,6 +73,7 @@ LIBCTF_1.0 { ctf_member_info; ctf_array_info; + ctf_member_count; ctf_enum_name; ctf_enum_value; |