mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-22 05:06:38 +00:00
add ast_build_string library function (from bug #3644)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@5684 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -185,6 +185,7 @@ extern char *ast_strcasestr(const char *, const char *);
|
|||||||
\param dst The destination buffer.
|
\param dst The destination buffer.
|
||||||
\param src The source string
|
\param src The source string
|
||||||
\param size The size of the destination buffer
|
\param size The size of the destination buffer
|
||||||
|
\return Nothing.
|
||||||
|
|
||||||
This is similar to \a strncpy, with two important differences:
|
This is similar to \a strncpy, with two important differences:
|
||||||
- the destination buffer will \b always be null-terminated
|
- the destination buffer will \b always be null-terminated
|
||||||
@@ -193,8 +194,20 @@ extern char *ast_strcasestr(const char *, const char *);
|
|||||||
not leave the destination buffer unterminated. There is no need to pass an artificially
|
not leave the destination buffer unterminated. There is no need to pass an artificially
|
||||||
reduced buffer size to this function (unlike \a strncpy), and the buffer does not need
|
reduced buffer size to this function (unlike \a strncpy), and the buffer does not need
|
||||||
to be initialized to zeroes prior to calling this function.
|
to be initialized to zeroes prior to calling this function.
|
||||||
No return value.
|
|
||||||
*/
|
*/
|
||||||
void ast_copy_string(char *dst, const char *src, size_t size);
|
void ast_copy_string(char *dst, const char *src, size_t size);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Build a string in a buffer, designed to be called repeatedly
|
||||||
|
|
||||||
|
This is a wrapper for snprintf, that properly handles the buffer pointer
|
||||||
|
and buffer space available.
|
||||||
|
|
||||||
|
\return 0 on success, non-zero on failure.
|
||||||
|
\param buffer current position in buffer to place string into (will be updated on return)
|
||||||
|
\param space remaining space in buffer (will be updated on return)
|
||||||
|
\param fmt printf-style format string
|
||||||
|
*/
|
||||||
|
int ast_build_string(char **buffer, size_t *space, const char *fmt, ...) __attribute__ ((format (printf, 3, 4)));
|
||||||
|
|
||||||
#endif /* _ASTERISK_UTILS_H */
|
#endif /* _ASTERISK_UTILS_H */
|
||||||
|
23
utils.c
23
utils.c
@@ -17,6 +17,7 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <stdarg.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
@@ -433,6 +434,28 @@ void ast_copy_string(char *dst, const char *src, size_t size)
|
|||||||
*dst = '\0';
|
*dst = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ast_build_string(char **buffer, size_t *space, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
int result;
|
||||||
|
|
||||||
|
if (!buffer || !*buffer || !space || !*space)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
result = vsnprintf(*buffer, *space, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
if (result < 0)
|
||||||
|
return -1;
|
||||||
|
else if (result > *space)
|
||||||
|
result = *space;
|
||||||
|
|
||||||
|
*buffer += result;
|
||||||
|
*space -= result;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Case-insensitive substring matching */
|
/* Case-insensitive substring matching */
|
||||||
#ifndef LINUX
|
#ifndef LINUX
|
||||||
static char *upper(const char *orig, char *buf, int bufsize)
|
static char *upper(const char *orig, char *buf, int bufsize)
|
||||||
|
Reference in New Issue
Block a user