ensure that string field 'build' operation only evaluates arguments one time

fix some minor documentation errors
return proper type from string field space allocator


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@7841 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Kevin P. Fleming
2006-01-06 19:19:17 +00:00
parent d44823b5b8
commit 1fe5108763
2 changed files with 43 additions and 13 deletions

View File

@@ -143,8 +143,22 @@ int __ast_string_field_init(struct ast_string_field_pool *pool, size_t size,
and the existing fields stored there will be updated to point and the existing fields stored there will be updated to point
into the new pool. into the new pool.
*/ */
char *__ast_string_field_alloc_space(struct ast_string_field_pool *pool, size_t needed, ast_string_field __ast_string_field_alloc_space(struct ast_string_field_pool *pool, size_t needed,
ast_string_field *fields, int num_fields); ast_string_field *fields, int num_fields);
/*!
\internal
\brief Set a field to a complex (built) value
\param pool Pointer to the pool structure
\param fields Pointer to the first entry of the field array
\param num_fields Number of fields in the array
\param index Index position of the field within the structure
\param format printf-style format string
\return nothing
*/
void __ast_string_field_index_build(struct ast_string_field_pool *pool,
ast_string_field *fields, int num_fields,
int index, const char *format, ...);
/*! /*!
The default amount of storage to be allocated for a field pool. The default amount of storage to be allocated for a field pool.
@@ -216,23 +230,18 @@ char *__ast_string_field_alloc_space(struct ast_string_field_pool *pool, size_t
ast_string_field_index_set(x, ast_string_field_index(x, field), data) ast_string_field_index_set(x, ast_string_field_index(x, field), data)
/*! /*!
\brief Set a field to a simple complex (built) value \brief Set a field to a complex (built) value
\param x Pointer to a structure containing fields \param x Pointer to a structure containing fields
\param index Index position of the field within the structure \param index Index position of the field within the structure
\param fmt printf-style format string \param fmt printf-style format string
\param args Arguments for format string \param args Arguments for format string
\return nothing \return nothing
*/ */
#define ast_string_field_index_build(x, index, fmt, args...) do { \ #define ast_string_field_index_build(x, index, fmt, args...) \
char s; \ __ast_string_field_index_build(&x->__field_pool, &x->__begin_field[0], ast_string_field_count(x), index, fmt, args)
size_t needed; \
needed = snprintf(&s, 1, fmt, args) + 1; \
if ((x->__begin_field[index] = __ast_string_field_alloc_space(&x->__field_pool, needed, &x->__begin_field[0], ast_string_field_count(x)))) \
sprintf((char *) x->__begin_field[index], fmt, args); \
} while (0)
/*! /*!
\brief Set a field to a simple complex (built) value \brief Set a field to a complex (built) value
\param x Pointer to a structure containing fields \param x Pointer to a structure containing fields
\param field Name of the field to set \param field Name of the field to set
\param fmt printf-style format string \param fmt printf-style format string

25
utils.c
View File

@@ -943,8 +943,8 @@ int __ast_string_field_init(struct ast_string_field_pool *pool, size_t size,
return pool->base ? 0 : -1; return pool->base ? 0 : -1;
} }
char *__ast_string_field_alloc_space(struct ast_string_field_pool *pool, size_t needed, ast_string_field __ast_string_field_alloc_space(struct ast_string_field_pool *pool, size_t needed,
ast_string_field *fields, int num_fields) ast_string_field *fields, int num_fields)
{ {
char *result = NULL; char *result = NULL;
@@ -974,3 +974,24 @@ char *__ast_string_field_alloc_space(struct ast_string_field_pool *pool, size_t
pool->space -= needed; pool->space -= needed;
return result; return result;
} }
void __ast_string_field_index_build(struct ast_string_field_pool *pool,
ast_string_field *fields, int num_fields,
int index, const char *format, ...)
{
char s;
size_t needed;
va_list ap1, ap2;
va_start(ap1, format);
va_copy(ap2, ap1);
needed = vsnprintf(&s, 1, format, ap1) + 1;
va_end(ap1);
if ((fields[index] = __ast_string_field_alloc_space(pool, needed, fields, num_fields)))
vsprintf((char *) fields[index], format, ap2);
va_end(ap2);
}