Mercurial > hg > octave-lojdl > gnulib-hg
annotate lib/vasnprintf.c @ 8424:ec3450ce9889
Use the system's sprintf function.
author | Bruno Haible <bruno@clisp.org> |
---|---|
date | Sun, 11 Mar 2007 22:55:55 +0000 |
parents | ee40afd85f2c |
children | a33d54e4e24f |
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 |
8424
ec3450ce9889
Use the system's sprintf function.
Bruno Haible <bruno@clisp.org>
parents:
8417
diff
changeset
|
117 /* Here we need to call the native sprintf, not rpl_sprintf. */ |
ec3450ce9889
Use the system's sprintf function.
Bruno Haible <bruno@clisp.org>
parents:
8417
diff
changeset
|
118 #undef sprintf |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
119 |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
120 CHAR_T * |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
121 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
|
122 { |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
123 DIRECTIVES d; |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
124 arguments a; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
125 |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
126 if (PRINTF_PARSE (format, &d, &a) < 0) |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
127 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
128 errno = EINVAL; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
129 return NULL; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
130 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
131 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
132 #define CLEANUP() \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
133 free (d.dir); \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
134 if (a.arg) \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
135 free (a.arg); |
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 if (printf_fetchargs (args, &a) < 0) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
138 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
139 CLEANUP (); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
140 errno = EINVAL; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
141 return NULL; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
142 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
143 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
144 { |
4879
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
145 size_t buf_neededlength; |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
146 CHAR_T *buf; |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
147 CHAR_T *buf_malloced; |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
148 const CHAR_T *cp; |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
149 size_t i; |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
150 DIRECTIVE *dp; |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
151 /* Output string accumulator. */ |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
152 CHAR_T *result; |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
153 size_t allocated; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
154 size_t length; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
155 |
4879
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
156 /* 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
|
157 sprintf or snprintf. */ |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
158 buf_neededlength = |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
159 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
|
160 #if HAVE_ALLOCA |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
161 if (buf_neededlength < 4000 / sizeof (CHAR_T)) |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
162 { |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
163 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
|
164 buf_malloced = NULL; |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
165 } |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
166 else |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
167 #endif |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
168 { |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
169 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
|
170 if (size_overflow_p (buf_memsize)) |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
171 goto out_of_memory_1; |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
172 buf = (CHAR_T *) malloc (buf_memsize); |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
173 if (buf == NULL) |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
174 goto out_of_memory_1; |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
175 buf_malloced = buf; |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
176 } |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
177 |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
178 if (resultbuf != NULL) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
179 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
180 result = resultbuf; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
181 allocated = *lengthp; |
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 else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
184 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
185 result = NULL; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
186 allocated = 0; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
187 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
188 length = 0; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
189 /* Invariants: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
190 result is either == resultbuf or == NULL or malloc-allocated. |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
191 If length > 0, then result != NULL. */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
192 |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
193 /* 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
|
194 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
|
195 #define ENSURE_ALLOCATION(needed) \ |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
196 if ((needed) > allocated) \ |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
197 { \ |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
198 size_t memory_size; \ |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
199 CHAR_T *memory; \ |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
200 \ |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
201 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
|
202 if ((needed) > allocated) \ |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
203 allocated = (needed); \ |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
204 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
|
205 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
|
206 goto out_of_memory; \ |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
207 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
|
208 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
|
209 else \ |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
210 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
|
211 if (memory == NULL) \ |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
212 goto out_of_memory; \ |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
213 if (result == resultbuf && length > 0) \ |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
214 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
|
215 result = memory; \ |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
216 } |
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 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
|
219 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
220 if (cp != dp->dir_start) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
221 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
222 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
|
223 size_t augmented_length = xsum (length, n); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
224 |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
225 ENSURE_ALLOCATION (augmented_length); |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
226 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
|
227 length = augmented_length; |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
228 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
229 if (i == d.count) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
230 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
231 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
232 /* Execute a single directive. */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
233 if (dp->conversion == '%') |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
234 { |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
235 size_t augmented_length; |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
236 |
4886
e4317f1f2e2c
Use size_t instead of ssize_t.
Bruno Haible <bruno@clisp.org>
parents:
4879
diff
changeset
|
237 if (!(dp->arg_index == ARG_NONE)) |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
238 abort (); |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
239 augmented_length = xsum (length, 1); |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
240 ENSURE_ALLOCATION (augmented_length); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
241 result[length] = '%'; |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
242 length = augmented_length; |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
243 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
244 else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
245 { |
4886
e4317f1f2e2c
Use size_t instead of ssize_t.
Bruno Haible <bruno@clisp.org>
parents:
4879
diff
changeset
|
246 if (!(dp->arg_index != ARG_NONE)) |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
247 abort (); |
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 if (dp->conversion == 'n') |
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 switch (a.arg[dp->arg_index].type) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
252 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
253 case TYPE_COUNT_SCHAR_POINTER: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
254 *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
|
255 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
256 case TYPE_COUNT_SHORT_POINTER: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
257 *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
|
258 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
259 case TYPE_COUNT_INT_POINTER: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
260 *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
|
261 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
262 case TYPE_COUNT_LONGINT_POINTER: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
263 *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
|
264 break; |
8051
9c2b0396b27c
Stylistic change: Use '#if HAVE_*' instead of '#ifdef HAVE_*'.
Bruno Haible <bruno@clisp.org>
parents:
7475
diff
changeset
|
265 #if HAVE_LONG_LONG_INT |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
266 case TYPE_COUNT_LONGLONGINT_POINTER: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
267 *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
|
268 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
269 #endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
270 default: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
271 abort (); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
272 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
273 } |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
274 #if NEED_PRINTF_DIRECTIVE_A && !defined IN_LIBINTL |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
275 else if (dp->conversion == 'a' || dp->conversion == 'A') |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
276 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
277 arg_type type = a.arg[dp->arg_index].type; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
278 int flags = dp->flags; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
279 int has_width; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
280 size_t width; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
281 int has_precision; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
282 size_t precision; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
283 size_t tmp_length; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
284 CHAR_T tmpbuf[700]; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
285 CHAR_T *tmp; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
286 CHAR_T *pad_ptr; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
287 CHAR_T *p; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
288 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
289 has_width = 0; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
290 width = 0; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
291 if (dp->width_start != dp->width_end) |
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 if (dp->width_arg_index != ARG_NONE) |
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 int arg; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
296 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
297 if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
298 abort (); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
299 arg = a.arg[dp->width_arg_index].a.a_int; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
300 if (arg < 0) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
301 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
302 /* "A negative field width is taken as a '-' flag |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
303 followed by a positive field width." */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
304 flags |= FLAG_LEFT; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
305 width = (unsigned int) (-arg); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
306 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
307 else |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
308 width = arg; |
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 else |
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 const CHAR_T *digitp = dp->width_start; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
313 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
314 do |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
315 width = xsum (xtimes (width, 10), *digitp++ - '0'); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
316 while (digitp != dp->width_end); |
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 has_width = 1; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
319 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
320 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
321 has_precision = 0; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
322 precision = 0; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
323 if (dp->precision_start != dp->precision_end) |
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 if (dp->precision_arg_index != ARG_NONE) |
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 int arg; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
328 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
329 if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
330 abort (); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
331 arg = a.arg[dp->precision_arg_index].a.a_int; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
332 /* "A negative precision is taken as if the precision |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
333 were omitted." */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
334 if (arg >= 0) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
335 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
336 precision = arg; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
337 has_precision = 1; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
338 } |
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 else |
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 const CHAR_T *digitp = dp->precision_start + 1; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
343 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
344 precision = 0; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
345 while (digitp != dp->precision_end) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
346 precision = xsum (xtimes (precision, 10), *digitp++ - '0'); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
347 has_precision = 1; |
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 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
350 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
351 /* Allocate a temporary buffer of sufficient size. */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
352 # if HAVE_LONG_DOUBLE |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
353 if (type == TYPE_LONGDOUBLE) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
354 tmp_length = |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
355 (unsigned int) ((LDBL_DIG + 1) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
356 * 0.831 /* decimal -> hexadecimal */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
357 ) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
358 + 1; /* turn floor into ceil */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
359 else |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
360 # endif |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
361 tmp_length = |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
362 (unsigned int) ((DBL_DIG + 1) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
363 * 0.831 /* decimal -> hexadecimal */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
364 ) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
365 + 1; /* turn floor into ceil */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
366 if (tmp_length < precision) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
367 tmp_length = precision; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
368 /* Account for sign, decimal point etc. */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
369 tmp_length = xsum (tmp_length, 12); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
370 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
371 if (tmp_length < width) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
372 tmp_length = width; |
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 tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
375 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
376 if (tmp_length <= sizeof (tmpbuf) / sizeof (CHAR_T)) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
377 tmp = tmpbuf; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
378 else |
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 size_t tmp_memsize = xtimes (tmp_length, sizeof (CHAR_T)); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
381 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
382 if (size_overflow_p (tmp_memsize)) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
383 /* Overflow, would lead to out of memory. */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
384 goto out_of_memory; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
385 tmp = (CHAR_T *) malloc (tmp_memsize); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
386 if (tmp == NULL) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
387 /* Out of memory. */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
388 goto out_of_memory; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
389 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
390 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
391 pad_ptr = NULL; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
392 p = tmp; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
393 # if HAVE_LONG_DOUBLE |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
394 if (type == TYPE_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 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
|
397 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
398 if (isnanl (arg)) |
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 if (dp->conversion == 'A') |
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 *p++ = 'N'; *p++ = 'A'; *p++ = 'N'; |
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 else |
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 *p++ = 'n'; *p++ = 'a'; *p++ = 'n'; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
407 } |
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 else |
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 int sign = 0; |
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 if (arg < 0.0L) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
414 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
415 sign = -1; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
416 arg = -arg; |
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 else if (arg == 0.0L) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
419 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
420 /* Distinguish 0.0L and -0.0L. */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
421 static long double plus_zero = 0.0L; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
422 long double arg_mem = arg; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
423 if (memcmp (&plus_zero, &arg_mem, sizeof (long double)) != 0) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
424 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
425 sign = -1; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
426 arg = -arg; |
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 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
429 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
430 if (sign < 0) |
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_SHOWSIGN) |
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 else if (flags & FLAG_SPACE) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
435 *p++ = ' '; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
436 |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
437 if (arg > 0.0L && arg + arg == arg) |
8335
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 if (dp->conversion == 'A') |
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 *p++ = 'I'; *p++ = 'N'; *p++ = 'F'; |
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 else |
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 *p++ = 'i'; *p++ = 'n'; *p++ = 'f'; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
446 } |
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 else |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
449 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
450 int exponent; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
451 long double mantissa; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
452 |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
453 if (arg > 0.0L) |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
454 mantissa = printf_frexpl (arg, &exponent); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
455 else |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
456 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
457 exponent = 0; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
458 mantissa = 0.0L; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
459 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
460 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
461 if (has_precision |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
462 && precision < (unsigned int) ((LDBL_DIG + 1) * 0.831) + 1) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
463 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
464 /* Round the mantissa. */ |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
465 long double tail = mantissa; |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
466 size_t 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 for (q = precision; ; q--) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
469 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
470 int digit = (int) tail; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
471 tail -= digit; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
472 if (q == 0) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
473 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
474 if (digit & 1 ? tail >= 0.5L : tail > 0.5L) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
475 tail = 1 - tail; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
476 else |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
477 tail = - tail; |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
478 break; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
479 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
480 tail *= 16.0L; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
481 } |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
482 if (tail != 0.0L) |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
483 for (q = precision; q > 0; q--) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
484 tail *= 0.0625L; |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
485 mantissa += tail; |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
486 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
487 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
488 *p++ = '0'; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
489 *p++ = dp->conversion - 'A' + 'X'; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
490 pad_ptr = p; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
491 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
492 int digit; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
493 |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
494 digit = (int) mantissa; |
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
495 mantissa -= digit; |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
496 *p++ = '0' + digit; |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
497 if ((flags & FLAG_ALT) |
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
498 || mantissa > 0.0L || precision > 0) |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
499 { |
8400
655fca11a0e6
The decimal point must be locale dependent.
Bruno Haible <bruno@clisp.org>
parents:
8343
diff
changeset
|
500 const char *point = |
655fca11a0e6
The decimal point must be locale dependent.
Bruno Haible <bruno@clisp.org>
parents:
8343
diff
changeset
|
501 localeconv () -> decimal_point; |
655fca11a0e6
The decimal point must be locale dependent.
Bruno Haible <bruno@clisp.org>
parents:
8343
diff
changeset
|
502 /* 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
|
503 either '.' or ','. */ |
655fca11a0e6
The decimal point must be locale dependent.
Bruno Haible <bruno@clisp.org>
parents:
8343
diff
changeset
|
504 *p++ = (point[0] != '\0' ? point[0] : '.'); |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
505 /* This loop terminates because we assume |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
506 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
|
507 while (mantissa > 0.0L) |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
508 { |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
509 mantissa *= 16.0L; |
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
510 digit = (int) mantissa; |
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
511 mantissa -= digit; |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
512 *p++ = digit |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
513 + (digit < 10 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
514 ? '0' |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
515 : dp->conversion - 10); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
516 if (precision > 0) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
517 precision--; |
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 while (precision > 0) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
520 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
521 *p++ = '0'; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
522 precision--; |
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 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
525 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
526 *p++ = dp->conversion - 'A' + 'P'; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
527 # if WIDE_CHAR_VERSION |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
528 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
529 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
|
530 { '%', '+', 'd', '\0' }; |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
531 SNPRINTF (p, 6 + 1, decimal_format, exponent); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
532 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
533 # else |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
534 sprintf (p, "%+d", exponent); |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
535 # endif |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
536 while (*p != '\0') |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
537 p++; |
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 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
540 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
541 else |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
542 # endif |
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 double arg = a.arg[dp->arg_index].a.a_double; |
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 (isnan (arg)) |
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 if (dp->conversion == 'A') |
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 *p++ = 'N'; *p++ = 'A'; *p++ = 'N'; |
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 else |
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 *p++ = 'n'; *p++ = 'a'; *p++ = 'n'; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
555 } |
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 else |
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 int sign = 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 if (arg < 0.0) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
562 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
563 sign = -1; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
564 arg = -arg; |
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 else if (arg == 0.0) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
567 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
568 /* Distinguish 0.0 and -0.0. */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
569 static double plus_zero = 0.0; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
570 double arg_mem = arg; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
571 if (memcmp (&plus_zero, &arg_mem, sizeof (double)) != 0) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
572 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
573 sign = -1; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
574 arg = -arg; |
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 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
577 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
578 if (sign < 0) |
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_SHOWSIGN) |
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 else if (flags & FLAG_SPACE) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
583 *p++ = ' '; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
584 |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
585 if (arg > 0.0 && arg + arg == arg) |
8335
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 if (dp->conversion == 'A') |
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 *p++ = 'I'; *p++ = 'N'; *p++ = 'F'; |
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 else |
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 *p++ = 'i'; *p++ = 'n'; *p++ = 'f'; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
594 } |
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 else |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
597 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
598 int exponent; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
599 double mantissa; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
600 |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
601 if (arg > 0.0) |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
602 mantissa = printf_frexp (arg, &exponent); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
603 else |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
604 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
605 exponent = 0; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
606 mantissa = 0.0; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
607 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
608 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
609 if (has_precision |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
610 && precision < (unsigned int) ((DBL_DIG + 1) * 0.831) + 1) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
611 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
612 /* Round the mantissa. */ |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
613 double tail = mantissa; |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
614 size_t 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 for (q = precision; ; q--) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
617 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
618 int digit = (int) tail; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
619 tail -= digit; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
620 if (q == 0) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
621 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
622 if (digit & 1 ? tail >= 0.5 : tail > 0.5) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
623 tail = 1 - tail; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
624 else |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
625 tail = - tail; |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
626 break; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
627 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
628 tail *= 16.0; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
629 } |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
630 if (tail != 0.0) |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
631 for (q = precision; q > 0; q--) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
632 tail *= 0.0625; |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
633 mantissa += tail; |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
634 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
635 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
636 *p++ = '0'; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
637 *p++ = dp->conversion - 'A' + 'X'; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
638 pad_ptr = p; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
639 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
640 int digit; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
641 |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
642 digit = (int) mantissa; |
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
643 mantissa -= digit; |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
644 *p++ = '0' + digit; |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
645 if ((flags & FLAG_ALT) |
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
646 || mantissa > 0.0 || precision > 0) |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
647 { |
8400
655fca11a0e6
The decimal point must be locale dependent.
Bruno Haible <bruno@clisp.org>
parents:
8343
diff
changeset
|
648 const char *point = |
655fca11a0e6
The decimal point must be locale dependent.
Bruno Haible <bruno@clisp.org>
parents:
8343
diff
changeset
|
649 localeconv () -> decimal_point; |
655fca11a0e6
The decimal point must be locale dependent.
Bruno Haible <bruno@clisp.org>
parents:
8343
diff
changeset
|
650 /* 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
|
651 either '.' or ','. */ |
655fca11a0e6
The decimal point must be locale dependent.
Bruno Haible <bruno@clisp.org>
parents:
8343
diff
changeset
|
652 *p++ = (point[0] != '\0' ? point[0] : '.'); |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
653 /* This loop terminates because we assume |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
654 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
|
655 while (mantissa > 0.0) |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
656 { |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
657 mantissa *= 16.0; |
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
658 digit = (int) mantissa; |
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
659 mantissa -= digit; |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
660 *p++ = digit |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
661 + (digit < 10 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
662 ? '0' |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
663 : dp->conversion - 10); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
664 if (precision > 0) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
665 precision--; |
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 while (precision > 0) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
668 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
669 *p++ = '0'; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
670 precision--; |
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 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
673 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
674 *p++ = dp->conversion - 'A' + 'P'; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
675 # if WIDE_CHAR_VERSION |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
676 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
677 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
|
678 { '%', '+', 'd', '\0' }; |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
679 SNPRINTF (p, 6 + 1, decimal_format, exponent); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
680 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
681 # else |
8343
19a934efd02c
Oops, fix a couple of bugs in last commit.
Bruno Haible <bruno@clisp.org>
parents:
8335
diff
changeset
|
682 sprintf (p, "%+d", exponent); |
8335
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
683 # endif |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
684 while (*p != '\0') |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
685 p++; |
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 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
688 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
689 /* 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
|
690 zero padding insertion point being at pad_ptr. */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
691 if (has_width && p - tmp < width) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
692 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
693 size_t pad = width - (p - tmp); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
694 CHAR_T *end = p + pad; |
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 if (flags & FLAG_LEFT) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
697 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
698 /* Pad with spaces on the right. */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
699 for (; pad > 0; pad--) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
700 *p++ = ' '; |
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 else if ((flags & FLAG_ZERO) && pad_ptr != NULL) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
703 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
704 /* Pad with zeroes. */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
705 CHAR_T *q = end; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
706 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
707 while (p > pad_ptr) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
708 *--q = *--p; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
709 for (; pad > 0; pad--) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
710 *p++ = '0'; |
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 else |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
713 { |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
714 /* Pad with spaces on the left. */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
715 CHAR_T *q = end; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
716 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
717 while (p > tmp) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
718 *--q = *--p; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
719 for (; pad > 0; pad--) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
720 *p++ = ' '; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
721 } |
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 p = end; |
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 |
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 size_t count = p - tmp; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
728 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
729 if (count >= tmp_length) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
730 /* tmp_length was incorrectly calculated - fix the |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
731 code above! */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
732 abort (); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
733 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
734 /* Make room for the result. */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
735 if (count >= allocated - length) |
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 size_t n = xsum (length, count); |
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 ENSURE_ALLOCATION (n); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
740 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
741 |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
742 /* Append the result. */ |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
743 memcpy (result + length, tmp, count * sizeof (CHAR_T)); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
744 if (tmp != tmpbuf) |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
745 free (tmp); |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
746 length += count; |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
747 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
748 } |
2c9de3b6ba5b
New module 'vasnprintf-posix'.
Bruno Haible <bruno@clisp.org>
parents:
8254
diff
changeset
|
749 #endif |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
750 else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
751 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
752 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
|
753 CHAR_T *p; |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
754 unsigned int prefix_count; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
755 int prefixes[2]; |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
756 #if !USE_SNPRINTF |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
757 size_t tmp_length; |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
758 CHAR_T tmpbuf[700]; |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
759 CHAR_T *tmp; |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
760 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
761 /* Allocate a temporary buffer of sufficient size for calling |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
762 sprintf. */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
763 { |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
764 size_t width; |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
765 size_t precision; |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
766 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
767 width = 0; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
768 if (dp->width_start != dp->width_end) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
769 { |
4886
e4317f1f2e2c
Use size_t instead of ssize_t.
Bruno Haible <bruno@clisp.org>
parents:
4879
diff
changeset
|
770 if (dp->width_arg_index != ARG_NONE) |
4224
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 int arg; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
773 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
774 if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
775 abort (); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
776 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
|
777 width = (arg < 0 ? (unsigned int) (-arg) : arg); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
778 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
779 else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
780 { |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
781 const CHAR_T *digitp = dp->width_start; |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
782 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
783 do |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
784 width = xsum (xtimes (width, 10), *digitp++ - '0'); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
785 while (digitp != dp->width_end); |
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 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
788 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
789 precision = 6; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
790 if (dp->precision_start != dp->precision_end) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
791 { |
4886
e4317f1f2e2c
Use size_t instead of ssize_t.
Bruno Haible <bruno@clisp.org>
parents:
4879
diff
changeset
|
792 if (dp->precision_arg_index != ARG_NONE) |
4224
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 int arg; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
795 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
796 if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
797 abort (); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
798 arg = a.arg[dp->precision_arg_index].a.a_int; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
799 precision = (arg < 0 ? 0 : arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
800 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
801 else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
802 { |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
803 const CHAR_T *digitp = dp->precision_start + 1; |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
804 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
805 precision = 0; |
5066
a2cb70e482fc
Fix for format strings like "%2.f".
Bruno Haible <bruno@clisp.org>
parents:
4886
diff
changeset
|
806 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
|
807 precision = xsum (xtimes (precision, 10), *digitp++ - '0'); |
4224
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 } |
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 switch (dp->conversion) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
812 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
813 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
814 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
|
815 # if HAVE_LONG_LONG_INT |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
816 if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
817 tmp_length = |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
818 (unsigned int) (sizeof (unsigned long long) * CHAR_BIT |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
819 * 0.30103 /* binary -> decimal */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
820 ) |
6583
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
821 + 1; /* turn floor into ceil */ |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
822 else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
823 # endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
824 if (type == TYPE_LONGINT || type == TYPE_ULONGINT) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
825 tmp_length = |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
826 (unsigned int) (sizeof (unsigned long) * CHAR_BIT |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
827 * 0.30103 /* binary -> decimal */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
828 ) |
6583
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
829 + 1; /* turn floor into ceil */ |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
830 else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
831 tmp_length = |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
832 (unsigned int) (sizeof (unsigned int) * CHAR_BIT |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
833 * 0.30103 /* binary -> decimal */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
834 ) |
6583
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
835 + 1; /* turn floor into ceil */ |
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
836 if (tmp_length < precision) |
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
837 tmp_length = precision; |
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
838 /* 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
|
839 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
|
840 /* 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
|
841 tmp_length = xsum (tmp_length, 1); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
842 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
843 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
844 case 'o': |
8051
9c2b0396b27c
Stylistic change: Use '#if HAVE_*' instead of '#ifdef HAVE_*'.
Bruno Haible <bruno@clisp.org>
parents:
7475
diff
changeset
|
845 # if HAVE_LONG_LONG_INT |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
846 if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
847 tmp_length = |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
848 (unsigned int) (sizeof (unsigned long long) * CHAR_BIT |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
849 * 0.333334 /* binary -> octal */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
850 ) |
6583
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
851 + 1; /* turn floor into ceil */ |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
852 else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
853 # endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
854 if (type == TYPE_LONGINT || type == TYPE_ULONGINT) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
855 tmp_length = |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
856 (unsigned int) (sizeof (unsigned long) * CHAR_BIT |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
857 * 0.333334 /* binary -> octal */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
858 ) |
6583
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
859 + 1; /* turn floor into ceil */ |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
860 else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
861 tmp_length = |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
862 (unsigned int) (sizeof (unsigned int) * CHAR_BIT |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
863 * 0.333334 /* binary -> octal */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
864 ) |
6583
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
865 + 1; /* turn floor into ceil */ |
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
866 if (tmp_length < precision) |
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
867 tmp_length = precision; |
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
868 /* 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
|
869 tmp_length = xsum (tmp_length, 1); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
870 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
871 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
872 case 'x': case 'X': |
8051
9c2b0396b27c
Stylistic change: Use '#if HAVE_*' instead of '#ifdef HAVE_*'.
Bruno Haible <bruno@clisp.org>
parents:
7475
diff
changeset
|
873 # if HAVE_LONG_LONG_INT |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
874 if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
875 tmp_length = |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
876 (unsigned int) (sizeof (unsigned long long) * CHAR_BIT |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
877 * 0.25 /* binary -> hexadecimal */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
878 ) |
6583
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
879 + 1; /* turn floor into ceil */ |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
880 else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
881 # endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
882 if (type == TYPE_LONGINT || type == TYPE_ULONGINT) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
883 tmp_length = |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
884 (unsigned int) (sizeof (unsigned long) * CHAR_BIT |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
885 * 0.25 /* binary -> hexadecimal */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
886 ) |
6583
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
887 + 1; /* turn floor into ceil */ |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
888 else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
889 tmp_length = |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
890 (unsigned int) (sizeof (unsigned int) * CHAR_BIT |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
891 * 0.25 /* binary -> hexadecimal */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
892 ) |
6583
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
893 + 1; /* turn floor into ceil */ |
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
894 if (tmp_length < precision) |
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
895 tmp_length = precision; |
eb8d54cb67a4
Fix an incorrect estimation of the sprintf result size.
Bruno Haible <bruno@clisp.org>
parents:
5848
diff
changeset
|
896 /* 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
|
897 tmp_length = xsum (tmp_length, 2); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
898 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
899 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
900 case 'f': case 'F': |
8051
9c2b0396b27c
Stylistic change: Use '#if HAVE_*' instead of '#ifdef HAVE_*'.
Bruno Haible <bruno@clisp.org>
parents:
7475
diff
changeset
|
901 # if HAVE_LONG_DOUBLE |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
902 if (type == TYPE_LONGDOUBLE) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
903 tmp_length = |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
904 (unsigned int) (LDBL_MAX_EXP |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
905 * 0.30103 /* binary -> decimal */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
906 * 2 /* estimate for FLAG_GROUP */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
907 ) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
908 + 1 /* turn floor into ceil */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
909 + 10; /* sign, decimal point etc. */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
910 else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
911 # endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
912 tmp_length = |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
913 (unsigned int) (DBL_MAX_EXP |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
914 * 0.30103 /* binary -> decimal */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
915 * 2 /* estimate for FLAG_GROUP */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
916 ) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
917 + 1 /* turn floor into ceil */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
918 + 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
|
919 tmp_length = xsum (tmp_length, precision); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
920 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
921 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
922 case 'e': case 'E': case 'g': case 'G': |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
923 tmp_length = |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
924 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
|
925 tmp_length = xsum (tmp_length, precision); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
926 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
927 |
8254
bbea39ab5a58
Fix estimate of size needed for a 'a' or 'A' conversion.
Bruno Haible <bruno@clisp.org>
parents:
8051
diff
changeset
|
928 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
|
929 # 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
|
930 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
|
931 tmp_length = |
bbea39ab5a58
Fix estimate of size needed for a 'a' or 'A' conversion.
Bruno Haible <bruno@clisp.org>
parents:
8051
diff
changeset
|
932 (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
|
933 * 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
|
934 ) |
bbea39ab5a58
Fix estimate of size needed for a 'a' or 'A' conversion.
Bruno Haible <bruno@clisp.org>
parents:
8051
diff
changeset
|
935 + 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
|
936 else |
bbea39ab5a58
Fix estimate of size needed for a 'a' or 'A' conversion.
Bruno Haible <bruno@clisp.org>
parents:
8051
diff
changeset
|
937 # endif |
bbea39ab5a58
Fix estimate of size needed for a 'a' or 'A' conversion.
Bruno Haible <bruno@clisp.org>
parents:
8051
diff
changeset
|
938 tmp_length = |
bbea39ab5a58
Fix estimate of size needed for a 'a' or 'A' conversion.
Bruno Haible <bruno@clisp.org>
parents:
8051
diff
changeset
|
939 (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
|
940 * 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
|
941 ) |
bbea39ab5a58
Fix estimate of size needed for a 'a' or 'A' conversion.
Bruno Haible <bruno@clisp.org>
parents:
8051
diff
changeset
|
942 + 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
|
943 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
|
944 tmp_length = precision; |
bbea39ab5a58
Fix estimate of size needed for a 'a' or 'A' conversion.
Bruno Haible <bruno@clisp.org>
parents:
8051
diff
changeset
|
945 /* 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
|
946 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
|
947 break; |
bbea39ab5a58
Fix estimate of size needed for a 'a' or 'A' conversion.
Bruno Haible <bruno@clisp.org>
parents:
8051
diff
changeset
|
948 |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
949 case 'c': |
8051
9c2b0396b27c
Stylistic change: Use '#if HAVE_*' instead of '#ifdef HAVE_*'.
Bruno Haible <bruno@clisp.org>
parents:
7475
diff
changeset
|
950 # if HAVE_WINT_T && !WIDE_CHAR_VERSION |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
951 if (type == TYPE_WIDE_CHAR) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
952 tmp_length = MB_CUR_MAX; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
953 else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
954 # endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
955 tmp_length = 1; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
956 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
957 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
958 case 's': |
8051
9c2b0396b27c
Stylistic change: Use '#if HAVE_*' instead of '#ifdef HAVE_*'.
Bruno Haible <bruno@clisp.org>
parents:
7475
diff
changeset
|
959 # if HAVE_WCHAR_T |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
960 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
|
961 { |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
962 tmp_length = |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
963 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
|
964 |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
965 # if !WIDE_CHAR_VERSION |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
966 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
|
967 # endif |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
968 } |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
969 else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
970 # endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
971 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
|
972 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
973 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
974 case 'p': |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
975 tmp_length = |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
976 (unsigned int) (sizeof (void *) * CHAR_BIT |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
977 * 0.25 /* binary -> hexadecimal */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
978 ) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
979 + 1 /* turn floor into ceil */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
980 + 2; /* account for leading 0x */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
981 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
982 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
983 default: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
984 abort (); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
985 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
986 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
987 if (tmp_length < width) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
988 tmp_length = width; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
989 |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
990 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
|
991 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
992 |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
993 if (tmp_length <= sizeof (tmpbuf) / sizeof (CHAR_T)) |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
994 tmp = tmpbuf; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
995 else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
996 { |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
997 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
|
998 |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
999 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
|
1000 /* 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
|
1001 goto out_of_memory; |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
1002 tmp = (CHAR_T *) malloc (tmp_memsize); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1003 if (tmp == NULL) |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
1004 /* Out of memory. */ |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
1005 goto out_of_memory; |
4224
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 #endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1008 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1009 /* Construct the format string for calling snprintf or |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1010 sprintf. */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1011 p = buf; |
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_GROUP) |
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_LEFT) |
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_SHOWSIGN) |
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_SPACE) |
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_ALT) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1022 *p++ = '#'; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1023 if (dp->flags & FLAG_ZERO) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1024 *p++ = '0'; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1025 if (dp->width_start != dp->width_end) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1026 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1027 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
|
1028 memcpy (p, dp->width_start, n * sizeof (CHAR_T)); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1029 p += n; |
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 if (dp->precision_start != dp->precision_end) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1032 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1033 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
|
1034 memcpy (p, dp->precision_start, n * sizeof (CHAR_T)); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1035 p += n; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1036 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1037 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1038 switch (type) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1039 { |
8051
9c2b0396b27c
Stylistic change: Use '#if HAVE_*' instead of '#ifdef HAVE_*'.
Bruno Haible <bruno@clisp.org>
parents:
7475
diff
changeset
|
1040 #if HAVE_LONG_LONG_INT |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1041 case TYPE_LONGLONGINT: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1042 case TYPE_ULONGLONGINT: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1043 *p++ = 'l'; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1044 /*FALLTHROUGH*/ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1045 #endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1046 case TYPE_LONGINT: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1047 case TYPE_ULONGINT: |
8051
9c2b0396b27c
Stylistic change: Use '#if HAVE_*' instead of '#ifdef HAVE_*'.
Bruno Haible <bruno@clisp.org>
parents:
7475
diff
changeset
|
1048 #if HAVE_WINT_T |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1049 case TYPE_WIDE_CHAR: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1050 #endif |
8051
9c2b0396b27c
Stylistic change: Use '#if HAVE_*' instead of '#ifdef HAVE_*'.
Bruno Haible <bruno@clisp.org>
parents:
7475
diff
changeset
|
1051 #if HAVE_WCHAR_T |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1052 case TYPE_WIDE_STRING: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1053 #endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1054 *p++ = 'l'; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1055 break; |
8051
9c2b0396b27c
Stylistic change: Use '#if HAVE_*' instead of '#ifdef HAVE_*'.
Bruno Haible <bruno@clisp.org>
parents:
7475
diff
changeset
|
1056 #if HAVE_LONG_DOUBLE |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1057 case TYPE_LONGDOUBLE: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1058 *p++ = 'L'; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1059 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1060 #endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1061 default: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1062 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1063 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1064 *p = dp->conversion; |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1065 #if USE_SNPRINTF |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1066 p[1] = '%'; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1067 p[2] = 'n'; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1068 p[3] = '\0'; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1069 #else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1070 p[1] = '\0'; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1071 #endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1072 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1073 /* Construct the arguments for calling snprintf or sprintf. */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1074 prefix_count = 0; |
4886
e4317f1f2e2c
Use size_t instead of ssize_t.
Bruno Haible <bruno@clisp.org>
parents:
4879
diff
changeset
|
1075 if (dp->width_arg_index != ARG_NONE) |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1076 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1077 if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1078 abort (); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1079 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
|
1080 } |
4886
e4317f1f2e2c
Use size_t instead of ssize_t.
Bruno Haible <bruno@clisp.org>
parents:
4879
diff
changeset
|
1081 if (dp->precision_arg_index != ARG_NONE) |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1082 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1083 if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1084 abort (); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1085 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
|
1086 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1087 |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1088 #if USE_SNPRINTF |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1089 /* Prepare checking whether snprintf returns the count |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1090 via %n. */ |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
1091 ENSURE_ALLOCATION (xsum (length, 1)); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1092 result[length] = '\0'; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1093 #endif |
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 for (;;) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1096 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1097 size_t maxlen; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1098 int count; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1099 int retcount; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1100 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1101 maxlen = allocated - length; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1102 count = -1; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1103 retcount = 0; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1104 |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1105 #if USE_SNPRINTF |
4704 | 1106 # define SNPRINTF_BUF(arg) \ |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1107 switch (prefix_count) \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1108 { \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1109 case 0: \ |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1110 retcount = SNPRINTF (result + length, maxlen, buf, \ |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1111 arg, &count); \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1112 break; \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1113 case 1: \ |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1114 retcount = SNPRINTF (result + length, maxlen, buf, \ |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1115 prefixes[0], arg, &count); \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1116 break; \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1117 case 2: \ |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1118 retcount = SNPRINTF (result + length, maxlen, buf, \ |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1119 prefixes[0], prefixes[1], arg, \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1120 &count); \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1121 break; \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1122 default: \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1123 abort (); \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1124 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1125 #else |
4704 | 1126 # define SNPRINTF_BUF(arg) \ |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1127 switch (prefix_count) \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1128 { \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1129 case 0: \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1130 count = sprintf (tmp, buf, arg); \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1131 break; \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1132 case 1: \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1133 count = sprintf (tmp, buf, prefixes[0], arg); \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1134 break; \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1135 case 2: \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1136 count = sprintf (tmp, buf, prefixes[0], prefixes[1],\ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1137 arg); \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1138 break; \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1139 default: \ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1140 abort (); \ |
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 #endif |
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 switch (type) |
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 case TYPE_SCHAR: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1147 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1148 int arg = a.arg[dp->arg_index].a.a_schar; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1149 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1150 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1151 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1152 case TYPE_UCHAR: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1153 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1154 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
|
1155 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1156 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1157 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1158 case TYPE_SHORT: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1159 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1160 int arg = a.arg[dp->arg_index].a.a_short; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1161 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1162 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1163 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1164 case TYPE_USHORT: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1165 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1166 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
|
1167 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1168 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1169 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1170 case TYPE_INT: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1171 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1172 int arg = a.arg[dp->arg_index].a.a_int; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1173 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1174 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1175 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1176 case TYPE_UINT: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1177 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1178 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
|
1179 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1180 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1181 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1182 case TYPE_LONGINT: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1183 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1184 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
|
1185 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1186 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1187 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1188 case TYPE_ULONGINT: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1189 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1190 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
|
1191 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1192 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1193 break; |
8051
9c2b0396b27c
Stylistic change: Use '#if HAVE_*' instead of '#ifdef HAVE_*'.
Bruno Haible <bruno@clisp.org>
parents:
7475
diff
changeset
|
1194 #if HAVE_LONG_LONG_INT |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1195 case TYPE_LONGLONGINT: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1196 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1197 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
|
1198 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1199 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1200 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1201 case TYPE_ULONGLONGINT: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1202 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1203 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
|
1204 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1205 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1206 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1207 #endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1208 case TYPE_DOUBLE: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1209 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1210 double arg = a.arg[dp->arg_index].a.a_double; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1211 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1212 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1213 break; |
8051
9c2b0396b27c
Stylistic change: Use '#if HAVE_*' instead of '#ifdef HAVE_*'.
Bruno Haible <bruno@clisp.org>
parents:
7475
diff
changeset
|
1214 #if HAVE_LONG_DOUBLE |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1215 case TYPE_LONGDOUBLE: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1216 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1217 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
|
1218 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1219 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1220 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1221 #endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1222 case TYPE_CHAR: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1223 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1224 int arg = a.arg[dp->arg_index].a.a_char; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1225 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1226 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1227 break; |
8051
9c2b0396b27c
Stylistic change: Use '#if HAVE_*' instead of '#ifdef HAVE_*'.
Bruno Haible <bruno@clisp.org>
parents:
7475
diff
changeset
|
1228 #if HAVE_WINT_T |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1229 case TYPE_WIDE_CHAR: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1230 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1231 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
|
1232 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1233 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1234 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1235 #endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1236 case TYPE_STRING: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1237 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1238 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
|
1239 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1240 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1241 break; |
8051
9c2b0396b27c
Stylistic change: Use '#if HAVE_*' instead of '#ifdef HAVE_*'.
Bruno Haible <bruno@clisp.org>
parents:
7475
diff
changeset
|
1242 #if HAVE_WCHAR_T |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1243 case TYPE_WIDE_STRING: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1244 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1245 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
|
1246 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1247 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1248 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1249 #endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1250 case TYPE_POINTER: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1251 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1252 void *arg = a.arg[dp->arg_index].a.a_pointer; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1253 SNPRINTF_BUF (arg); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1254 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1255 break; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1256 default: |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1257 abort (); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1258 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1259 |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1260 #if USE_SNPRINTF |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1261 /* Portability: Not all implementations of snprintf() |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1262 are ISO C 99 compliant. Determine the number of |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1263 bytes that snprintf() has produced or would have |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1264 produced. */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1265 if (count >= 0) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1266 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1267 /* Verify that snprintf() has NUL-terminated its |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1268 result. */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1269 if (count < maxlen && result[length + count] != '\0') |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1270 abort (); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1271 /* Portability hack. */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1272 if (retcount > count) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1273 count = retcount; |
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 else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1276 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1277 /* snprintf() doesn't understand the '%n' |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1278 directive. */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1279 if (p[1] != '\0') |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1280 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1281 /* Don't use the '%n' directive; instead, look |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1282 at the snprintf() return value. */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1283 p[1] = '\0'; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1284 continue; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1285 } |
4801
83746ec4d74a
Portability to HP-UX 10, found by Jim Meyering.
Bruno Haible <bruno@clisp.org>
parents:
4704
diff
changeset
|
1286 else |
83746ec4d74a
Portability to HP-UX 10, found by Jim Meyering.
Bruno Haible <bruno@clisp.org>
parents:
4704
diff
changeset
|
1287 { |
83746ec4d74a
Portability to HP-UX 10, found by Jim Meyering.
Bruno Haible <bruno@clisp.org>
parents:
4704
diff
changeset
|
1288 /* 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
|
1289 if (retcount < 0) |
83746ec4d74a
Portability to HP-UX 10, found by Jim Meyering.
Bruno Haible <bruno@clisp.org>
parents:
4704
diff
changeset
|
1290 { |
83746ec4d74a
Portability to HP-UX 10, found by Jim Meyering.
Bruno Haible <bruno@clisp.org>
parents:
4704
diff
changeset
|
1291 /* 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
|
1292 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
|
1293 *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
|
1294 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
|
1295 buffer is too small. */ |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
1296 size_t bigger_need = |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
1297 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
|
1298 ENSURE_ALLOCATION (bigger_need); |
83746ec4d74a
Portability to HP-UX 10, found by Jim Meyering.
Bruno Haible <bruno@clisp.org>
parents:
4704
diff
changeset
|
1299 continue; |
83746ec4d74a
Portability to HP-UX 10, found by Jim Meyering.
Bruno Haible <bruno@clisp.org>
parents:
4704
diff
changeset
|
1300 } |
83746ec4d74a
Portability to HP-UX 10, found by Jim Meyering.
Bruno Haible <bruno@clisp.org>
parents:
4704
diff
changeset
|
1301 else |
83746ec4d74a
Portability to HP-UX 10, found by Jim Meyering.
Bruno Haible <bruno@clisp.org>
parents:
4704
diff
changeset
|
1302 count = retcount; |
83746ec4d74a
Portability to HP-UX 10, found by Jim Meyering.
Bruno Haible <bruno@clisp.org>
parents:
4704
diff
changeset
|
1303 } |
4224
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 #endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1306 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1307 /* Attempt to handle failure. */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1308 if (count < 0) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1309 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1310 if (!(result == resultbuf || result == NULL)) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1311 free (result); |
4879
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
1312 if (buf_malloced != NULL) |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
1313 free (buf_malloced); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1314 CLEANUP (); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1315 errno = EINVAL; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1316 return NULL; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1317 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1318 |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1319 #if !USE_SNPRINTF |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1320 if (count >= tmp_length) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1321 /* tmp_length was incorrectly calculated - fix the |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1322 code above! */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1323 abort (); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1324 #endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1325 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1326 /* Make room for the result. */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1327 if (count >= maxlen) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1328 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1329 /* Need at least count bytes. But allocate |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1330 proportionally, to avoid looping eternally if |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1331 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
|
1332 size_t n = |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
1333 xmax (xsum (length, count), xtimes (allocated, 2)); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1334 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1335 ENSURE_ALLOCATION (n); |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1336 #if USE_SNPRINTF |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1337 continue; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1338 #endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1339 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1340 |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1341 #if USE_SNPRINTF |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1342 /* The snprintf() result did fit. */ |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1343 #else |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1344 /* Append the sprintf() result. */ |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1345 memcpy (result + length, tmp, count * sizeof (CHAR_T)); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1346 if (tmp != tmpbuf) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1347 free (tmp); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1348 #endif |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1349 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1350 length += count; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1351 break; |
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 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1356 |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1357 /* Add the final NUL. */ |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
1358 ENSURE_ALLOCATION (xsum (length, 1)); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1359 result[length] = '\0'; |
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 if (result != resultbuf && length + 1 < allocated) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1362 { |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1363 /* 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
|
1364 CHAR_T *memory; |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1365 |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1366 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
|
1367 if (memory != NULL) |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1368 result = memory; |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1369 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1370 |
4879
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
1371 if (buf_malloced != NULL) |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
1372 free (buf_malloced); |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1373 CLEANUP (); |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1374 *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
|
1375 /* 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
|
1376 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
|
1377 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
|
1378 not have this limitation. */ |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1379 return result; |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
1380 |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
1381 out_of_memory: |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
1382 if (!(result == resultbuf || result == NULL)) |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
1383 free (result); |
4879
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
1384 if (buf_malloced != NULL) |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
1385 free (buf_malloced); |
9b96adbed643
Avoid alloca with too large size.
Bruno Haible <bruno@clisp.org>
parents:
4872
diff
changeset
|
1386 out_of_memory_1: |
4872
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
1387 CLEANUP (); |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
1388 errno = ENOMEM; |
c5afc99b8ce5
Use xsize.h to protect against memory size overflows.
Bruno Haible <bruno@clisp.org>
parents:
4871
diff
changeset
|
1389 return NULL; |
4224
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1390 } |
83eabea25586
New modules vasnprintf and vasprintf.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1391 } |
4871
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1392 |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1393 #undef SNPRINTF |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1394 #undef USE_SNPRINTF |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1395 #undef PRINTF_PARSE |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1396 #undef DIRECTIVES |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1397 #undef DIRECTIVE |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1398 #undef CHAR_T |
87df35000dab
Merge support for wide characters, from GNU gettext.
Bruno Haible <bruno@clisp.org>
parents:
4801
diff
changeset
|
1399 #undef VASNPRINTF |