/* Test program for mtrace.
   Copyright (C) 2000-2018 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

#include <mcheck.h>
#include <paths.h>
#include <search.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


static void print (const void *node, VISIT value, int level);

/* Used for several purposes.  */
static FILE *fp;


static int
do_test (void)
{
  void *root = NULL;
  size_t linelen = 0;
  char *line = NULL;

  /* Enable memory usage tracing.  */
  mtrace ();

  /* Perform some operations which definitely will allocate some
     memory.  */
  fp = fopen (__FILE__, "r");
  if (fp == NULL)
    /* Shouldn't happen since this program is executed in the source
       directory.  */
    abort ();

  while (!feof (fp))
    {
      char **p;
      char *copy;
      ssize_t n = getline (&line, &linelen, fp);

      if (n < 0)
        break;

      if (n == 0)
        continue;

      copy = strdup (line);
      if (copy == NULL)
        abort ();

      p = (char **) tsearch (copy, &root,
                             (int (*)(const void *, const void *))strcmp);
      if (*p != copy)
        /* This line wasn't added.  */
        free (copy);
    }

  fclose (fp);

  fp = fopen (_PATH_DEVNULL, "w");
  if (fp != NULL)
    {
      /* Write something through stdout.  */
      twalk (root, print);

      fclose (fp);
    }

  /* Free everything.  */
  tdestroy (root, free);

  /* Also the line buffer.  */
  free (line);

  /* That's it.  */
  return 0;
}


static void
print (const void *node, VISIT value, int level)
{
  static int cnt;
  if (value == postorder || value == leaf)
    fprintf (fp, "%3d: %s", ++cnt, *(const char **) node);
}

#define TEST_FUNCTION do_test ()
#include "../test-skeleton.c"
