[asterisk-commits] trunk - r7841 in /trunk: include/asterisk/stringfields.h utils.c

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Fri Jan 6 13:19:18 CST 2006


Author: kpfleming
Date: Fri Jan  6 13:19:17 2006
New Revision: 7841

URL: http://svn.digium.com/view/asterisk?rev=7841&view=rev
Log:
ensure that string field 'build' operation only evaluates arguments one time
fix some minor documentation errors
return proper type from string field space allocator

Modified:
    trunk/include/asterisk/stringfields.h
    trunk/utils.c

Modified: trunk/include/asterisk/stringfields.h
URL: http://svn.digium.com/view/asterisk/trunk/include/asterisk/stringfields.h?rev=7841&r1=7840&r2=7841&view=diff
==============================================================================
--- trunk/include/asterisk/stringfields.h (original)
+++ trunk/include/asterisk/stringfields.h Fri Jan  6 13:19:17 2006
@@ -143,8 +143,22 @@
   and the existing fields stored there will be updated to point
   into the new pool.
 */
-char *__ast_string_field_alloc_space(struct ast_string_field_pool *pool, size_t needed,
-				     ast_string_field *fields, int num_fields);
+ast_string_field __ast_string_field_alloc_space(struct ast_string_field_pool *pool, size_t needed,
+						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.
@@ -216,23 +230,18 @@
 	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 index Index position of the field within the structure
   \param fmt printf-style format string
   \param args Arguments for format string
   \return nothing
 */
-#define ast_string_field_index_build(x, index, fmt, args...) do { \
-	char s; \
-	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
+#define ast_string_field_index_build(x, index, fmt, args...) \
+	__ast_string_field_index_build(&x->__field_pool, &x->__begin_field[0], ast_string_field_count(x), index, fmt, args)
+
+/*!
+  \brief Set a field to a complex (built) value
   \param x Pointer to a structure containing fields
   \param field Name of the field to set
   \param fmt printf-style format string

Modified: trunk/utils.c
URL: http://svn.digium.com/view/asterisk/trunk/utils.c?rev=7841&r1=7840&r2=7841&view=diff
==============================================================================
--- trunk/utils.c (original)
+++ trunk/utils.c Fri Jan  6 13:19:17 2006
@@ -943,8 +943,8 @@
 	return pool->base ? 0 : -1;
 }
 
-char *__ast_string_field_alloc_space(struct ast_string_field_pool *pool, size_t needed,
-				     ast_string_field *fields, int num_fields)
+ast_string_field __ast_string_field_alloc_space(struct ast_string_field_pool *pool, size_t needed,
+						ast_string_field *fields, int num_fields)
 {
 	char *result = NULL;
 
@@ -974,3 +974,24 @@
 	pool->space -= needed;
 	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);
+}



More information about the asterisk-commits mailing list