FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
•
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
compat
msvcrt
snprintf.c
Go to the documentation of this file.
1
/*
2
* C99-compatible snprintf() and vsnprintf() implementations
3
* Copyright (c) 2012 Ronald S. Bultje <rsbultje@gmail.com>
4
*
5
* This file is part of FFmpeg.
6
*
7
* FFmpeg is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU Lesser General Public
9
* License as published by the Free Software Foundation; either
10
* version 2.1 of the License, or (at your option) any later version.
11
*
12
* FFmpeg is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
* Lesser General Public License for more details.
16
*
17
* You should have received a copy of the GNU Lesser General Public
18
* License along with FFmpeg; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
*/
21
22
#include <stdio.h>
23
#include <stdarg.h>
24
#include <limits.h>
25
#include <string.h>
26
27
#include "
compat/va_copy.h
"
28
#include "
libavutil/error.h
"
29
30
#if defined(__MINGW32__)
31
#define EOVERFLOW EFBIG
32
#endif
33
34
int
avpriv_snprintf
(
char
*
s
,
size_t
n
,
const
char
*
fmt
, ...)
35
{
36
va_list ap;
37
int
ret
;
38
39
va_start(ap, fmt);
40
ret =
avpriv_vsnprintf
(s, n, fmt, ap);
41
va_end(ap);
42
43
return
ret
;
44
}
45
46
int
avpriv_vsnprintf
(
char
*
s
,
size_t
n
,
const
char
*
fmt
,
47
va_list ap)
48
{
49
int
ret
;
50
va_list ap_copy;
51
52
if
(n == 0)
53
return
_vscprintf(fmt, ap);
54
else
if
(n > INT_MAX)
55
return
AVERROR
(EOVERFLOW);
56
57
/* we use n - 1 here because if the buffer is not big enough, the MS
58
* runtime libraries don't add a terminating zero at the end. MSDN
59
* recommends to provide _snprintf/_vsnprintf() a buffer size that
60
* is one less than the actual buffer, and zero it before calling
61
* _snprintf/_vsnprintf() to workaround this problem.
62
* See http://msdn.microsoft.com/en-us/library/1kt27hek(v=vs.80).aspx */
63
memset(s, 0, n);
64
va_copy(ap_copy, ap);
65
ret = _vsnprintf(s, n - 1, fmt, ap_copy);
66
va_end(ap_copy);
67
if
(ret == -1)
68
ret = _vscprintf(fmt, ap);
69
70
return
ret
;
71
}
Generated on Sun Mar 23 2014 23:49:49 for FFmpeg by
1.8.2