Mercurial > hg-old > index.cgi
comparison lib/vsnprintf.c @ 434:b8bf63962a99 3.0
Added various generated files for release
author | lost@l-w.ca |
---|---|
date | Fri, 29 Oct 2010 19:20:39 -0600 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
433:b142b473f0ee | 434:b8bf63962a99 |
---|---|
1 /* Formatted output to strings. | |
2 Copyright (C) 2004, 2006-2010 Free Software Foundation, Inc. | |
3 Written by Simon Josefsson and Yoann Vandoorselaere <yoann@prelude-ids.org>. | |
4 | |
5 This program is free software; you can redistribute it and/or modify | |
6 it under the terms of the GNU General Public License as published by | |
7 the Free Software Foundation; either version 3, or (at your option) | |
8 any later version. | |
9 | |
10 This program is distributed in the hope that it will be useful, | |
11 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 GNU General Public License for more details. | |
14 | |
15 You should have received a copy of the GNU General Public License along | |
16 with this program; if not, write to the Free Software Foundation, | |
17 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ | |
18 | |
19 #ifdef HAVE_CONFIG_H | |
20 # include <config.h> | |
21 #endif | |
22 | |
23 /* Specification. */ | |
24 #include <stdio.h> | |
25 | |
26 #include <errno.h> | |
27 #include <limits.h> | |
28 #include <stdarg.h> | |
29 #include <stdlib.h> | |
30 #include <string.h> | |
31 | |
32 #include "vasnprintf.h" | |
33 | |
34 /* Print formatted output to string STR. Similar to vsprintf, but | |
35 additional length SIZE limit how much is written into STR. Returns | |
36 string length of formatted string (which may be larger than SIZE). | |
37 STR may be NULL, in which case nothing will be written. On error, | |
38 return a negative value. */ | |
39 int | |
40 vsnprintf (char *str, size_t size, const char *format, va_list args) | |
41 { | |
42 char *output; | |
43 size_t len; | |
44 size_t lenbuf = size; | |
45 | |
46 output = vasnprintf (str, &lenbuf, format, args); | |
47 len = lenbuf; | |
48 | |
49 if (!output) | |
50 return -1; | |
51 | |
52 if (output != str) | |
53 { | |
54 if (size) | |
55 { | |
56 size_t pruned_len = (len < size ? len : size - 1); | |
57 memcpy (str, output, pruned_len); | |
58 str[pruned_len] = '\0'; | |
59 } | |
60 | |
61 free (output); | |
62 } | |
63 | |
64 if (len > INT_MAX) | |
65 { | |
66 errno = EOVERFLOW; | |
67 return -1; | |
68 } | |
69 | |
70 return len; | |
71 } |