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