/* Table for builtin transformation mapping.
   Copyright (C) 1997-2014 Free Software Foundation, Inc.
   This file is part of the GNU C Library.
   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.

   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 <endian.h>
#include <limits.h>
#include <stdint.h>
#include <string.h>

#include <gconv_int.h>

#include <assert.h>


static const struct builtin_map
{
  const char *name;
  __gconv_fct fct;
  __gconv_btowc_fct btowc_fct;

  int8_t min_needed_from;
  int8_t max_needed_from;
  int8_t min_needed_to;
  int8_t max_needed_to;

} map[] =
{
#define BUILTIN_TRANSFORMATION(From, To, Cost, Name, Fct, BtowcFct, \
			       MinF, MaxF, MinT, MaxT) \
  {									      \
    .name = Name,							      \
    .fct = Fct,								      \
    .btowc_fct = BtowcFct,						      \
									      \
    .min_needed_from = MinF,						      \
    .max_needed_from = MaxF,						      \
    .min_needed_to = MinT,						      \
    .max_needed_to = MaxT						      \
  },
#define BUILTIN_ALIAS(From, To)

#include <gconv_builtin.h>
};


void
internal_function
__gconv_get_builtin_trans (const char *name, struct __gconv_step *step)
{
  size_t cnt;

  for (cnt = 0; cnt < sizeof (map) / sizeof (map[0]); ++cnt)
    if (strcmp (name, map[cnt].name) == 0)
      break;

  assert (cnt < sizeof (map) / sizeof (map[0]));

  step->__fct = map[cnt].fct;
  step->__btowc_fct = map[cnt].btowc_fct;
  step->__init_fct = NULL;
  step->__end_fct = NULL;
  step->__shlib_handle = NULL;
  step->__modname = NULL;

  step->__min_needed_from = map[cnt].min_needed_from;
  step->__max_needed_from = map[cnt].max_needed_from;
  step->__min_needed_to = map[cnt].min_needed_to;
  step->__max_needed_to = map[cnt].max_needed_to;

  /* None of the builtin converters handles stateful encoding.  */
  step->__stateful = 0;
}
