mirror of
https://github.com/php/php-src.git
synced 2024-11-23 09:54:15 +08:00
- Add [v]slprintf to overcome the returnvalues issue of snprintf
This commit is contained in:
parent
3588f9eed6
commit
1345740fa5
@ -1161,6 +1161,34 @@ static void strx_printv(int *ccp, char *buf, size_t len, const char *format,
|
||||
}
|
||||
|
||||
|
||||
PHPAPI int ap_php_slprintf(char *buf, size_t len, const char *format,...)
|
||||
{
|
||||
int cc;
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, format);
|
||||
strx_printv(&cc, buf, len, format, ap);
|
||||
va_end(ap);
|
||||
if (cc >= len) {
|
||||
cc = len -1;
|
||||
buf[cc] = '\0';
|
||||
}
|
||||
return cc;
|
||||
}
|
||||
|
||||
|
||||
PHPAPI int ap_php_vslprintf(char *buf, size_t len, const char *format, va_list ap)
|
||||
{
|
||||
int cc;
|
||||
|
||||
strx_printv(&cc, buf, len, format, ap);
|
||||
if (cc >= len) {
|
||||
cc = len -1;
|
||||
buf[cc] = '\0';
|
||||
}
|
||||
return cc;
|
||||
}
|
||||
|
||||
PHPAPI int ap_php_snprintf(char *buf, size_t len, const char *format,...)
|
||||
{
|
||||
int cc;
|
||||
|
@ -21,7 +21,7 @@
|
||||
|
||||
/*
|
||||
|
||||
Comparing: sprintf, snprintf, spprintf
|
||||
Comparing: sprintf, snprintf, slprintf, spprintf
|
||||
|
||||
sprintf offers the ability to make a lot of failures since it does not know
|
||||
the size of the buffer it uses. Therefore usage of sprintf often
|
||||
@ -36,6 +36,11 @@ snprintf knows the buffers size and will not write behind it. But you will
|
||||
A bad thing is having a big maximum while in most cases you would
|
||||
only need a small buffer. If the size of the resulting string is
|
||||
longer or equal to the buffer size than the buffer is not terminated.
|
||||
The function also returns the number of chars not including the
|
||||
terminating \0 that were needed to fully comply to the print request.
|
||||
|
||||
slprintf same as snprintf with the difference that it actually returns the
|
||||
length printed not including the terminating \0.
|
||||
|
||||
spprintf is the dynamical version of snprintf. It allocates the buffer in size
|
||||
as needed and allows a maximum setting as snprintf (turn this feature
|
||||
@ -73,6 +78,8 @@ typedef enum {
|
||||
|
||||
|
||||
BEGIN_EXTERN_C()
|
||||
PHPAPI int ap_php_slprintf(char *buf, size_t len, const char *format,...) PHP_ATTRIBUTE_FORMAT(printf, 3, 4);
|
||||
PHPAPI int ap_php_vslprintf(char *buf, size_t len, const char *format, va_list ap) PHP_ATTRIBUTE_FORMAT(printf, 3, 0);
|
||||
PHPAPI int ap_php_snprintf(char *, size_t, const char *, ...) PHP_ATTRIBUTE_FORMAT(printf, 3, 4);
|
||||
PHPAPI int ap_php_vsnprintf(char *, size_t, const char *, va_list ap) PHP_ATTRIBUTE_FORMAT(printf, 3, 0);
|
||||
PHPAPI int php_sprintf (char* s, const char* format, ...) PHP_ATTRIBUTE_FORMAT(printf, 2, 3);
|
||||
@ -82,6 +89,16 @@ PHPAPI char * php_conv_fp(register char format, register double num,
|
||||
|
||||
END_EXTERN_C()
|
||||
|
||||
#ifdef slprintf
|
||||
#undef slprintf
|
||||
#endif
|
||||
#define slprintf ap_php_slprintf
|
||||
|
||||
#ifdef vslprintf
|
||||
#undef vslprintf
|
||||
#endif
|
||||
#define vslprintf ap_php_vslprintf
|
||||
|
||||
#ifdef snprintf
|
||||
#undef snprintf
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user