1  /* Make sure we can look up a pointer-to-type where the type is more than a page
       2     into the parent and the child has never had a lookup before.  */
       3  
       4  #include <ctf-api.h>
       5  #include <stdio.h>
       6  #include <stdlib.h>
       7  #include <string.h>
       8  
       9  int
      10  main (void)
      11  {
      12    ctf_dict_t *pfp, *cfp;
      13    ctf_encoding_t e = { CTF_INT_SIGNED, 0, sizeof (long) };
      14    ctf_id_t ptype, ptrtype, type, foo;
      15    size_t i;
      16    int err;
      17  
      18    if ((pfp = ctf_create (&err)) == NULL)
      19      goto create_err;
      20  
      21    if ((ptype = ctf_add_integer (pfp, CTF_ADD_NONROOT, "blah", &e)) == CTF_ERR)
      22      goto create_parent;
      23  
      24    for (i = 0; i < 4096; i++)
      25      if ((foo = ctf_add_pointer (pfp, CTF_ADD_NONROOT, ptype)) == CTF_ERR)
      26        goto create_parent;
      27  
      28    if ((cfp = ctf_create (&err)) == NULL)
      29      goto create_err;
      30  
      31    if (ctf_import (cfp, pfp) < 0)
      32      goto create_child;
      33  
      34    if ((ptype = ctf_add_integer (pfp, CTF_ADD_ROOT, "foo", &e)) == CTF_ERR)
      35      goto create_parent;
      36  
      37    if ((ptrtype = ctf_add_pointer (pfp, CTF_ADD_ROOT, ptype)) == CTF_ERR)
      38      goto create_parent;
      39  
      40    if ((type = ctf_lookup_by_name (cfp, "*foo")) != CTF_ERR)
      41      {
      42        fprintf (stderr, "Type lookup unexpectedly succeeded: %s\n", ctf_errmsg (ctf_errno (cfp)));
      43        exit (1);
      44      }
      45  
      46    if ((type = ctf_lookup_by_name (cfp, "foo *")) == CTF_ERR)
      47      {
      48        fprintf (stderr, "Type lookup error: %s\n", ctf_errmsg (ctf_errno (cfp)));
      49        exit (1);
      50      }
      51  
      52    ctf_dict_close (cfp);
      53    ctf_dict_close (pfp);
      54  
      55    printf ("Type lookup succeeded.\n");
      56  
      57    return 0;
      58  
      59   create_err:
      60    fprintf (stderr, "Creation failed: %s\n", ctf_errmsg (err));
      61    exit (1);
      62   create_parent:
      63    fprintf (stderr, "Cannot create parent type: %s\n", ctf_errmsg (ctf_errno (pfp)));
      64    exit (1);
      65   create_child:
      66    fprintf (stderr, "Cannot create child type: %s\n", ctf_errmsg (ctf_errno (cfp)));
      67    exit (1);
      68  }