1  /* Make sure serializing a dict (possibly repeatedly) does not corrupt either
       2     type lookup or the string content of the dict.  */
       3  
       4  #include <ctf-api.h>
       5  #include <stdio.h>
       6  #include <stdlib.h>
       7  
       8  int
       9  main (int argc, char *argv[])
      10  {
      11    ctf_dict_t *fp;
      12    ctf_id_t zygal, autoschediastic;
      13    ctf_snapshot_id_t snap;
      14    unsigned char *foo;
      15    size_t foo_size;
      16    int err;
      17    char name[64];
      18  
      19    /* Adding things after serialization should not corrupt names created before
      20       serialization.  */
      21  
      22    if ((fp = ctf_create (&err)) == NULL)
      23      goto create_err;
      24  
      25    if ((zygal = ctf_add_struct (fp, CTF_ADD_ROOT, "zygal")) == CTF_ERR)
      26      goto add_err;
      27  
      28    if ((foo = ctf_write_mem (fp, &foo_size, 4096)) == NULL)
      29      goto write_err;
      30    free (foo);
      31  
      32    if (ctf_type_name (fp, zygal, name, sizeof (name)) == NULL)
      33      fprintf (stderr, "Can't get name of zygal: %s\n", ctf_errmsg (ctf_errno (fp)));
      34    else
      35      printf ("zygal's name is %s\n", name);
      36  
      37    if ((autoschediastic = ctf_add_enum (fp, CTF_ADD_ROOT, "autoschediastic")) == CTF_ERR)
      38      goto add_err;
      39  
      40    if (ctf_type_name (fp, zygal, name, sizeof (name)) == NULL)
      41      fprintf (stderr, "Can't get name of zygal: %s\n", ctf_errmsg (ctf_errno (fp)));
      42    else
      43      printf ("zygal's name is %s\n", name);
      44  
      45    /* Serializing again should not corrupt names either.  */
      46    if ((foo = ctf_write_mem (fp, &foo_size, 4096)) == NULL)
      47      goto write_err;
      48    free (foo);
      49  
      50    if (ctf_type_name (fp, zygal, name, sizeof (name)) == NULL)
      51      fprintf (stderr, "Can't get name of zygal: %s\n", ctf_errmsg (ctf_errno (fp)));
      52    else
      53      printf ("zygal's name is %s\n", name);
      54  
      55    /* Add another new name, roll back, and make sure the strings are
      56       uncorrupted.  */
      57  
      58    snap = ctf_snapshot (fp);
      59    if (ctf_add_enumerator (fp, autoschediastic, "aichmophobia", 0) < 0)
      60      goto add_err;
      61  
      62    if (ctf_rollback (fp, snap) < 0)
      63      goto roll_err;
      64  
      65    if (ctf_type_name (fp, zygal, name, sizeof (name)) == NULL)
      66      fprintf (stderr, "Can't get name of zygal: %s\n", ctf_errmsg (ctf_errno (fp)));
      67    else
      68      printf ("zygal's name is %s after first rollback\n", name);
      69  
      70    if (ctf_type_name (fp, autoschediastic, name, sizeof (name)) == NULL)
      71      fprintf (stderr, "Can't get name of autoschediastic: %s\n", ctf_errmsg (ctf_errno (fp)));
      72    else
      73      printf ("autoschediastic's name is %s after first rollback\n", name);
      74  
      75    ctf_dict_close (fp);
      76    return 0;
      77  
      78   create_err:
      79    fprintf (stderr, "Cannot create: %s\n", ctf_errmsg (err));
      80    return 1;
      81   add_err:
      82    fprintf (stderr, "Cannot add: %s\n", ctf_errmsg (ctf_errno (fp)));
      83    return 1;
      84   write_err:
      85    fprintf (stderr, "Cannot serialize: %s\n", ctf_errmsg (ctf_errno (fp)));
      86    return 1;
      87   roll_err:
      88    fprintf (stderr, "Cannot roll back: %s\n", ctf_errmsg (ctf_errno (fp)));
      89    return 1;
      90  }