Mercurial > hg > octave-kai > gnulib-hg
annotate lib/snprintf.c @ 5290:a32d2a4a925f
Fixes, mostly from Simon Josefsson.
author | Bruno Haible <bruno@clisp.org> |
---|---|
date | Fri, 01 Oct 2004 10:26:52 +0000 |
parents | 553713ba9dac |
children | 2b9cda789a2d |
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, |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
17 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ |
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 |
5290
a32d2a4a925f
Fixes, mostly from Simon Josefsson.
Bruno Haible <bruno@clisp.org>
parents:
5288
diff
changeset
|
23 /* Specification. */ |
5282
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
24 #include "snprintf.h" |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
25 |
5290
a32d2a4a925f
Fixes, mostly from Simon Josefsson.
Bruno Haible <bruno@clisp.org>
parents:
5288
diff
changeset
|
26 /* Get va_list, va_start, va_end. */ |
a32d2a4a925f
Fixes, mostly from Simon Josefsson.
Bruno Haible <bruno@clisp.org>
parents:
5288
diff
changeset
|
27 #include <stdarg.h> |
a32d2a4a925f
Fixes, mostly from Simon Josefsson.
Bruno Haible <bruno@clisp.org>
parents:
5288
diff
changeset
|
28 /* Get free. */ |
a32d2a4a925f
Fixes, mostly from Simon Josefsson.
Bruno Haible <bruno@clisp.org>
parents:
5288
diff
changeset
|
29 #include <stdlib.h> |
a32d2a4a925f
Fixes, mostly from Simon Josefsson.
Bruno Haible <bruno@clisp.org>
parents:
5288
diff
changeset
|
30 /* Get memcpy, size_t. */ |
5288 | 31 #include <string.h> |
32 | |
5282
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
33 /* Get vasnprintf. */ |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
34 #include "vasnprintf.h" |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
35 |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
36 /* Get MIN. */ |
5288 | 37 #include "minmax.h" |
5282
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
38 |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
39 /* 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
|
40 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
|
41 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
|
42 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
|
43 return a negative value. */ |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
44 int |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
45 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
|
46 { |
5290
a32d2a4a925f
Fixes, mostly from Simon Josefsson.
Bruno Haible <bruno@clisp.org>
parents:
5288
diff
changeset
|
47 char *output; |
5282
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
48 size_t len; |
5290
a32d2a4a925f
Fixes, mostly from Simon Josefsson.
Bruno Haible <bruno@clisp.org>
parents:
5288
diff
changeset
|
49 va_list args; |
5282
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
50 |
5290
a32d2a4a925f
Fixes, mostly from Simon Josefsson.
Bruno Haible <bruno@clisp.org>
parents:
5288
diff
changeset
|
51 va_start (args, format); |
a32d2a4a925f
Fixes, mostly from Simon Josefsson.
Bruno Haible <bruno@clisp.org>
parents:
5288
diff
changeset
|
52 output = vasnprintf (NULL, &len, format, args); |
a32d2a4a925f
Fixes, mostly from Simon Josefsson.
Bruno Haible <bruno@clisp.org>
parents:
5288
diff
changeset
|
53 va_end (args); |
a32d2a4a925f
Fixes, mostly from Simon Josefsson.
Bruno Haible <bruno@clisp.org>
parents:
5288
diff
changeset
|
54 |
a32d2a4a925f
Fixes, mostly from Simon Josefsson.
Bruno Haible <bruno@clisp.org>
parents:
5288
diff
changeset
|
55 if (!output) |
5282
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
56 return -1; |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
57 |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
58 if (str) |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
59 { |
5290
a32d2a4a925f
Fixes, mostly from Simon Josefsson.
Bruno Haible <bruno@clisp.org>
parents:
5288
diff
changeset
|
60 memcpy (str, output, MIN (len + 1, size)); |
5282
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
61 str[size - 1] = '\0'; |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
62 } |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
63 |
5290
a32d2a4a925f
Fixes, mostly from Simon Josefsson.
Bruno Haible <bruno@clisp.org>
parents:
5288
diff
changeset
|
64 free (output); |
5282
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
65 |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
66 return len; |
149d795beeb2
New snprintf module from Simon Josefsson.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
67 } |