// -*- C++ -*-
//===------------------- support/ibm/locale_mgmt_aix.h --------------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef _LIBCPP_SUPPORT_IBM_LOCALE_MGMT_AIX_H
#define _LIBCPP_SUPPORT_IBM_LOCALE_MGMT_AIX_H

#if defined(_AIX)
#include "cstdlib"

#ifdef __cplusplus
extern "C" {
#endif

#if !defined(_AIX71)
// AIX 7.1 and higher has these definitions.  Definitions and stubs
// are provied here as a temporary workaround on AIX 6.1.

#define LC_COLLATE_MASK         1
#define LC_CTYPE_MASK           2
#define LC_MESSAGES_MASK        4
#define LC_MONETARY_MASK        8
#define LC_NUMERIC_MASK         16
#define LC_TIME_MASK            32
#define LC_ALL_MASK             (LC_COLLATE_MASK | LC_CTYPE_MASK | \
                                 LC_MESSAGES_MASK | LC_MONETARY_MASK |\
                                 LC_NUMERIC_MASK | LC_TIME_MASK)

typedef void* locale_t;

// The following are stubs.  They are not supported on AIX 6.1.
static inline
locale_t newlocale(int category_mask, const char *locale, locale_t base)
{
  _LC_locale_t *newloc, *loc;
  if ((loc = (_LC_locale_t *)__xopen_locale(locale)) == NULL)
  {
    errno = EINVAL;
    return (locale_t)0;
  }
  if ((newloc = (_LC_locale_t *)calloc(1, sizeof(_LC_locale_t))) == NULL)
  {
    errno = ENOMEM;
    return (locale_t)0;
  }
  if (!base)
    base = (_LC_locale_t *)__xopen_locale("C");
  memcpy(newloc, base, sizeof (_LC_locale_t));
  if (category_mask & LC_COLLATE_MASK)
    newloc->lc_collate = loc->lc_collate;
  if (category_mask & LC_CTYPE_MASK)
    newloc->lc_ctype = loc->lc_ctype;
  //if (category_mask & LC_MESSAGES_MASK)
  //  newloc->lc_messages = loc->lc_messages;
  if (category_mask & LC_MONETARY_MASK)
    newloc->lc_monetary = loc->lc_monetary;
  if (category_mask & LC_TIME_MASK)
    newloc->lc_time = loc->lc_time;
  if (category_mask & LC_NUMERIC_MASK)
    newloc->lc_numeric = loc->lc_numeric;
  return (locale_t)newloc;
}
static inline
void freelocale(locale_t locobj)
{
  free(locobj);
}
static inline
locale_t uselocale(locale_t newloc)
{
  return (locale_t)0;
}
#endif // !defined(_AIX71)

#ifdef __cplusplus
}
#endif
#endif // defined(_AIX)
#endif // _LIBCPP_SUPPORT_IBM_LOCALE_MGMT_AIX_H
