Mercurial > hg > octave-kai > gnulib-hg
annotate lib/snprintf.c @ 6836:e2c19cb657e7
Tweak for FreeBSD.
author | Bruno Haible <bruno@clisp.org> |
---|---|
date | Sat, 17 Jun 2006 20:02:16 +0000 |
parents | a48fb0e98c8c |
children | 8f07495555ba |
rev | line source |
---|---|
5282
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
1 /* Formatted output to strings. |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
2 Copyright (C) 2004 Free Software Foundation, Inc. |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
3 Written by Simon Josefsson. |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
4 |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
5 This program is free software; you can redistribute it and/or modify |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
6 it under the terms of the GNU General Public License as published by |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
7 the Free Software Foundation; either version 2, or (at your option) |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
8 any later version. |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
9 |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
10 This program is distributed in the hope that it will be useful, |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
11 but WITHOUT ANY WARRANTY; without even the implied warranty of |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
13 GNU General Public License for more details. |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
14 |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
15 You should have received a copy of the GNU General Public License along |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
16 with this program; if not, write to the Free Software Foundation, |
5848
a48fb0e98c8c
*** empty log message ***
Paul Eggert <eggert@cs.ucla.edu>
parents:
5333
diff
changeset
|
17 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ |
5282
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
18 |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
19 #ifdef HAVE_CONFIG_H |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
20 # include <config.h> |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
21 #endif |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
22 |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
23 #include "snprintf.h" |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
24 |
5290
a32d2a4a925f
Fixes, mostly from Simon Josefsson.
Bruno Haible <bruno@clisp.org>
parents:
5288
diff
changeset
|
25 #include <stdarg.h> |
a32d2a4a925f
Fixes, mostly from Simon Josefsson.
Bruno Haible <bruno@clisp.org>
parents:
5288
diff
changeset
|
26 #include <stdlib.h> |
5288 | 27 #include <string.h> |
28 | |
5293
3e17fb121416
Remove comments as to why each header is needed.
Paul Eggert <eggert@cs.ucla.edu>
parents:
5291
diff
changeset
|
29 #include "minmax.h" |
5282
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
30 #include "vasnprintf.h" |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
31 |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
32 /* Print formatted output to string STR. Similar to sprintf, but |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
33 additional length SIZE limit how much is written into STR. Returns |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
34 string length of formatted string (which may be larger than SIZE). |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
35 STR may be NULL, in which case nothing will be written. On error, |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
36 return a negative value. */ |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
37 int |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
38 snprintf (char *str, size_t size, const char *format, ...) |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
39 { |
5290
a32d2a4a925f
Fixes, mostly from Simon Josefsson.
Bruno Haible <bruno@clisp.org>
parents:
5288
diff
changeset
|
40 char *output; |
5282
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
41 size_t len; |
5290
a32d2a4a925f
Fixes, mostly from Simon Josefsson.
Bruno Haible <bruno@clisp.org>
parents:
5288
diff
changeset
|
42 va_list args; |
5282
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
43 |
5290
a32d2a4a925f
Fixes, mostly from Simon Josefsson.
Bruno Haible <bruno@clisp.org>
parents:
5288
diff
changeset
|
44 va_start (args, format); |
5333
f038f3333cc8
Avoid a memory allocation when possible.
Bruno Haible <bruno@clisp.org>
parents:
5293
diff
changeset
|
45 len = size; |
f038f3333cc8
Avoid a memory allocation when possible.
Bruno Haible <bruno@clisp.org>
parents:
5293
diff
changeset
|
46 output = vasnprintf (str, &len, format, args); |
5290
a32d2a4a925f
Fixes, mostly from Simon Josefsson.
Bruno Haible <bruno@clisp.org>
parents:
5288
diff
changeset
|
47 va_end (args); |
a32d2a4a925f
Fixes, mostly from Simon Josefsson.
Bruno Haible <bruno@clisp.org>
parents:
5288
diff
changeset
|
48 |
a32d2a4a925f
Fixes, mostly from Simon Josefsson.
Bruno Haible <bruno@clisp.org>
parents:
5288
diff
changeset
|
49 if (!output) |
5282
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
50 return -1; |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
51 |
5333
f038f3333cc8
Avoid a memory allocation when possible.
Bruno Haible <bruno@clisp.org>
parents:
5293
diff
changeset
|
52 if (str != NULL) |
f038f3333cc8
Avoid a memory allocation when possible.
Bruno Haible <bruno@clisp.org>
parents:
5293
diff
changeset
|
53 if (len > size - 1) /* equivalent to: (size > 0 && len >= size) */ |
5282
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
54 str[size - 1] = '\0'; |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
55 |
5333
f038f3333cc8
Avoid a memory allocation when possible.
Bruno Haible <bruno@clisp.org>
parents:
5293
diff
changeset
|
56 if (output != str) |
f038f3333cc8
Avoid a memory allocation when possible.
Bruno Haible <bruno@clisp.org>
parents:
5293
diff
changeset
|
57 free (output); |
5282
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
58 |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
59 return len; |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
60 } |