119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* Formatted output to strings, using POSIX/XSI format strings with positions.
219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   Copyright (C) 2003 Free Software Foundation, Inc.
319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   Written by Bruno Haible <bruno@clisp.org>, 2003.
419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   This program is free software; you can redistribute it and/or modify it
619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   under the terms of the GNU Library General Public License as published
719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   by the Free Software Foundation; either version 2, or (at your option)
819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   any later version.
919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   This program is distributed in the hope that it will be useful,
1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   but WITHOUT ANY WARRANTY; without even the implied warranty of
1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   Library General Public License for more details.
1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   You should have received a copy of the GNU Library General Public
1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   License along with this program; if not, write to the Free Software
1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   USA.  */
1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAVE_CONFIG_H
2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# include <config.h>
2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef __GNUC__
2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# define alloca __builtin_alloca
2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# define HAVE_ALLOCA 1
2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#else
2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# ifdef _MSC_VER
2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#  include <malloc.h>
3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#  define alloca _alloca
3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# else
3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#  if defined HAVE_ALLOCA_H || defined _LIBC
3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#   include <alloca.h>
3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#  else
3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#   ifdef _AIX
3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project #pragma alloca
3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#   else
3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#    ifndef alloca
3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectchar *alloca ();
4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#    endif
4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#   endif
4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#  endif
4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# endif
4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdio.h>
4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if !HAVE_POSIX_PRINTF
4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdlib.h>
5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <string.h>
5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* When building a DLL, we must export some functions.  Note that because
5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   the functions are only defined for binary backward compatibility, we
5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   don't need to use __declspec(dllimport) in any case.  */
5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if defined _MSC_VER && BUILDING_DLL
5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# define DLL_EXPORTED __declspec(dllexport)
5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#else
5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# define DLL_EXPORTED
6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define STATIC static
6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* Define auxiliary functions declared in "printf-args.h".  */
6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "printf-args.c"
6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* Define auxiliary functions declared in "printf-parse.h".  */
6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "printf-parse.c"
6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* Define functions declared in "vasnprintf.h".  */
7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define vasnprintf libintl_vasnprintf
7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "vasnprintf.c"
7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if 0 /* not needed */
7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define asnprintf libintl_asnprintf
7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "asnprintf.c"
7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source ProjectDLL_EXPORTED
7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint
8019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectlibintl_vfprintf (FILE *stream, const char *format, va_list args)
8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
8219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  if (strchr (format, '$') == NULL)
8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    return vfprintf (stream, format, args);
8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  else
8519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    {
8619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      size_t length;
8719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      char *result = libintl_vasnprintf (NULL, &length, format, args);
8819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      int retval = -1;
8919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      if (result != NULL)
9019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	{
9119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  if (fwrite (result, 1, length, stream) == length)
9219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    retval = length;
9319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  free (result);
9419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
9519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      return retval;
9619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    }
9719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
9819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
9919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source ProjectDLL_EXPORTED
10019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint
10119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectlibintl_fprintf (FILE *stream, const char *format, ...)
10219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
10319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  va_list args;
10419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  int retval;
10519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
10619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  va_start (args, format);
10719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  retval = libintl_vfprintf (stream, format, args);
10819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  va_end (args);
10919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  return retval;
11019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
11119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
11219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source ProjectDLL_EXPORTED
11319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint
11419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectlibintl_vprintf (const char *format, va_list args)
11519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
11619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  return libintl_vfprintf (stdout, format, args);
11719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
11819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
11919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source ProjectDLL_EXPORTED
12019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint
12119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectlibintl_printf (const char *format, ...)
12219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
12319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  va_list args;
12419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  int retval;
12519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
12619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  va_start (args, format);
12719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  retval = libintl_vprintf (format, args);
12819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  va_end (args);
12919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  return retval;
13019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
13119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
13219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source ProjectDLL_EXPORTED
13319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint
13419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectlibintl_vsprintf (char *resultbuf, const char *format, va_list args)
13519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
13619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  if (strchr (format, '$') == NULL)
13719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    return vsprintf (resultbuf, format, args);
13819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  else
13919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    {
14019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      size_t length = (size_t) ~0 / (4 * sizeof (char));
14119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      char *result = libintl_vasnprintf (resultbuf, &length, format, args);
14219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      if (result != resultbuf)
14319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	{
14419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  free (result);
14519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  return -1;
14619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
14719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      else
14819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	return length;
14919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    }
15019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
15119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
15219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source ProjectDLL_EXPORTED
15319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint
15419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectlibintl_sprintf (char *resultbuf, const char *format, ...)
15519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
15619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  va_list args;
15719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  int retval;
15819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
15919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  va_start (args, format);
16019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  retval = libintl_vsprintf (resultbuf, format, args);
16119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  va_end (args);
16219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  return retval;
16319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
16419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
16519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_SNPRINTF
16619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
16719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# if HAVE_DECL__SNPRINTF
16819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   /* Windows.  */
16919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#  define system_vsnprintf _vsnprintf
17019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# else
17119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   /* Unix.  */
17219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#  define system_vsnprintf vsnprintf
17319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# endif
17419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
17519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source ProjectDLL_EXPORTED
17619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint
17719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectlibintl_vsnprintf (char *resultbuf, size_t length, const char *format, va_list args)
17819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
17919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  if (strchr (format, '$') == NULL)
18019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    return system_vsnprintf (resultbuf, length, format, args);
18119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  else
18219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    {
18319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      size_t maxlength = length;
18419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      char *result = libintl_vasnprintf (resultbuf, &length, format, args);
18519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      if (result != resultbuf)
18619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	{
18719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  if (maxlength > 0)
18819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    {
18919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	      if (length < maxlength)
19019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		abort ();
19119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	      memcpy (resultbuf, result, maxlength - 1);
19219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	      resultbuf[maxlength - 1] = '\0';
19319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    }
19419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  free (result);
19519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  return -1;
19619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
19719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      else
19819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	return length;
19919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    }
20019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
20119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
20219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source ProjectDLL_EXPORTED
20319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint
20419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectlibintl_snprintf (char *resultbuf, size_t length, const char *format, ...)
20519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
20619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  va_list args;
20719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  int retval;
20819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
20919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  va_start (args, format);
21019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  retval = libintl_vsnprintf (resultbuf, length, format, args);
21119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  va_end (args);
21219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  return retval;
21319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
21419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
21519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
21619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
21719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_ASPRINTF
21819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
21919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source ProjectDLL_EXPORTED
22019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint
22119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectlibintl_vasprintf (char **resultp, const char *format, va_list args)
22219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
22319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  size_t length;
22419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  char *result = libintl_vasnprintf (NULL, &length, format, args);
22519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  if (result == NULL)
22619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    return -1;
22719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  *resultp = result;
22819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  return length;
22919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
23019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
23119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source ProjectDLL_EXPORTED
23219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint
23319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectlibintl_asprintf (char **resultp, const char *format, ...)
23419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
23519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  va_list args;
23619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  int retval;
23719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
23819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  va_start (args, format);
23919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  retval = libintl_vasprintf (resultp, format, args);
24019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  va_end (args);
24119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  return retval;
24219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
24319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
24419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
24519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
24619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_FWPRINTF
24719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
24819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <wchar.h>
24919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
25019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define WIDE_CHAR_VERSION 1
25119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
25219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* Define auxiliary functions declared in "wprintf-parse.h".  */
25319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "printf-parse.c"
25419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
25519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* Define functions declared in "vasnprintf.h".  */
25619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define vasnwprintf libintl_vasnwprintf
25719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "vasnprintf.c"
25819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if 0 /* not needed */
25919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define asnwprintf libintl_asnwprintf
26019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "asnprintf.c"
26119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
26219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
26319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# if HAVE_DECL__SNWPRINTF
26419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   /* Windows.  */
26519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#  define system_vswprintf _vsnwprintf
26619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# else
26719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   /* Unix.  */
26819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#  define system_vswprintf vswprintf
26919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# endif
27019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
27119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source ProjectDLL_EXPORTED
27219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint
27319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectlibintl_vfwprintf (FILE *stream, const wchar_t *format, va_list args)
27419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
27519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  if (wcschr (format, '$') == NULL)
27619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    return vfwprintf (stream, format, args);
27719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  else
27819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    {
27919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      size_t length;
28019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      wchar_t *result = libintl_vasnwprintf (NULL, &length, format, args);
28119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      int retval = -1;
28219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      if (result != NULL)
28319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	{
28419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  size_t i;
28519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  for (i = 0; i < length; i++)
28619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    if (fputwc (result[i], stream) == WEOF)
28719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	      break;
28819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  if (i == length)
28919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    retval = length;
29019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  free (result);
29119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
29219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      return retval;
29319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    }
29419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
29519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
29619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source ProjectDLL_EXPORTED
29719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint
29819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectlibintl_fwprintf (FILE *stream, const wchar_t *format, ...)
29919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
30019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  va_list args;
30119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  int retval;
30219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
30319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  va_start (args, format);
30419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  retval = libintl_vfwprintf (stream, format, args);
30519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  va_end (args);
30619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  return retval;
30719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
30819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
30919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source ProjectDLL_EXPORTED
31019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint
31119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectlibintl_vwprintf (const wchar_t *format, va_list args)
31219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
31319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  return libintl_vfwprintf (stdout, format, args);
31419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
31519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
31619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source ProjectDLL_EXPORTED
31719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint
31819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectlibintl_wprintf (const wchar_t *format, ...)
31919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
32019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  va_list args;
32119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  int retval;
32219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
32319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  va_start (args, format);
32419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  retval = libintl_vwprintf (format, args);
32519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  va_end (args);
32619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  return retval;
32719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
32819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
32919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source ProjectDLL_EXPORTED
33019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint
33119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectlibintl_vswprintf (wchar_t *resultbuf, size_t length, const wchar_t *format, va_list args)
33219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
33319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  if (wcschr (format, '$') == NULL)
33419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    return system_vswprintf (resultbuf, length, format, args);
33519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  else
33619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    {
33719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      size_t maxlength = length;
33819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      wchar_t *result = libintl_vasnwprintf (resultbuf, &length, format, args);
33919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      if (result != resultbuf)
34019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	{
34119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  if (maxlength > 0)
34219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    {
34319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	      if (length < maxlength)
34419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		abort ();
34519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	      memcpy (resultbuf, result, (maxlength - 1) * sizeof (wchar_t));
34619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	      resultbuf[maxlength - 1] = 0;
34719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    }
34819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  free (result);
34919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  return -1;
35019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
35119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      else
35219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	return length;
35319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    }
35419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
35519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
35619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source ProjectDLL_EXPORTED
35719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint
35819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectlibintl_swprintf (wchar_t *resultbuf, size_t length, const wchar_t *format, ...)
35919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
36019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  va_list args;
36119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  int retval;
36219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
36319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  va_start (args, format);
36419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  retval = libintl_vswprintf (resultbuf, length, format, args);
36519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  va_end (args);
36619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  return retval;
36719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
36819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
36919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
37019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
37119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
372