(root)/
binutils-2.41/
libctf/
testsuite/
libctf-lookup/
struct-iteration.c
       1  #include <ctf-api.h>
       2  #include <stdio.h>
       3  #include <stdlib.h>
       4  
       5  static int
       6  print_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  
      19  int
      20  main (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  }