diff options
Diffstat (limited to 'stdio-common/reg-printf.c')
-rw-r--r-- | stdio-common/reg-printf.c | 46 |
1 files changed, 38 insertions, 8 deletions
diff --git a/stdio-common/reg-printf.c b/stdio-common/reg-printf.c index dbb6234e5f..b5cab679de 100644 --- a/stdio-common/reg-printf.c +++ b/stdio-common/reg-printf.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991,1996,1997,2002,2003,2004 Free Software Foundation, Inc. +/* Copyright (C) 1991,1996,1997,2002-2004,2009 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 @@ -21,21 +21,28 @@ #include <printf.h> #include <stddef.h> #include <stdlib.h> +#include <bits/libc-lock.h> + /* Array of functions indexed by format character. */ -libc_freeres_ptr (printf_arginfo_function **__printf_arginfo_table) +libc_freeres_ptr (printf_arginfo_size_function **__printf_arginfo_table) attribute_hidden; printf_function **__printf_function_table attribute_hidden; +__libc_lock_define_initialized (static, lock) + +int __register_printf_specifier (int, printf_function, + printf_arginfo_size_function); int __register_printf_function (int, printf_function, - printf_arginfo_function) __THROW; + printf_arginfo_function); + /* Register FUNC to be called to format SPEC specifiers. */ int -__register_printf_function (spec, converter, arginfo) +__register_printf_specifier (spec, converter, arginfo) int spec; printf_function converter; - printf_arginfo_function arginfo; + printf_arginfo_size_function arginfo; { if (spec < 0 || spec > (int) UCHAR_MAX) { @@ -43,12 +50,19 @@ __register_printf_function (spec, converter, arginfo) return -1; } + int result = 0; + __libc_lock_lock (lock); + if (__printf_function_table == NULL) { - __printf_arginfo_table = (printf_arginfo_function **) + __printf_arginfo_table = (printf_arginfo_size_function **) calloc (UCHAR_MAX + 1, sizeof (void *) * 2); if (__printf_arginfo_table == NULL) - return -1; + { + result = -1; + goto out; + } + __printf_function_table = (printf_function **) (__printf_arginfo_table + UCHAR_MAX + 1); } @@ -56,6 +70,22 @@ __register_printf_function (spec, converter, arginfo) __printf_function_table[spec] = converter; __printf_arginfo_table[spec] = arginfo; - return 0; + out: + __libc_lock_unlock (lock); + + return result; +} +weak_alias (__register_printf_specifier, register_printf_specifier) + + +/* Register FUNC to be called to format SPEC specifiers. */ +int +__register_printf_function (spec, converter, arginfo) + int spec; + printf_function converter; + printf_arginfo_function arginfo; +{ + return __register_printf_specifier (spec, converter, + (printf_arginfo_size_function*) arginfo); } weak_alias (__register_printf_function, register_printf_function) |