1 /* Formatted output to strings, using POSIX/XSI format strings with positions.
2 Copyright (C) 2003 Free Software Foundation, Inc.
3 Written by Bruno Haible <bruno@clisp.org>, 2003.
5 This program is free software; you can redistribute it and/or modify it
6 under the terms of the GNU Library General Public License as published
7 by the Free Software Foundation; either version 2, or (at your option)
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
15 You should have received a copy of the GNU Library General Public
16 License along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
25 # define alloca __builtin_alloca
26 # define HAVE_ALLOCA 1
30 # define alloca _alloca
32 # if defined HAVE_ALLOCA_H || defined _LIBC
48 #if !HAVE_POSIX_PRINTF
53 /* When building a DLL, we must export some functions. Note that because
54 the functions are only defined for binary backward compatibility, we
55 don't need to use __declspec(dllimport) in any case. */
56 #if defined _MSC_VER && BUILDING_DLL
57 # define DLL_EXPORTED __declspec(dllexport)
64 /* Define auxiliary functions declared in "printf-args.h". */
65 #include "printf-args.c"
67 /* Define auxiliary functions declared in "printf-parse.h". */
68 #include "printf-parse.c"
70 /* Define functions declared in "vasnprintf.h". */
71 #define vasnprintf libintl_vasnprintf
72 #include "vasnprintf.c"
73 #if 0 /* not needed */
74 #define asnprintf libintl_asnprintf
75 #include "asnprintf.c"
80 libintl_vfprintf (FILE *stream
, const char *format
, va_list args
)
82 if (strchr (format
, '$') == NULL
)
83 return vfprintf (stream
, format
, args
);
87 char *result
= libintl_vasnprintf (NULL
, &length
, format
, args
);
91 if (fwrite (result
, 1, length
, stream
) == length
)
101 libintl_fprintf (FILE *stream
, const char *format
, ...)
106 va_start (args
, format
);
107 retval
= libintl_vfprintf (stream
, format
, args
);
114 libintl_vprintf (const char *format
, va_list args
)
116 return libintl_vfprintf (stdout
, format
, args
);
121 libintl_printf (const char *format
, ...)
126 va_start (args
, format
);
127 retval
= libintl_vprintf (format
, args
);
134 libintl_vsprintf (char *resultbuf
, const char *format
, va_list args
)
136 if (strchr (format
, '$') == NULL
)
137 return vsprintf (resultbuf
, format
, args
);
140 size_t length
= (size_t) ~0 / (4 * sizeof (char));
141 char *result
= libintl_vasnprintf (resultbuf
, &length
, format
, args
);
142 if (result
!= resultbuf
)
154 libintl_sprintf (char *resultbuf
, const char *format
, ...)
159 va_start (args
, format
);
160 retval
= libintl_vsprintf (resultbuf
, format
, args
);
167 # if HAVE_DECL__SNPRINTF
169 # define system_vsnprintf _vsnprintf
172 # define system_vsnprintf vsnprintf
177 libintl_vsnprintf (char *resultbuf
, size_t length
, const char *format
, va_list args
)
179 if (strchr (format
, '$') == NULL
)
180 return system_vsnprintf (resultbuf
, length
, format
, args
);
183 size_t maxlength
= length
;
184 char *result
= libintl_vasnprintf (resultbuf
, &length
, format
, args
);
185 if (result
!= resultbuf
)
189 if (length
< maxlength
)
191 memcpy (resultbuf
, result
, maxlength
- 1);
192 resultbuf
[maxlength
- 1] = '\0';
204 libintl_snprintf (char *resultbuf
, size_t length
, const char *format
, ...)
209 va_start (args
, format
);
210 retval
= libintl_vsnprintf (resultbuf
, length
, format
, args
);
221 libintl_vasprintf (char **resultp
, const char *format
, va_list args
)
224 char *result
= libintl_vasnprintf (NULL
, &length
, format
, args
);
233 libintl_asprintf (char **resultp
, const char *format
, ...)
238 va_start (args
, format
);
239 retval
= libintl_vasprintf (resultp
, format
, args
);
250 #define WIDE_CHAR_VERSION 1
252 /* Define auxiliary functions declared in "wprintf-parse.h". */
253 #include "printf-parse.c"
255 /* Define functions declared in "vasnprintf.h". */
256 #define vasnwprintf libintl_vasnwprintf
257 #include "vasnprintf.c"
258 #if 0 /* not needed */
259 #define asnwprintf libintl_asnwprintf
260 #include "asnprintf.c"
263 # if HAVE_DECL__SNWPRINTF
265 # define system_vswprintf _vsnwprintf
268 # define system_vswprintf vswprintf
273 libintl_vfwprintf (FILE *stream
, const wchar_t *format
, va_list args
)
275 if (wcschr (format
, '$') == NULL
)
276 return vfwprintf (stream
, format
, args
);
280 wchar_t *result
= libintl_vasnwprintf (NULL
, &length
, format
, args
);
285 for (i
= 0; i
< length
; i
++)
286 if (fputwc (result
[i
], stream
) == WEOF
)
298 libintl_fwprintf (FILE *stream
, const wchar_t *format
, ...)
303 va_start (args
, format
);
304 retval
= libintl_vfwprintf (stream
, format
, args
);
311 libintl_vwprintf (const wchar_t *format
, va_list args
)
313 return libintl_vfwprintf (stdout
, format
, args
);
318 libintl_wprintf (const wchar_t *format
, ...)
323 va_start (args
, format
);
324 retval
= libintl_vwprintf (format
, args
);
331 libintl_vswprintf (wchar_t *resultbuf
, size_t length
, const wchar_t *format
, va_list args
)
333 if (wcschr (format
, '$') == NULL
)
334 return system_vswprintf (resultbuf
, length
, format
, args
);
337 size_t maxlength
= length
;
338 wchar_t *result
= libintl_vasnwprintf (resultbuf
, &length
, format
, args
);
339 if (result
!= resultbuf
)
343 if (length
< maxlength
)
345 memcpy (resultbuf
, result
, (maxlength
- 1) * sizeof (wchar_t));
346 resultbuf
[maxlength
- 1] = 0;
358 libintl_swprintf (wchar_t *resultbuf
, size_t length
, const wchar_t *format
, ...)
363 va_start (args
, format
);
364 retval
= libintl_vswprintf (resultbuf
, length
, format
, args
);