1#include <ctf-api.h> 2#include <stdio.h> 3#include <stdlib.h> 4 5static int 6print_struct (const char *name, ctf_id_t membtype, unsigned long offset, 7 void *fp_) 8{ 9 ctf_dict_t *fp = (ctf_dict_t *) fp_; 10 char *type_name = ctf_type_aname (fp, membtype); 11 12 printf ("iter test: %s, offset %lx, has type %lx/%s\n", 13 name, offset, membtype, type_name); 14 free (type_name); 15 16 return 0; 17} 18 19int 20main (int argc, char *argv[]) 21{ 22 ctf_dict_t *fp; 23 ctf_archive_t *ctf; 24 ctf_id_t type; 25 ctf_next_t *i = NULL; 26 const char *name; 27 ctf_id_t membtype; 28 ssize_t offset; 29 int icount = 0; 30 int err; 31 32 if (argc != 2) 33 { 34 fprintf (stderr, "Syntax: %s PROGRAM\n", argv[0]); 35 exit(1); 36 } 37 38 if ((ctf = ctf_open (argv[1], NULL, &err)) == NULL) 39 goto open_err; 40 if ((fp = ctf_dict_open (ctf, NULL, &err)) == NULL) 41 goto open_err; 42 43 /* Iterate over the structure members with each iterator type in turn. */ 44 45 if ((type = ctf_lookup_by_name (fp, "struct foo_t") ) == CTF_ERR) 46 goto err; 47 48 if (ctf_member_iter (fp, type, print_struct, fp) < 0) 49 goto ierr; 50 51 while ((offset = ctf_member_next (fp, type, &i, &name, &membtype, 52 CTF_MN_RECURSE)) >= 0) 53 { 54 char *type_name = ctf_type_aname (fp, membtype); 55 56 printf ("next test: %s, offset %lx, has type %lx/%s\n", 57 name, offset, membtype, type_name); 58 free (type_name); 59 } 60 if (ctf_errno (fp) != ECTF_NEXT_END) 61 goto nerr; 62 63 /* Now make sure the count of members does not include any recursive 64 members. */ 65 while ((offset = ctf_member_next (fp, type, &i, &name, &membtype, 0)) >= 0) 66 icount++; 67 68 if (ctf_errno (fp) != ECTF_NEXT_END) 69 goto nerr; 70 71 if (icount != ctf_member_count (fp, type)) 72 printf ("member counts differ: %i by direct iteration, " 73 "%i by ctf_member_count\n", icount, ctf_member_count (fp, type)); 74 75 ctf_dict_close (fp); 76 ctf_close (ctf); 77 78 return 0; 79 80 open_err: 81 fprintf (stderr, "%s: cannot open: %s\n", argv[0], ctf_errmsg (err)); 82 return 1; 83 err: 84 fprintf (stderr, "Lookup failed: %s\n", ctf_errmsg (ctf_errno (fp))); 85 return 1; 86 ierr: 87 fprintf (stderr, "_iter iteration failed: %s\n", ctf_errmsg (ctf_errno (fp))); 88 return 1; 89 nerr: 90 fprintf (stderr, "_next iteration failed: %s\n", ctf_errmsg (ctf_errno (fp))); 91 return 1; 92} 93