1/* Copyright (C) 1991, 1996, 1997, 2002 Free Software Foundation, Inc.
2   This file is part of the GNU C Library.
3
4   The GNU C Library is free software; you can redistribute it and/or
5   modify it under the terms of the GNU Lesser General Public
6   License as published by the Free Software Foundation; either
7   version 2.1 of the License, or (at your option) any later version.
8
9   The GNU C Library is distributed in the hope that it will be useful,
10   but WITHOUT ANY WARRANTY; without even the implied warranty of
11   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12   Lesser General Public License for more details.
13
14   You should have received a copy of the GNU Lesser General Public
15   License along with the GNU C Library; if not, write to the Free
16   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17   02111-1307 USA.
18*/
19
20
21#include <stdio_private.h>
22#include <errno.h>
23#include <limits.h>
24#include <printf.h>
25#include <stddef.h>
26#include <stdlib.h>
27
28
29/* Array of functions indexed by format character.  */
30libc_freeres_ptr (printf_arginfo_function **__printf_arginfo_table)
31  attribute_hidden;
32printf_function **__printf_function_table attribute_hidden;
33
34int __register_printf_function __P ((int, printf_function,
35                                     printf_arginfo_function));
36
37/* Register FUNC to be called to format SPEC specifiers.  */
38int
39__register_printf_function (spec, converter, arginfo)
40     int spec;
41     printf_function converter;
42     printf_arginfo_function arginfo;
43{
44  if (spec < 0 || spec > (int) UCHAR_MAX)
45    {
46      __set_errno (EINVAL);
47      return -1;
48    }
49
50  if (__printf_function_table == NULL)
51    {
52      __printf_arginfo_table = (printf_arginfo_function **)
53	malloc ((UCHAR_MAX + 1) * sizeof (void *) * 2);
54      if (__printf_arginfo_table == NULL)
55	return -1;
56      __printf_function_table = (printf_function **)
57	(__printf_arginfo_table + UCHAR_MAX + 1);
58    }
59
60  __printf_function_table[spec] = converter;
61  __printf_arginfo_table[spec] = arginfo;
62
63  return 0;
64}
65weak_alias (__register_printf_function, register_printf_function)
66