Mercurial > hg > octave-lojdl > gnulib-hg
annotate lib/vasnprintf.c @ 8417:ee40afd85f2c
Avoid an endless recursion.
author | Bruno Haible <bruno@clisp.org> |
---|---|
date | Sun, 11 Mar 2007 12:05:24 +0000 |
parents | 655fca11a0e6 |
children | ec3450ce9889 |
rev | line source |
---|---|
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1 /* vsprintf with automatic memory allocation. |
8051
9c2b0396b27c
Stylistic change: Use '#if HAVE_*' instead of '#ifdef HAVE_*'.
Bruno Haible <bruno@clisp.org>
parents:
7475
diff
changeset
|
2 Copyright (C) 1999, 2002-2007 Free Software Foundation, Inc. |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
3 |
4440
e58a1c05a6ba
Update gettext source files from gettext automatically, using srclist-update.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4428
diff
changeset
|
4 This program is free software; you can redistribute it and/or modify |
e58a1c05a6ba
Update gettext source files from gettext automatically, using srclist-update.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4428
diff
changeset
|
5 it under the terms of the GNU General Public License as published by |
e58a1c05a6ba
Update gettext source files from gettext automatically, using srclist-update.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4428
diff
changeset
|
6 the Free Software Foundation; either version 2, or (at your option) |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
7 any later version. |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
8 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
9 This program is distributed in the hope that it will be useful, |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
10 but WITHOUT ANY WARRANTY; without even the implied warranty of |
4440
e58a1c05a6ba
Update gettext source files from gettext automatically, using srclist-update.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4428
diff
changeset
|
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
e58a1c05a6ba
Update gettext source files from gettext automatically, using srclist-update.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4428
diff
changeset
|
12 GNU General Public License for more details. |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
13 |
4440
e58a1c05a6ba
Update gettext source files from gettext automatically, using srclist-update.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4428
diff
changeset
|
14 You should have received a copy of the GNU General Public License along |
e58a1c05a6ba
Update gettext source files from gettext automatically, using srclist-update.
Paul Eggert <eggert@cs.ucla.edu>
parents:
4428
diff
changeset
|
15 with this program; if not, write to the Free Software Foundation, |
5848
a48fb0e98c8c
*** empty log message ***
Paul Eggert <eggert@cs.ucla.edu>
parents:
5670
diff
changeset
|
16 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
17 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
18 /* Tell glibc's <stdio.h> to provide a prototype for snprintf(). |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
19 This must come before <config.h> because <config.h> may include |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
20 <features.h>, and once <features.h> has been included, it's too late. */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
21 #ifndef _GNU_SOURCE |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
22 # define _GNU_SOURCE 1 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
23 #endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
24 |
7304
1c4ed7637c24
Include <config.h> unconditionally.
Bruno Haible <bruno@clisp.org>
parents:
7218
diff
changeset
|
25 #include <config.h> |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
26 #ifndef IN_LIBINTL |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
27 # include <alloca.h> |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
28 #endif |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
29 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
30 /* Specification. */ |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
31 #if WIDE_CHAR_VERSION |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
32 # include "vasnwprintf.h" |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
33 #else |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
34 # include "vasnprintf.h" |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
35 #endif |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
36 |
8400
655fca11a0e6
The decimal point must be locale dependent.
Bruno Haible <bruno@clisp.org>
parents:
8343
diff
changeset
|
37 #include <locale.h> /* localeconv() */ |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
38 #include <stdio.h> /* snprintf(), sprintf() */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
39 #include <stdlib.h> /* abort(), malloc(), realloc(), free() */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
40 #include <string.h> /* memcpy(), strlen() */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
41 #include <errno.h> /* errno */ |
7218
0fd12ba5cfc6
Do the INT_MAX check only where size_t is converted to 'int'.
Bruno Haible <bruno@clisp.org>
parents:
6583
diff
changeset
|
42 #include <limits.h> /* CHAR_BIT */ |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
43 #include <float.h> /* DBL_MAX_EXP, LDBL_MAX_EXP */ |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
44 #if WIDE_CHAR_VERSION |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
45 # include "wprintf-parse.h" |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
46 #else |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
47 # include "printf-parse.h" |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
48 #endif |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
49 |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
50 /* Checked size_t computations. */ |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
51 #include "xsize.h" |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
52 |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
53 #if NEED_PRINTF_DIRECTIVE_A && !defined IN_LIBINTL |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
54 # include "isnan.h" |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
55 # include "isnanl.h" |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
56 # if HAVE_LONG_DOUBLE |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
57 # include "printf-frexp.h" |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
58 # include "printf-frexpl.h" |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
59 # endif |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
60 #endif |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
61 |
8051
9c2b0396b27c
Stylistic change: Use '#if HAVE_*' instead of '#ifdef HAVE_*'.
Bruno Haible <bruno@clisp.org>
parents:
7475
diff
changeset
|
62 #if HAVE_WCHAR_T |
9c2b0396b27c
Stylistic change: Use '#if HAVE_*' instead of '#ifdef HAVE_*'.
Bruno Haible <bruno@clisp.org>
parents:
7475
diff
changeset
|
63 # if HAVE_WCSLEN |
4523
6cc4874a100b
Work around the lack of wcslen() on Solaris 2.5.1.
Bruno Haible <bruno@clisp.org>
parents:
4444
diff
changeset
|
64 # define local_wcslen wcslen |
6cc4874a100b
Work around the lack of wcslen() on Solaris 2.5.1.
Bruno Haible <bruno@clisp.org>
parents:
4444
diff
changeset
|
65 # else |
6cc4874a100b
Work around the lack of wcslen() on Solaris 2.5.1.
Bruno Haible <bruno@clisp.org>
parents:
4444
diff
changeset
|
66 /* Solaris 2.5.1 has wcslen() in a separate library libw.so. To avoid |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
67 a dependency towards this library, here is a local substitute. |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
68 Define this substitute only once, even if this file is included |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
69 twice in the same compilation unit. */ |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
70 # ifndef local_wcslen_defined |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
71 # define local_wcslen_defined 1 |
4523
6cc4874a100b
Work around the lack of wcslen() on Solaris 2.5.1.
Bruno Haible <bruno@clisp.org>
parents:
4444
diff
changeset
|
72 static size_t |
6cc4874a100b
Work around the lack of wcslen() on Solaris 2.5.1.
Bruno Haible <bruno@clisp.org>
parents:
4444
diff
changeset
|
73 local_wcslen (const wchar_t *s) |
6cc4874a100b
Work around the lack of wcslen() on Solaris 2.5.1.
Bruno Haible <bruno@clisp.org>
parents:
4444
diff
changeset
|
74 { |
6cc4874a100b
Work around the lack of wcslen() on Solaris 2.5.1.
Bruno Haible <bruno@clisp.org>
parents:
4444
diff
changeset
|
75 const wchar_t *ptr; |
6cc4874a100b
Work around the lack of wcslen() on Solaris 2.5.1.
Bruno Haible <bruno@clisp.org>
parents:
4444
diff
changeset
|
76 |
6cc4874a100b
Work around the lack of wcslen() on Solaris 2.5.1.
Bruno Haible <bruno@clisp.org>
parents:
4444
diff
changeset
|
77 for (ptr = s; *ptr != (wchar_t) 0; ptr++) |
6cc4874a100b
Work around the lack of wcslen() on Solaris 2.5.1.
Bruno Haible <bruno@clisp.org>
parents:
4444
diff
changeset
|
78 ; |
6cc4874a100b
Work around the lack of wcslen() on Solaris 2.5.1.
Bruno Haible <bruno@clisp.org>
parents:
4444
diff
changeset
|
79 return ptr - s; |
6cc4874a100b
Work around the lack of wcslen() on Solaris 2.5.1.
Bruno Haible <bruno@clisp.org>
parents:
4444
diff
changeset
|
80 } |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
81 # endif |
4523
6cc4874a100b
Work around the lack of wcslen() on Solaris 2.5.1.
Bruno Haible <bruno@clisp.org>
parents:
4444
diff
changeset
|
82 # endif |
6cc4874a100b
Work around the lack of wcslen() on Solaris 2.5.1.
Bruno Haible <bruno@clisp.org>
parents:
4444
diff
changeset
|
83 #endif |
6cc4874a100b
Work around the lack of wcslen() on Solaris 2.5.1.
Bruno Haible <bruno@clisp.org>
parents:
4444
diff
changeset
|
84 |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
85 #if WIDE_CHAR_VERSION |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
86 # define VASNPRINTF vasnwprintf |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
87 # define CHAR_T wchar_t |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
88 # define DIRECTIVE wchar_t_directive |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
89 # define DIRECTIVES wchar_t_directives |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
90 # define PRINTF_PARSE wprintf_parse |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
91 # define USE_SNPRINTF 1 |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
92 # if HAVE_DECL__SNWPRINTF |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
93 /* On Windows, the function swprintf() has a different signature than |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
94 on Unix; we use the _snwprintf() function instead. */ |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
95 # define SNPRINTF _snwprintf |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
96 # else |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
97 /* Unix. */ |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
98 # define SNPRINTF swprintf |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
99 # endif |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
100 #else |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
101 # define VASNPRINTF vasnprintf |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
102 # define CHAR_T char |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
103 # define DIRECTIVE char_directive |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
104 # define DIRECTIVES char_directives |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
105 # define PRINTF_PARSE printf_parse |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
106 # define USE_SNPRINTF (HAVE_DECL__SNPRINTF || HAVE_SNPRINTF) |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
107 # if HAVE_DECL__SNPRINTF |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
108 /* Windows. */ |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
109 # define SNPRINTF _snprintf |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
110 # else |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
111 /* Unix. */ |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
112 # define SNPRINTF snprintf |
8417
ee40afd85f2c
Avoid an endless recursion.
Bruno Haible <bruno@clisp.org>
parents:
8400
diff
changeset
|
113 /* Here we need to call the native snprintf, not rpl_snprintf. */ |
ee40afd85f2c
Avoid an endless recursion.
Bruno Haible <bruno@clisp.org>
parents:
8400
diff
changeset
|
114 # undef snprintf |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
115 # endif |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
116 #endif |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
117 |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
118 CHAR_T * |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
119 VASNPRINTF (CHAR_T *resultbuf, size_t *lengthp, const CHAR_T *format, va_list args) |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
120 { |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
121 DIRECTIVES d; |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
122 arguments a; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
123 |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
124 if (PRINTF_PARSE (format, &d, &a) < 0) |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
125 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
126 errno = EINVAL; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
127 return NULL; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
128 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
129 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
130 #define CLEANUP() \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
131 free (d.dir); \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
132 if (a.arg) \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
133 free (a.arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
134 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
135 if (printf_fetchargs (args, &a) < 0) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
136 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
137 CLEANUP (); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
138 errno = EINVAL; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
139 return NULL; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
140 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
141 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
142 { |
4879
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
143 size_t buf_neededlength; |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
144 CHAR_T *buf; |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
145 CHAR_T *buf_malloced; |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
146 const CHAR_T *cp; |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
147 size_t i; |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
148 DIRECTIVE *dp; |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
149 /* Output string accumulator. */ |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
150 CHAR_T *result; |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
151 size_t allocated; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
152 size_t length; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
153 |
4879
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
154 /* Allocate a small buffer that will hold a directive passed to |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
155 sprintf or snprintf. */ |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
156 buf_neededlength = |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
157 xsum4 (7, d.max_width_length, d.max_precision_length, 6); |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
158 #if HAVE_ALLOCA |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
159 if (buf_neededlength < 4000 / sizeof (CHAR_T)) |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
160 { |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
161 buf = (CHAR_T *) alloca (buf_neededlength * sizeof (CHAR_T)); |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
162 buf_malloced = NULL; |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
163 } |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
164 else |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
165 #endif |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
166 { |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
167 size_t buf_memsize = xtimes (buf_neededlength, sizeof (CHAR_T)); |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
168 if (size_overflow_p (buf_memsize)) |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
169 goto out_of_memory_1; |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
170 buf = (CHAR_T *) malloc (buf_memsize); |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
171 if (buf == NULL) |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
172 goto out_of_memory_1; |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
173 buf_malloced = buf; |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
174 } |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
175 |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
176 if (resultbuf != NULL) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
177 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
178 result = resultbuf; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
179 allocated = *lengthp; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
180 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
181 else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
182 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
183 result = NULL; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
184 allocated = 0; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
185 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
186 length = 0; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
187 /* Invariants: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
188 result is either == resultbuf or == NULL or malloc-allocated. |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
189 If length > 0, then result != NULL. */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
190 |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
191 /* Ensures that allocated >= needed. Aborts through a jump to |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
192 out_of_memory if needed is SIZE_MAX or otherwise too big. */ |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
193 #define ENSURE_ALLOCATION(needed) \ |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
194 if ((needed) > allocated) \ |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
195 { \ |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
196 size_t memory_size; \ |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
197 CHAR_T *memory; \ |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
198 \ |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
199 allocated = (allocated > 0 ? xtimes (allocated, 2) : 12); \ |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
200 if ((needed) > allocated) \ |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
201 allocated = (needed); \ |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
202 memory_size = xtimes (allocated, sizeof (CHAR_T)); \ |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
203 if (size_overflow_p (memory_size)) \ |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
204 goto out_of_memory; \ |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
205 if (result == resultbuf || result == NULL) \ |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
206 memory = (CHAR_T *) malloc (memory_size); \ |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
207 else \ |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
208 memory = (CHAR_T *) realloc (result, memory_size); \ |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
209 if (memory == NULL) \ |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
210 goto out_of_memory; \ |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
211 if (result == resultbuf && length > 0) \ |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
212 memcpy (memory, result, length * sizeof (CHAR_T)); \ |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
213 result = memory; \ |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
214 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
215 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
216 for (cp = format, i = 0, dp = &d.dir[0]; ; cp = dp->dir_end, i++, dp++) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
217 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
218 if (cp != dp->dir_start) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
219 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
220 size_t n = dp->dir_start - cp; |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
221 size_t augmented_length = xsum (length, n); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
222 |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
223 ENSURE_ALLOCATION (augmented_length); |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
224 memcpy (result + length, cp, n * sizeof (CHAR_T)); |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
225 length = augmented_length; |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
226 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
227 if (i == d.count) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
228 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
229 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
230 /* Execute a single directive. */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
231 if (dp->conversion == '%') |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
232 { |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
233 size_t augmented_length; |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
234 |
4886
e4317f1f2e2c
Use size_t instead of ssize_t.
Bruno Haible <bruno@clisp.org>
parents:
4879
diff
changeset
|
235 if (!(dp->arg_index == ARG_NONE)) |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
236 abort (); |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
237 augmented_length = xsum (length, 1); |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
238 ENSURE_ALLOCATION (augmented_length); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
239 result[length] = '%'; |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
240 length = augmented_length; |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
241 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
242 else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
243 { |
4886
e4317f1f2e2c
Use size_t instead of ssize_t.
Bruno Haible <bruno@clisp.org>
parents:
4879
diff
changeset
|
244 if (!(dp->arg_index != ARG_NONE)) |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
245 abort (); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
246 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
247 if (dp->conversion == 'n') |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
248 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
249 switch (a.arg[dp->arg_index].type) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
250 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
251 case TYPE_COUNT_SCHAR_POINTER: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
252 *a.arg[dp->arg_index].a.a_count_schar_pointer = length; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
253 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
254 case TYPE_COUNT_SHORT_POINTER: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
255 *a.arg[dp->arg_index].a.a_count_short_pointer = length; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
256 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
257 case TYPE_COUNT_INT_POINTER: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
258 *a.arg[dp->arg_index].a.a_count_int_pointer = length; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
259 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
260 case TYPE_COUNT_LONGINT_POINTER: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
261 *a.arg[dp->arg_index].a.a_count_longint_pointer = length; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
262 break; |
8051
9c2b0396b27c
Stylistic change: Use '#if HAVE_*' instead of '#ifdef HAVE_*'.
Bruno Haible <bruno@clisp.org>
parents:
7475
diff
changeset
|
263 #if HAVE_LONG_LONG_INT |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
264 case TYPE_COUNT_LONGLONGINT_POINTER: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
265 *a.arg[dp->arg_index].a.a_count_longlongint_pointer = length; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
266 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
267 #endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
268 default: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
269 abort (); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
270 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
271 } |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
272 #if NEED_PRINTF_DIRECTIVE_A && !defined IN_LIBINTL |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
273 else if (dp->conversion == 'a' || dp->conversion == 'A') |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
274 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
275 arg_type type = a.arg[dp->arg_index].type; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
276 int flags = dp->flags; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
277 int has_width; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
278 size_t width; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
279 int has_precision; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
280 size_t precision; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
281 size_t tmp_length; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
282 CHAR_T tmpbuf[700]; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
283 CHAR_T *tmp; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
284 CHAR_T *pad_ptr; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
285 CHAR_T *p; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
286 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
287 has_width = 0; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
288 width = 0; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
289 if (dp->width_start != dp->width_end) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
290 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
291 if (dp->width_arg_index != ARG_NONE) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
292 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
293 int arg; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
294 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
295 if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
296 abort (); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
297 arg = a.arg[dp->width_arg_index].a.a_int; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
298 if (arg < 0) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
299 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
300 /* "A negative field width is taken as a '-' flag |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
301 followed by a positive field width." */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
302 flags |= FLAG_LEFT; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
303 width = (unsigned int) (-arg); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
304 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
305 else |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
306 width = arg; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
307 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
308 else |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
309 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
310 const CHAR_T *digitp = dp->width_start; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
311 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
312 do |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
313 width = xsum (xtimes (width, 10), *digitp++ - '0'); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
314 while (digitp != dp->width_end); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
315 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
316 has_width = 1; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
317 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
318 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
319 has_precision = 0; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
320 precision = 0; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
321 if (dp->precision_start != dp->precision_end) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
322 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
323 if (dp->precision_arg_index != ARG_NONE) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
324 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
325 int arg; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
326 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
327 if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
328 abort (); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
329 arg = a.arg[dp->precision_arg_index].a.a_int; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
330 /* "A negative precision is taken as if the precision |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
331 were omitted." */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
332 if (arg >= 0) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
333 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
334 precision = arg; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
335 has_precision = 1; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
336 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
337 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
338 else |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
339 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
340 const CHAR_T *digitp = dp->precision_start + 1; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
341 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
342 precision = 0; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
343 while (digitp != dp->precision_end) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
344 precision = xsum (xtimes (precision, 10), *digitp++ - '0'); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
345 has_precision = 1; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
346 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
347 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
348 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
349 /* Allocate a temporary buffer of sufficient size. */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
350 # if HAVE_LONG_DOUBLE |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
351 if (type == TYPE_LONGDOUBLE) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
352 tmp_length = |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
353 (unsigned int) ((LDBL_DIG + 1) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
354 * 0.831 /* decimal -> hexadecimal */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
355 ) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
356 + 1; /* turn floor into ceil */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
357 else |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
358 # endif |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
359 tmp_length = |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
360 (unsigned int) ((DBL_DIG + 1) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
361 * 0.831 /* decimal -> hexadecimal */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
362 ) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
363 + 1; /* turn floor into ceil */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
364 if (tmp_length < precision) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
365 tmp_length = precision; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
366 /* Account for sign, decimal point etc. */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
367 tmp_length = xsum (tmp_length, 12); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
368 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
369 if (tmp_length < width) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
370 tmp_length = width; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
371 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
372 tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
373 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
374 if (tmp_length <= sizeof (tmpbuf) / sizeof (CHAR_T)) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
375 tmp = tmpbuf; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
376 else |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
377 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
378 size_t tmp_memsize = xtimes (tmp_length, sizeof (CHAR_T)); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
379 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
380 if (size_overflow_p (tmp_memsize)) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
381 /* Overflow, would lead to out of memory. */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
382 goto out_of_memory; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
383 tmp = (CHAR_T *) malloc (tmp_memsize); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
384 if (tmp == NULL) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
385 /* Out of memory. */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
386 goto out_of_memory; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
387 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
388 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
389 pad_ptr = NULL; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
390 p = tmp; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
391 # if HAVE_LONG_DOUBLE |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
392 if (type == TYPE_LONGDOUBLE) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
393 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
394 long double arg = a.arg[dp->arg_index].a.a_longdouble; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
395 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
396 if (isnanl (arg)) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
397 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
398 if (dp->conversion == 'A') |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
399 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
400 *p++ = 'N'; *p++ = 'A'; *p++ = 'N'; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
401 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
402 else |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
403 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
404 *p++ = 'n'; *p++ = 'a'; *p++ = 'n'; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
405 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
406 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
407 else |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
408 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
409 int sign = 0; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
410 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
411 if (arg < 0.0L) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
412 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
413 sign = -1; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
414 arg = -arg; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
415 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
416 else if (arg == 0.0L) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
417 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
418 /* Distinguish 0.0L and -0.0L. */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
419 static long double plus_zero = 0.0L; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
420 long double arg_mem = arg; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
421 if (memcmp (&plus_zero, &arg_mem, sizeof (long double)) != 0) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
422 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
423 sign = -1; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
424 arg = -arg; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
425 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
426 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
427 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
428 if (sign < 0) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
429 *p++ = '-'; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
430 else if (flags & FLAG_SHOWSIGN) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
431 *p++ = '+'; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
432 else if (flags & FLAG_SPACE) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
433 *p++ = ' '; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
434 |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
435 if (arg > 0.0L && arg + arg == arg) |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
436 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
437 if (dp->conversion == 'A') |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
438 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
439 *p++ = 'I'; *p++ = 'N'; *p++ = 'F'; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
440 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
441 else |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
442 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
443 *p++ = 'i'; *p++ = 'n'; *p++ = 'f'; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
444 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
445 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
446 else |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
447 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
448 int exponent; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
449 long double mantissa; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
450 |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
451 if (arg > 0.0L) |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
452 mantissa = printf_frexpl (arg, &exponent); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
453 else |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
454 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
455 exponent = 0; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
456 mantissa = 0.0L; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
457 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
458 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
459 if (has_precision |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
460 && precision < (unsigned int) ((LDBL_DIG + 1) * 0.831) + 1) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
461 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
462 /* Round the mantissa. */ |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
463 long double tail = mantissa; |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
464 size_t q; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
465 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
466 for (q = precision; ; q--) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
467 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
468 int digit = (int) tail; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
469 tail -= digit; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
470 if (q == 0) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
471 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
472 if (digit & 1 ? tail >= 0.5L : tail > 0.5L) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
473 tail = 1 - tail; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
474 else |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
475 tail = - tail; |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
476 break; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
477 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
478 tail *= 16.0L; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
479 } |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
480 if (tail != 0.0L) |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
481 for (q = precision; q > 0; q--) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
482 tail *= 0.0625L; |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
483 mantissa += tail; |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
484 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
485 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
486 *p++ = '0'; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
487 *p++ = dp->conversion - 'A' + 'X'; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
488 pad_ptr = p; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
489 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
490 int digit; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
491 |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
492 digit = (int) mantissa; |
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
493 mantissa -= digit; |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
494 *p++ = '0' + digit; |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
495 if ((flags & FLAG_ALT) |
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
496 || mantissa > 0.0L || precision > 0) |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
497 { |
8400
655fca11a0e6
The decimal point must be locale dependent.
Bruno Haible <bruno@clisp.org>
parents:
8343
diff
changeset
|
498 const char *point = |
655fca11a0e6
The decimal point must be locale dependent.
Bruno Haible <bruno@clisp.org>
parents:
8343
diff
changeset
|
499 localeconv () -> decimal_point; |
655fca11a0e6
The decimal point must be locale dependent.
Bruno Haible <bruno@clisp.org>
parents:
8343
diff
changeset
|
500 /* The decimal point is always a single byte: |
655fca11a0e6
The decimal point must be locale dependent.
Bruno Haible <bruno@clisp.org>
parents:
8343
diff
changeset
|
501 either '.' or ','. */ |
655fca11a0e6
The decimal point must be locale dependent.
Bruno Haible <bruno@clisp.org>
parents:
8343
diff
changeset
|
502 *p++ = (point[0] != '\0' ? point[0] : '.'); |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
503 /* This loop terminates because we assume |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
504 that FLT_RADIX is a power of 2. */ |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
505 while (mantissa > 0.0L) |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
506 { |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
507 mantissa *= 16.0L; |
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
508 digit = (int) mantissa; |
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
509 mantissa -= digit; |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
510 *p++ = digit |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
511 + (digit < 10 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
512 ? '0' |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
513 : dp->conversion - 10); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
514 if (precision > 0) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
515 precision--; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
516 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
517 while (precision > 0) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
518 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
519 *p++ = '0'; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
520 precision--; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
521 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
522 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
523 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
524 *p++ = dp->conversion - 'A' + 'P'; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
525 # if WIDE_CHAR_VERSION |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
526 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
527 static const wchar_t decimal_format[] = |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
528 { '%', '+', 'd', '\0' }; |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
529 SNPRINTF (p, 6 + 1, decimal_format, exponent); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
530 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
531 # else |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
532 sprintf (p, "%+d", exponent); |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
533 # endif |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
534 while (*p != '\0') |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
535 p++; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
536 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
537 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
538 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
539 else |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
540 # endif |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
541 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
542 double arg = a.arg[dp->arg_index].a.a_double; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
543 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
544 if (isnan (arg)) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
545 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
546 if (dp->conversion == 'A') |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
547 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
548 *p++ = 'N'; *p++ = 'A'; *p++ = 'N'; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
549 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
550 else |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
551 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
552 *p++ = 'n'; *p++ = 'a'; *p++ = 'n'; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
553 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
554 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
555 else |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
556 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
557 int sign = 0; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
558 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
559 if (arg < 0.0) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
560 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
561 sign = -1; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
562 arg = -arg; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
563 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
564 else if (arg == 0.0) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
565 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
566 /* Distinguish 0.0 and -0.0. */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
567 static double plus_zero = 0.0; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
568 double arg_mem = arg; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
569 if (memcmp (&plus_zero, &arg_mem, sizeof (double)) != 0) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
570 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
571 sign = -1; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
572 arg = -arg; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
573 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
574 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
575 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
576 if (sign < 0) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
577 *p++ = '-'; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
578 else if (flags & FLAG_SHOWSIGN) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
579 *p++ = '+'; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
580 else if (flags & FLAG_SPACE) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
581 *p++ = ' '; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
582 |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
583 if (arg > 0.0 && arg + arg == arg) |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
584 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
585 if (dp->conversion == 'A') |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
586 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
587 *p++ = 'I'; *p++ = 'N'; *p++ = 'F'; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
588 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
589 else |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
590 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
591 *p++ = 'i'; *p++ = 'n'; *p++ = 'f'; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
592 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
593 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
594 else |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
595 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
596 int exponent; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
597 double mantissa; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
598 |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
599 if (arg > 0.0) |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
600 mantissa = printf_frexp (arg, &exponent); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
601 else |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
602 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
603 exponent = 0; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
604 mantissa = 0.0; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
605 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
606 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
607 if (has_precision |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
608 && precision < (unsigned int) ((DBL_DIG + 1) * 0.831) + 1) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
609 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
610 /* Round the mantissa. */ |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
611 double tail = mantissa; |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
612 size_t q; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
613 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
614 for (q = precision; ; q--) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
615 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
616 int digit = (int) tail; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
617 tail -= digit; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
618 if (q == 0) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
619 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
620 if (digit & 1 ? tail >= 0.5 : tail > 0.5) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
621 tail = 1 - tail; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
622 else |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
623 tail = - tail; |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
624 break; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
625 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
626 tail *= 16.0; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
627 } |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
628 if (tail != 0.0) |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
629 for (q = precision; q > 0; q--) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
630 tail *= 0.0625; |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
631 mantissa += tail; |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
632 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
633 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
634 *p++ = '0'; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
635 *p++ = dp->conversion - 'A' + 'X'; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
636 pad_ptr = p; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
637 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
638 int digit; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
639 |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
640 digit = (int) mantissa; |
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
641 mantissa -= digit; |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
642 *p++ = '0' + digit; |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
643 if ((flags & FLAG_ALT) |
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
644 || mantissa > 0.0 || precision > 0) |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
645 { |
8400
655fca11a0e6
The decimal point must be locale dependent.
Bruno Haible <bruno@clisp.org>
parents:
8343
diff
changeset
|
646 const char *point = |
655fca11a0e6
The decimal point must be locale dependent.
Bruno Haible <bruno@clisp.org>
parents:
8343
diff
changeset
|
647 localeconv () -> decimal_point; |
655fca11a0e6
The decimal point must be locale dependent.
Bruno Haible <bruno@clisp.org>
parents:
8343
diff
changeset
|
648 /* The decimal point is always a single byte: |
655fca11a0e6
The decimal point must be locale dependent.
Bruno Haible <bruno@clisp.org>
parents:
8343
diff
changeset
|
649 either '.' or ','. */ |
655fca11a0e6
The decimal point must be locale dependent.
Bruno Haible <bruno@clisp.org>
parents:
8343
diff
changeset
|
650 *p++ = (point[0] != '\0' ? point[0] : '.'); |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
651 /* This loop terminates because we assume |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
652 that FLT_RADIX is a power of 2. */ |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
653 while (mantissa > 0.0) |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
654 { |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
655 mantissa *= 16.0; |
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
656 digit = (int) mantissa; |
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
657 mantissa -= digit; |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
658 *p++ = digit |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
659 + (digit < 10 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
660 ? '0' |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
661 : dp->conversion - 10); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
662 if (precision > 0) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
663 precision--; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
664 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
665 while (precision > 0) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
666 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
667 *p++ = '0'; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
668 precision--; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
669 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
670 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
671 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
672 *p++ = dp->conversion - 'A' + 'P'; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
673 # if WIDE_CHAR_VERSION |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
674 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
675 static const wchar_t decimal_format[] = |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
676 { '%', '+', 'd', '\0' }; |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
677 SNPRINTF (p, 6 + 1, decimal_format, exponent); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
678 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
679 # else |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
680 sprintf (p, "%+d", exponent); |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
681 # endif |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
682 while (*p != '\0') |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
683 p++; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
684 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
685 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
686 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
687 /* The generated string now extends from tmp to p, with the |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
688 zero padding insertion point being at pad_ptr. */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
689 if (has_width && p - tmp < width) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
690 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
691 size_t pad = width - (p - tmp); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
692 CHAR_T *end = p + pad; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
693 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
694 if (flags & FLAG_LEFT) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
695 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
696 /* Pad with spaces on the right. */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
697 for (; pad > 0; pad--) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
698 *p++ = ' '; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
699 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
700 else if ((flags & FLAG_ZERO) && pad_ptr != NULL) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
701 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
702 /* Pad with zeroes. */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
703 CHAR_T *q = end; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
704 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
705 while (p > pad_ptr) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
706 *--q = *--p; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
707 for (; pad > 0; pad--) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
708 *p++ = '0'; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
709 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
710 else |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
711 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
712 /* Pad with spaces on the left. */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
713 CHAR_T *q = end; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
714 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
715 while (p > tmp) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
716 *--q = *--p; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
717 for (; pad > 0; pad--) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
718 *p++ = ' '; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
719 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
720 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
721 p = end; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
722 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
723 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
724 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
725 size_t count = p - tmp; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
726 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
727 if (count >= tmp_length) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
728 /* tmp_length was incorrectly calculated - fix the |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
729 code above! */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
730 abort (); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
731 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
732 /* Make room for the result. */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
733 if (count >= allocated - length) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
734 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
735 size_t n = xsum (length, count); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
736 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
737 ENSURE_ALLOCATION (n); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
738 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
739 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
740 /* Append the result. */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
741 memcpy (result + length, tmp, count * sizeof (CHAR_T)); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
742 if (tmp != tmpbuf) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
743 free (tmp); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
744 length += count; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
745 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
746 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
747 #endif |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
748 else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
749 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
750 arg_type type = a.arg[dp->arg_index].type; |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
751 CHAR_T *p; |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
752 unsigned int prefix_count; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
753 int prefixes[2]; |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
754 #if !USE_SNPRINTF |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
755 size_t tmp_length; |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
756 CHAR_T tmpbuf[700]; |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
757 CHAR_T *tmp; |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
758 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
759 /* Allocate a temporary buffer of sufficient size for calling |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
760 sprintf. */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
761 { |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
762 size_t width; |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
763 size_t precision; |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
764 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
765 width = 0; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
766 if (dp->width_start != dp->width_end) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
767 { |
4886
e4317f1f2e2c
Use size_t instead of ssize_t.
Bruno Haible <bruno@clisp.org>
parents:
4879
diff
changeset
|
768 if (dp->width_arg_index != ARG_NONE) |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
769 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
770 int arg; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
771 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
772 if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
773 abort (); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
774 arg = a.arg[dp->width_arg_index].a.a_int; |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
775 width = (arg < 0 ? (unsigned int) (-arg) : arg); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
776 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
777 else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
778 { |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
779 const CHAR_T *digitp = dp->width_start; |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
780 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
781 do |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
782 width = xsum (xtimes (width, 10), *digitp++ - '0'); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
783 while (digitp != dp->width_end); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
784 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
785 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
786 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
787 precision = 6; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
788 if (dp->precision_start != dp->precision_end) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
789 { |
4886
e4317f1f2e2c
Use size_t instead of ssize_t.
Bruno Haible <bruno@clisp.org>
parents:
4879
diff
changeset
|
790 if (dp->precision_arg_index != ARG_NONE) |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
791 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
792 int arg; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
793 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
794 if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
795 abort (); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
796 arg = a.arg[dp->precision_arg_index].a.a_int; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
797 precision = (arg < 0 ? 0 : arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
798 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
799 else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
800 { |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
801 const CHAR_T *digitp = dp->precision_start + 1; |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
802 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
803 precision = 0; |
5066
a2cb70e482fc
Fix for format strings like "%2.f".
Bruno Haible <bruno@clisp.org>
parents:
4886
diff
changeset
|
804 while (digitp != dp->precision_end) |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
805 precision = xsum (xtimes (precision, 10), *digitp++ - '0'); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
806 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
807 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
808 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
809 switch (dp->conversion) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
810 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
811 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
812 case 'd': case 'i': case 'u': |
8051
9c2b0396b27c
Stylistic change: Use '#if HAVE_*' instead of '#ifdef HAVE_*'.
Bruno Haible <bruno@clisp.org>
parents:
7475
diff
changeset
|
813 # if HAVE_LONG_LONG_INT |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
814 if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
815 tmp_length = |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
816 (unsigned int) (sizeof (unsigned long long) * CHAR_BIT |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
817 * 0.30103 /* binary -> decimal */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
818 ) |
6583
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
819 + 1; /* turn floor into ceil */ |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
820 else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
821 # endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
822 if (type == TYPE_LONGINT || type == TYPE_ULONGINT) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
823 tmp_length = |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
824 (unsigned int) (sizeof (unsigned long) * CHAR_BIT |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
825 * 0.30103 /* binary -> decimal */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
826 ) |
6583
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
827 + 1; /* turn floor into ceil */ |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
828 else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
829 tmp_length = |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
830 (unsigned int) (sizeof (unsigned int) * CHAR_BIT |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
831 * 0.30103 /* binary -> decimal */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
832 ) |
6583
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
833 + 1; /* turn floor into ceil */ |
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
834 if (tmp_length < precision) |
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
835 tmp_length = precision; |
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
836 /* Multiply by 2, as an estimate for FLAG_GROUP. */ |
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
837 tmp_length = xsum (tmp_length, tmp_length); |
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
838 /* Add 1, to account for a leading sign. */ |
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
839 tmp_length = xsum (tmp_length, 1); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
840 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
841 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
842 case 'o': |
8051
9c2b0396b27c
Stylistic change: Use '#if HAVE_*' instead of '#ifdef HAVE_*'.
Bruno Haible <bruno@clisp.org>
parents:
7475
diff
changeset
|
843 # if HAVE_LONG_LONG_INT |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
844 if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
845 tmp_length = |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
846 (unsigned int) (sizeof (unsigned long long) * CHAR_BIT |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
847 * 0.333334 /* binary -> octal */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
848 ) |
6583
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
849 + 1; /* turn floor into ceil */ |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
850 else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
851 # endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
852 if (type == TYPE_LONGINT || type == TYPE_ULONGINT) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
853 tmp_length = |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
854 (unsigned int) (sizeof (unsigned long) * CHAR_BIT |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
855 * 0.333334 /* binary -> octal */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
856 ) |
6583
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
857 + 1; /* turn floor into ceil */ |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
858 else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
859 tmp_length = |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
860 (unsigned int) (sizeof (unsigned int) * CHAR_BIT |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
861 * 0.333334 /* binary -> octal */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
862 ) |
6583
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
863 + 1; /* turn floor into ceil */ |
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
864 if (tmp_length < precision) |
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
865 tmp_length = precision; |
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
866 /* Add 1, to account for a leading sign. */ |
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
867 tmp_length = xsum (tmp_length, 1); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
868 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
869 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
870 case 'x': case 'X': |
8051
9c2b0396b27c
Stylistic change: Use '#if HAVE_*' instead of '#ifdef HAVE_*'.
Bruno Haible <bruno@clisp.org>
parents:
7475
diff
changeset
|
871 # if HAVE_LONG_LONG_INT |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
872 if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
873 tmp_length = |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
874 (unsigned int) (sizeof (unsigned long long) * CHAR_BIT |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
875 * 0.25 /* binary -> hexadecimal */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
876 ) |
6583
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
877 + 1; /* turn floor into ceil */ |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
878 else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
879 # endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
880 if (type == TYPE_LONGINT || type == TYPE_ULONGINT) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
881 tmp_length = |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
882 (unsigned int) (sizeof (unsigned long) * CHAR_BIT |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
883 * 0.25 /* binary -> hexadecimal */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
884 ) |
6583
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
885 + 1; /* turn floor into ceil */ |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
886 else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
887 tmp_length = |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
888 (unsigned int) (sizeof (unsigned int) * CHAR_BIT |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
889 * 0.25 /* binary -> hexadecimal */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
890 ) |
6583
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
891 + 1; /* turn floor into ceil */ |
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
892 if (tmp_length < precision) |
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
893 tmp_length = precision; |
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
894 /* Add 2, to account for a leading sign or alternate form. */ |
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
895 tmp_length = xsum (tmp_length, 2); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
896 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
897 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
898 case 'f': case 'F': |
8051
9c2b0396b27c
Stylistic change: Use '#if HAVE_*' instead of '#ifdef HAVE_*'.
Bruno Haible <bruno@clisp.org>
parents:
7475
diff
changeset
|
899 # if HAVE_LONG_DOUBLE |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
900 if (type == TYPE_LONGDOUBLE) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
901 tmp_length = |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
902 (unsigned int) (LDBL_MAX_EXP |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
903 * 0.30103 /* binary -> decimal */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
904 * 2 /* estimate for FLAG_GROUP */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
905 ) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
906 + 1 /* turn floor into ceil */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
907 + 10; /* sign, decimal point etc. */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
908 else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
909 # endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
910 tmp_length = |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
911 (unsigned int) (DBL_MAX_EXP |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
912 * 0.30103 /* binary -> decimal */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
913 * 2 /* estimate for FLAG_GROUP */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
914 ) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
915 + 1 /* turn floor into ceil */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
916 + 10; /* sign, decimal point etc. */ |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
917 tmp_length = xsum (tmp_length, precision); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
918 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
919 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
920 case 'e': case 'E': case 'g': case 'G': |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
921 tmp_length = |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
922 12; /* sign, decimal point, exponent etc. */ |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
923 tmp_length = xsum (tmp_length, precision); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
924 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
925 |
8254
bbea39ab5a58
Fix estimate of size needed for a 'a' or 'A' conversion.
Bruno Haible <bruno@clisp.org>
parents:
8051
diff
changeset
|
926 case 'a': case 'A': |
bbea39ab5a58
Fix estimate of size needed for a 'a' or 'A' conversion.
Bruno Haible <bruno@clisp.org>
parents:
8051
diff
changeset
|
927 # if HAVE_LONG_DOUBLE |
bbea39ab5a58
Fix estimate of size needed for a 'a' or 'A' conversion.
Bruno Haible <bruno@clisp.org>
parents:
8051
diff
changeset
|
928 if (type == TYPE_LONGDOUBLE) |
bbea39ab5a58
Fix estimate of size needed for a 'a' or 'A' conversion.
Bruno Haible <bruno@clisp.org>
parents:
8051
diff
changeset
|
929 tmp_length = |
bbea39ab5a58
Fix estimate of size needed for a 'a' or 'A' conversion.
Bruno Haible <bruno@clisp.org>
parents:
8051
diff
changeset
|
930 (unsigned int) (LDBL_DIG |
bbea39ab5a58
Fix estimate of size needed for a 'a' or 'A' conversion.
Bruno Haible <bruno@clisp.org>
parents:
8051
diff
changeset
|
931 * 0.831 /* decimal -> hexadecimal */ |
bbea39ab5a58
Fix estimate of size needed for a 'a' or 'A' conversion.
Bruno Haible <bruno@clisp.org>
parents:
8051
diff
changeset
|
932 ) |
bbea39ab5a58
Fix estimate of size needed for a 'a' or 'A' conversion.
Bruno Haible <bruno@clisp.org>
parents:
8051
diff
changeset
|
933 + 1; /* turn floor into ceil */ |
bbea39ab5a58
Fix estimate of size needed for a 'a' or 'A' conversion.
Bruno Haible <bruno@clisp.org>
parents:
8051
diff
changeset
|
934 else |
bbea39ab5a58
Fix estimate of size needed for a 'a' or 'A' conversion.
Bruno Haible <bruno@clisp.org>
parents:
8051
diff
changeset
|
935 # endif |
bbea39ab5a58
Fix estimate of size needed for a 'a' or 'A' conversion.
Bruno Haible <bruno@clisp.org>
parents:
8051
diff
changeset
|
936 tmp_length = |
bbea39ab5a58
Fix estimate of size needed for a 'a' or 'A' conversion.
Bruno Haible <bruno@clisp.org>
parents:
8051
diff
changeset
|
937 (unsigned int) (DBL_DIG |
bbea39ab5a58
Fix estimate of size needed for a 'a' or 'A' conversion.
Bruno Haible <bruno@clisp.org>
parents:
8051
diff
changeset
|
938 * 0.831 /* decimal -> hexadecimal */ |
bbea39ab5a58
Fix estimate of size needed for a 'a' or 'A' conversion.
Bruno Haible <bruno@clisp.org>
parents:
8051
diff
changeset
|
939 ) |
bbea39ab5a58
Fix estimate of size needed for a 'a' or 'A' conversion.
Bruno Haible <bruno@clisp.org>
parents:
8051
diff
changeset
|
940 + 1; /* turn floor into ceil */ |
bbea39ab5a58
Fix estimate of size needed for a 'a' or 'A' conversion.
Bruno Haible <bruno@clisp.org>
parents:
8051
diff
changeset
|
941 if (tmp_length < precision) |
bbea39ab5a58
Fix estimate of size needed for a 'a' or 'A' conversion.
Bruno Haible <bruno@clisp.org>
parents:
8051
diff
changeset
|
942 tmp_length = precision; |
bbea39ab5a58
Fix estimate of size needed for a 'a' or 'A' conversion.
Bruno Haible <bruno@clisp.org>
parents:
8051
diff
changeset
|
943 /* Account for sign, decimal point etc. */ |
bbea39ab5a58
Fix estimate of size needed for a 'a' or 'A' conversion.
Bruno Haible <bruno@clisp.org>
parents:
8051
diff
changeset
|
944 tmp_length = xsum (tmp_length, 12); |
bbea39ab5a58
Fix estimate of size needed for a 'a' or 'A' conversion.
Bruno Haible <bruno@clisp.org>
parents:
8051
diff
changeset
|
945 break; |
bbea39ab5a58
Fix estimate of size needed for a 'a' or 'A' conversion.
Bruno Haible <bruno@clisp.org>
parents:
8051
diff
changeset
|
946 |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
947 case 'c': |
8051
9c2b0396b27c
Stylistic change: Use '#if HAVE_*' instead of '#ifdef HAVE_*'.
Bruno Haible <bruno@clisp.org>
parents:
7475
diff
changeset
|
948 # if HAVE_WINT_T && !WIDE_CHAR_VERSION |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
949 if (type == TYPE_WIDE_CHAR) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
950 tmp_length = MB_CUR_MAX; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
951 else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
952 # endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
953 tmp_length = 1; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
954 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
955 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
956 case 's': |
8051
9c2b0396b27c
Stylistic change: Use '#if HAVE_*' instead of '#ifdef HAVE_*'.
Bruno Haible <bruno@clisp.org>
parents:
7475
diff
changeset
|
957 # if HAVE_WCHAR_T |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
958 if (type == TYPE_WIDE_STRING) |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
959 { |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
960 tmp_length = |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
961 local_wcslen (a.arg[dp->arg_index].a.a_wide_string); |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
962 |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
963 # if !WIDE_CHAR_VERSION |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
964 tmp_length = xtimes (tmp_length, MB_CUR_MAX); |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
965 # endif |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
966 } |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
967 else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
968 # endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
969 tmp_length = strlen (a.arg[dp->arg_index].a.a_string); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
970 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
971 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
972 case 'p': |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
973 tmp_length = |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
974 (unsigned int) (sizeof (void *) * CHAR_BIT |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
975 * 0.25 /* binary -> hexadecimal */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
976 ) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
977 + 1 /* turn floor into ceil */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
978 + 2; /* account for leading 0x */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
979 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
980 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
981 default: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
982 abort (); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
983 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
984 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
985 if (tmp_length < width) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
986 tmp_length = width; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
987 |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
988 tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */ |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
989 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
990 |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
991 if (tmp_length <= sizeof (tmpbuf) / sizeof (CHAR_T)) |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
992 tmp = tmpbuf; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
993 else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
994 { |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
995 size_t tmp_memsize = xtimes (tmp_length, sizeof (CHAR_T)); |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
996 |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
997 if (size_overflow_p (tmp_memsize)) |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
998 /* Overflow, would lead to out of memory. */ |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
999 goto out_of_memory; |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
1000 tmp = (CHAR_T *) malloc (tmp_memsize); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1001 if (tmp == NULL) |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
1002 /* Out of memory. */ |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
1003 goto out_of_memory; |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1004 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1005 #endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1006 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1007 /* Construct the format string for calling snprintf or |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1008 sprintf. */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1009 p = buf; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1010 *p++ = '%'; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1011 if (dp->flags & FLAG_GROUP) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1012 *p++ = '\''; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1013 if (dp->flags & FLAG_LEFT) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1014 *p++ = '-'; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1015 if (dp->flags & FLAG_SHOWSIGN) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1016 *p++ = '+'; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1017 if (dp->flags & FLAG_SPACE) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1018 *p++ = ' '; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1019 if (dp->flags & FLAG_ALT) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1020 *p++ = '#'; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1021 if (dp->flags & FLAG_ZERO) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1022 *p++ = '0'; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1023 if (dp->width_start != dp->width_end) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1024 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1025 size_t n = dp->width_end - dp->width_start; |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1026 memcpy (p, dp->width_start, n * sizeof (CHAR_T)); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1027 p += n; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1028 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1029 if (dp->precision_start != dp->precision_end) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1030 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1031 size_t n = dp->precision_end - dp->precision_start; |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1032 memcpy (p, dp->precision_start, n * sizeof (CHAR_T)); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1033 p += n; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1034 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1035 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1036 switch (type) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1037 { |
8051
9c2b0396b27c
Stylistic change: Use '#if HAVE_*' instead of '#ifdef HAVE_*'.
Bruno Haible <bruno@clisp.org>
parents:
7475
diff
changeset
|
1038 #if HAVE_LONG_LONG_INT |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1039 case TYPE_LONGLONGINT: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1040 case TYPE_ULONGLONGINT: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1041 *p++ = 'l'; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1042 /*FALLTHROUGH*/ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1043 #endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1044 case TYPE_LONGINT: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1045 case TYPE_ULONGINT: |
8051
9c2b0396b27c
Stylistic change: Use '#if HAVE_*' instead of '#ifdef HAVE_*'.
Bruno Haible <bruno@clisp.org>
parents:
7475
diff
changeset
|
1046 #if HAVE_WINT_T |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1047 case TYPE_WIDE_CHAR: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1048 #endif |
8051
9c2b0396b27c
Stylistic change: Use '#if HAVE_*' instead of '#ifdef HAVE_*'.
Bruno Haible <bruno@clisp.org>
parents:
7475
diff
changeset
|
1049 #if HAVE_WCHAR_T |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1050 case TYPE_WIDE_STRING: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1051 #endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1052 *p++ = 'l'; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1053 break; |
8051
9c2b0396b27c
Stylistic change: Use '#if HAVE_*' instead of '#ifdef HAVE_*'.
Bruno Haible <bruno@clisp.org>
parents:
7475
diff
changeset
|
1054 #if HAVE_LONG_DOUBLE |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1055 case TYPE_LONGDOUBLE: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1056 *p++ = 'L'; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1057 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1058 #endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1059 default: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1060 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1061 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1062 *p = dp->conversion; |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1063 #if USE_SNPRINTF |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1064 p[1] = '%'; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1065 p[2] = 'n'; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1066 p[3] = '\0'; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1067 #else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1068 p[1] = '\0'; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1069 #endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1070 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1071 /* Construct the arguments for calling snprintf or sprintf. */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1072 prefix_count = 0; |
4886
e4317f1f2e2c
Use size_t instead of ssize_t.
Bruno Haible <bruno@clisp.org>
parents:
4879
diff
changeset
|
1073 if (dp->width_arg_index != ARG_NONE) |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1074 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1075 if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1076 abort (); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1077 prefixes[prefix_count++] = a.arg[dp->width_arg_index].a.a_int; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1078 } |
4886
e4317f1f2e2c
Use size_t instead of ssize_t.
Bruno Haible <bruno@clisp.org>
parents:
4879
diff
changeset
|
1079 if (dp->precision_arg_index != ARG_NONE) |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1080 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1081 if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1082 abort (); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1083 prefixes[prefix_count++] = a.arg[dp->precision_arg_index].a.a_int; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1084 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1085 |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1086 #if USE_SNPRINTF |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1087 /* Prepare checking whether snprintf returns the count |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1088 via %n. */ |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
1089 ENSURE_ALLOCATION (xsum (length, 1)); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1090 result[length] = '\0'; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1091 #endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1092 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1093 for (;;) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1094 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1095 size_t maxlen; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1096 int count; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1097 int retcount; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1098 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1099 maxlen = allocated - length; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1100 count = -1; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1101 retcount = 0; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1102 |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1103 #if USE_SNPRINTF |
4704 | 1104 # define SNPRINTF_BUF(arg) \ |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1105 switch (prefix_count) \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1106 { \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1107 case 0: \ |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1108 retcount = SNPRINTF (result + length, maxlen, buf, \ |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1109 arg, &count); \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1110 break; \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1111 case 1: \ |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1112 retcount = SNPRINTF (result + length, maxlen, buf, \ |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1113 prefixes[0], arg, &count); \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1114 break; \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1115 case 2: \ |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1116 retcount = SNPRINTF (result + length, maxlen, buf, \ |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1117 prefixes[0], prefixes[1], arg, \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1118 &count); \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1119 break; \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1120 default: \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1121 abort (); \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1122 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1123 #else |
4704 | 1124 # define SNPRINTF_BUF(arg) \ |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1125 switch (prefix_count) \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1126 { \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1127 case 0: \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1128 count = sprintf (tmp, buf, arg); \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1129 break; \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1130 case 1: \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1131 count = sprintf (tmp, buf, prefixes[0], arg); \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1132 break; \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1133 case 2: \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1134 count = sprintf (tmp, buf, prefixes[0], prefixes[1],\ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1135 arg); \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1136 break; \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1137 default: \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1138 abort (); \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1139 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1140 #endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1141 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1142 switch (type) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1143 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1144 case TYPE_SCHAR: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1145 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1146 int arg = a.arg[dp->arg_index].a.a_schar; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1147 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1148 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1149 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1150 case TYPE_UCHAR: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1151 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1152 unsigned int arg = a.arg[dp->arg_index].a.a_uchar; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1153 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1154 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1155 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1156 case TYPE_SHORT: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1157 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1158 int arg = a.arg[dp->arg_index].a.a_short; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1159 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1160 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1161 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1162 case TYPE_USHORT: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1163 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1164 unsigned int arg = a.arg[dp->arg_index].a.a_ushort; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1165 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1166 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1167 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1168 case TYPE_INT: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1169 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1170 int arg = a.arg[dp->arg_index].a.a_int; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1171 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1172 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1173 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1174 case TYPE_UINT: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1175 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1176 unsigned int arg = a.arg[dp->arg_index].a.a_uint; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1177 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1178 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1179 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1180 case TYPE_LONGINT: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1181 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1182 long int arg = a.arg[dp->arg_index].a.a_longint; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1183 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1184 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1185 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1186 case TYPE_ULONGINT: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1187 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1188 unsigned long int arg = a.arg[dp->arg_index].a.a_ulongint; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1189 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1190 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1191 break; |
8051
9c2b0396b27c
Stylistic change: Use '#if HAVE_*' instead of '#ifdef HAVE_*'.
Bruno Haible <bruno@clisp.org>
parents:
7475
diff
changeset
|
1192 #if HAVE_LONG_LONG_INT |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1193 case TYPE_LONGLONGINT: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1194 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1195 long long int arg = a.arg[dp->arg_index].a.a_longlongint; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1196 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1197 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1198 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1199 case TYPE_ULONGLONGINT: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1200 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1201 unsigned long long int arg = a.arg[dp->arg_index].a.a_ulonglongint; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1202 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1203 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1204 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1205 #endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1206 case TYPE_DOUBLE: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1207 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1208 double arg = a.arg[dp->arg_index].a.a_double; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1209 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1210 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1211 break; |
8051
9c2b0396b27c
Stylistic change: Use '#if HAVE_*' instead of '#ifdef HAVE_*'.
Bruno Haible <bruno@clisp.org>
parents:
7475
diff
changeset
|
1212 #if HAVE_LONG_DOUBLE |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1213 case TYPE_LONGDOUBLE: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1214 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1215 long double arg = a.arg[dp->arg_index].a.a_longdouble; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1216 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1217 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1218 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1219 #endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1220 case TYPE_CHAR: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1221 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1222 int arg = a.arg[dp->arg_index].a.a_char; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1223 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1224 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1225 break; |
8051
9c2b0396b27c
Stylistic change: Use '#if HAVE_*' instead of '#ifdef HAVE_*'.
Bruno Haible <bruno@clisp.org>
parents:
7475
diff
changeset
|
1226 #if HAVE_WINT_T |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1227 case TYPE_WIDE_CHAR: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1228 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1229 wint_t arg = a.arg[dp->arg_index].a.a_wide_char; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1230 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1231 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1232 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1233 #endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1234 case TYPE_STRING: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1235 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1236 const char *arg = a.arg[dp->arg_index].a.a_string; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1237 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1238 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1239 break; |
8051
9c2b0396b27c
Stylistic change: Use '#if HAVE_*' instead of '#ifdef HAVE_*'.
Bruno Haible <bruno@clisp.org>
parents:
7475
diff
changeset
|
1240 #if HAVE_WCHAR_T |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1241 case TYPE_WIDE_STRING: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1242 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1243 const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1244 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1245 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1246 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1247 #endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1248 case TYPE_POINTER: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1249 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1250 void *arg = a.arg[dp->arg_index].a.a_pointer; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1251 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1252 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1253 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1254 default: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1255 abort (); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1256 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1257 |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1258 #if USE_SNPRINTF |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1259 /* Portability: Not all implementations of snprintf() |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1260 are ISO C 99 compliant. Determine the number of |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1261 bytes that snprintf() has produced or would have |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1262 produced. */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1263 if (count >= 0) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1264 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1265 /* Verify that snprintf() has NUL-terminated its |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1266 result. */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1267 if (count < maxlen && result[length + count] != '\0') |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1268 abort (); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1269 /* Portability hack. */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1270 if (retcount > count) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1271 count = retcount; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1272 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1273 else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1274 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1275 /* snprintf() doesn't understand the '%n' |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1276 directive. */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1277 if (p[1] != '\0') |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1278 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1279 /* Don't use the '%n' directive; instead, look |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1280 at the snprintf() return value. */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1281 p[1] = '\0'; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1282 continue; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1283 } |
4801
83746ec4d74a
Portability to HP-UX 10, found by Jim Meyering.
Bruno Haible <bruno@clisp.org>
parents:
4704
diff
changeset
|
1284 else |
83746ec4d74a
Portability to HP-UX 10, found by Jim Meyering.
Bruno Haible <bruno@clisp.org>
parents:
4704
diff
changeset
|
1285 { |
83746ec4d74a
Portability to HP-UX 10, found by Jim Meyering.
Bruno Haible <bruno@clisp.org>
parents:
4704
diff
changeset
|
1286 /* Look at the snprintf() return value. */ |
83746ec4d74a
Portability to HP-UX 10, found by Jim Meyering.
Bruno Haible <bruno@clisp.org>
parents:
4704
diff
changeset
|
1287 if (retcount < 0) |
83746ec4d74a
Portability to HP-UX 10, found by Jim Meyering.
Bruno Haible <bruno@clisp.org>
parents:
4704
diff
changeset
|
1288 { |
83746ec4d74a
Portability to HP-UX 10, found by Jim Meyering.
Bruno Haible <bruno@clisp.org>
parents:
4704
diff
changeset
|
1289 /* HP-UX 10.20 snprintf() is doubly deficient: |
83746ec4d74a
Portability to HP-UX 10, found by Jim Meyering.
Bruno Haible <bruno@clisp.org>
parents:
4704
diff
changeset
|
1290 It doesn't understand the '%n' directive, |
83746ec4d74a
Portability to HP-UX 10, found by Jim Meyering.
Bruno Haible <bruno@clisp.org>
parents:
4704
diff
changeset
|
1291 *and* it returns -1 (rather than the length |
83746ec4d74a
Portability to HP-UX 10, found by Jim Meyering.
Bruno Haible <bruno@clisp.org>
parents:
4704
diff
changeset
|
1292 that would have been required) when the |
83746ec4d74a
Portability to HP-UX 10, found by Jim Meyering.
Bruno Haible <bruno@clisp.org>
parents:
4704
diff
changeset
|
1293 buffer is too small. */ |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
1294 size_t bigger_need = |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
1295 xsum (xtimes (allocated, 2), 12); |
4801
83746ec4d74a
Portability to HP-UX 10, found by Jim Meyering.
Bruno Haible <bruno@clisp.org>
parents:
4704
diff
changeset
|
1296 ENSURE_ALLOCATION (bigger_need); |
83746ec4d74a
Portability to HP-UX 10, found by Jim Meyering.
Bruno Haible <bruno@clisp.org>
parents:
4704
diff
changeset
|
1297 continue; |
83746ec4d74a
Portability to HP-UX 10, found by Jim Meyering.
Bruno Haible <bruno@clisp.org>
parents:
4704
diff
changeset
|
1298 } |
83746ec4d74a
Portability to HP-UX 10, found by Jim Meyering.
Bruno Haible <bruno@clisp.org>
parents:
4704
diff
changeset
|
1299 else |
83746ec4d74a
Portability to HP-UX 10, found by Jim Meyering.
Bruno Haible <bruno@clisp.org>
parents:
4704
diff
changeset
|
1300 count = retcount; |
83746ec4d74a
Portability to HP-UX 10, found by Jim Meyering.
Bruno Haible <bruno@clisp.org>
parents:
4704
diff
changeset
|
1301 } |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1302 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1303 #endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1304 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1305 /* Attempt to handle failure. */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1306 if (count < 0) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1307 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1308 if (!(result == resultbuf || result == NULL)) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1309 free (result); |
4879
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
1310 if (buf_malloced != NULL) |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
1311 free (buf_malloced); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1312 CLEANUP (); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1313 errno = EINVAL; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1314 return NULL; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1315 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1316 |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1317 #if !USE_SNPRINTF |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1318 if (count >= tmp_length) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1319 /* tmp_length was incorrectly calculated - fix the |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1320 code above! */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1321 abort (); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1322 #endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1323 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1324 /* Make room for the result. */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1325 if (count >= maxlen) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1326 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1327 /* Need at least count bytes. But allocate |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1328 proportionally, to avoid looping eternally if |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1329 snprintf() reports a too small count. */ |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
1330 size_t n = |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
1331 xmax (xsum (length, count), xtimes (allocated, 2)); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1332 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1333 ENSURE_ALLOCATION (n); |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1334 #if USE_SNPRINTF |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1335 continue; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1336 #endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1337 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1338 |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1339 #if USE_SNPRINTF |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1340 /* The snprintf() result did fit. */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1341 #else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1342 /* Append the sprintf() result. */ |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1343 memcpy (result + length, tmp, count * sizeof (CHAR_T)); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1344 if (tmp != tmpbuf) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1345 free (tmp); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1346 #endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1347 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1348 length += count; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1349 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1350 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1351 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1352 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1353 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1354 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1355 /* Add the final NUL. */ |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
1356 ENSURE_ALLOCATION (xsum (length, 1)); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1357 result[length] = '\0'; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1358 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1359 if (result != resultbuf && length + 1 < allocated) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1360 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1361 /* Shrink the allocated memory if possible. */ |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1362 CHAR_T *memory; |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1363 |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1364 memory = (CHAR_T *) realloc (result, (length + 1) * sizeof (CHAR_T)); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1365 if (memory != NULL) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1366 result = memory; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1367 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1368 |
4879
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
1369 if (buf_malloced != NULL) |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
1370 free (buf_malloced); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1371 CLEANUP (); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1372 *lengthp = length; |
7218
0fd12ba5cfc6
Do the INT_MAX check only where size_t is converted to 'int'.
Bruno Haible <bruno@clisp.org>
parents:
6583
diff
changeset
|
1373 /* Note that we can produce a big string of a length > INT_MAX. POSIX |
0fd12ba5cfc6
Do the INT_MAX check only where size_t is converted to 'int'.
Bruno Haible <bruno@clisp.org>
parents:
6583
diff
changeset
|
1374 says that snprintf() fails with errno = EOVERFLOW in this case, but |
0fd12ba5cfc6
Do the INT_MAX check only where size_t is converted to 'int'.
Bruno Haible <bruno@clisp.org>
parents:
6583
diff
changeset
|
1375 that's only because snprintf() returns an 'int'. This function does |
0fd12ba5cfc6
Do the INT_MAX check only where size_t is converted to 'int'.
Bruno Haible <bruno@clisp.org>
parents:
6583
diff
changeset
|
1376 not have this limitation. */ |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1377 return result; |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
1378 |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
1379 out_of_memory: |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
1380 if (!(result == resultbuf || result == NULL)) |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
1381 free (result); |
4879
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
1382 if (buf_malloced != NULL) |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
1383 free (buf_malloced); |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
1384 out_of_memory_1: |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
1385 CLEANUP (); |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
1386 errno = ENOMEM; |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
1387 return NULL; |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1388 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1389 } |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1390 |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1391 #undef SNPRINTF |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1392 #undef USE_SNPRINTF |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1393 #undef PRINTF_PARSE |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1394 #undef DIRECTIVES |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1395 #undef DIRECTIVE |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1396 #undef CHAR_T |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1397 #undef VASNPRINTF |