diff options
Diffstat (limited to 'include/asterisk/stringfields.h')
-rw-r--r-- | include/asterisk/stringfields.h | 50 |
1 files changed, 33 insertions, 17 deletions
diff --git a/include/asterisk/stringfields.h b/include/asterisk/stringfields.h index 65f1b53f9..b0cda6902 100644 --- a/include/asterisk/stringfields.h +++ b/include/asterisk/stringfields.h @@ -135,12 +135,30 @@ struct ast_string_field_pool { pool, so the numbers here reflect just that. */ struct ast_string_field_mgr { - size_t size; /*!< the total size of the current pool */ - size_t used; /*!< the space used in the current pool */ + size_t size; /*!< the total size of the current pool */ + size_t used; /*!< the space used in the current pool */ + ast_string_field last_alloc; /*!< the last field allocated */ }; /*! \internal + \brief Attempt to 'grow' an already allocated field to a larger size + \param mgr Pointer to the pool manager structure + \param needed Amount of space needed for this field + \param ptr Pointer to a field within the structure + \return 0 on success, non-zero on failure + + This function will attempt to increase the amount of space allocated to + an existing field to the amount requested; this is only possible if the + field was the last field allocated from the current storage pool and + the pool has enough space available. If so, the additional space will be + allocated to this field and the field's address will not be changed. +*/ +int __ast_string_field_ptr_grow(struct ast_string_field_mgr *mgr, size_t needed, + const ast_string_field *ptr); + +/*! + \internal \brief Allocate space for a field \param mgr Pointer to the pool manager structure \param needed Amount of space needed for this field @@ -152,7 +170,7 @@ struct ast_string_field_mgr { an additional pool will be allocated. */ ast_string_field __ast_string_field_alloc_space(struct ast_string_field_mgr *mgr, - struct ast_string_field_pool **pool_head, size_t needed); + struct ast_string_field_pool **pool_head, size_t needed); /*! \internal @@ -164,8 +182,8 @@ ast_string_field __ast_string_field_alloc_space(struct ast_string_field_mgr *mgr \return nothing */ void __ast_string_field_ptr_build(struct ast_string_field_mgr *mgr, - struct ast_string_field_pool **pool_head, - const ast_string_field *ptr, const char *format, ...); + struct ast_string_field_pool **pool_head, + const ast_string_field *ptr, const char *format, ...); /*! \internal @@ -179,8 +197,8 @@ void __ast_string_field_ptr_build(struct ast_string_field_mgr *mgr, \return nothing */ void __ast_string_field_ptr_build_va(struct ast_string_field_mgr *mgr, - struct ast_string_field_pool **pool_head, - const ast_string_field *ptr, const char *format, va_list a1, va_list a2); + struct ast_string_field_pool **pool_head, + const ast_string_field *ptr, const char *format, va_list a1, va_list a2); /*! \brief Declare a string field @@ -233,17 +251,16 @@ int __ast_string_field_init(struct ast_string_field_mgr *mgr, \param data String value to be copied into the field \return nothing */ - #define ast_string_field_ptr_set(x, ptr, data) do { \ const char *__d__ = (data); \ - size_t __dlen__ = (__d__) ? strlen(__d__) : 0; \ - const char **__p__ = (const char **)(ptr); \ - if (__dlen__ == 0) \ + size_t __dlen__ = (__d__) ? strlen(__d__) + 1 : 1; \ + const char **__p__ = (const char **) (ptr); \ + if (__dlen__ == 1) \ *__p__ = __ast_string_field_empty; \ - else if (__dlen__ <= strlen(*__p__)) \ - strcpy((char *)*__p__, __d__); \ - else if ( (*__p__ = __ast_string_field_alloc_space(&(x)->__field_mgr, &(x)->__field_mgr_pool, __dlen__ + 1) ) ) \ - strcpy((char *)*__p__, __d__); \ + else if (!__ast_string_field_ptr_grow(&(x)->__field_mgr, __dlen__, ptr)) \ + memcpy((char *) *__p__, __d__, __dlen__); \ + else if ((*__p__ = __ast_string_field_alloc_space(&(x)->__field_mgr, &(x)->__field_mgr_pool, __dlen__))) \ + memcpy((char *) *__p__, __d__, __dlen__); \ } while (0) /*! @@ -253,11 +270,10 @@ int __ast_string_field_init(struct ast_string_field_mgr *mgr, \param data String value to be copied into the field \return nothing */ -#define ast_string_field_set(x, field, data) do { \ +#define ast_string_field_set(x, field, data) do { \ ast_string_field_ptr_set(x, &(x)->field, data); \ } while (0) - /*! \brief Set a field to a complex (built) value \param x Pointer to a structure containing fields |