/* Declarations for missing functions.
   Copyright (C) 2019-2020 Free Software Foundation, Inc.

   This file is part of libctf.

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

   This program 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 General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; see the file COPYING.  If not see
   <http://www.gnu.org/licenses/>.  */

#ifndef _CTF_DECLS_H
#define _CTF_DECLS_H

#include "config.h"

#include <stddef.h>
#include <stdlib.h>
#include "libiberty.h"

#if HAVE_QSORT_R_ARG_LAST
static inline void
ctf_qsort_r (void *base, size_t nmemb, size_t size,
	     int (*compar)(const void *, const void *, void *),
	     void *arg)
{
  qsort_r (base, nmemb, size, compar, arg);
}
#elif HAVE_QSORT_R_COMPAR_LAST
struct ctf_qsort_arg
{
  int (*compar) (const void *, const void *, void *);
  void *arg;
};

static int
ctf_qsort_compar_thunk (void *arg, const void *a, const void *b)
{
  struct ctf_qsort_arg *qsort_arg = (struct ctf_qsort_arg *) arg;

  return qsort_arg->compar (a, b, arg);
}

static inline void
ctf_qsort_r (void *base, size_t nmemb, size_t size,
	     int (*compar)(const void *, const void *, void *),
	     void *arg)
{
  struct ctf_qsort_arg thunk = { compar, arg };
  qsort_r (base, nmemb, size, &thunk, ctf_qsort_compar_thunk);
}
#else
void ctf_qsort_r (void *base, size_t nmemb, size_t size,
	      int (*compar)(const void *, const void *, void *),
	      void *arg);
#endif

#ifndef HAVE_O_CLOEXEC
# define O_CLOEXEC 0
#endif

#undef MAX
#undef MIN
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define MIN(a, b) ((a) < (b) ? (a) : (b))

#endif /* _CTF_DECLS_H */
