100 #ifndef _ASTERISK_STRINGFIELDS_H
101 #define _ASTERISK_STRINGFIELDS_H
148 #if defined(__AST_DEBUG_MALLOC)
149 const char *owner_file;
150 const char *owner_func;
214 ast_string_field *ptr, const
char *format, va_list a1, va_list a2) __attribute__((format(printf, 4, 0)));
220 #define AST_STRING_FIELD(name) const ast_string_field name
235 #define AST_DECLARE_STRING_FIELDS(field_list) \
236 struct ast_string_field_pool *__field_mgr_pool; \
238 struct ast_string_field_mgr __field_mgr
249 #define ast_string_field_init(x, size) \
250 __ast_string_field_init(&(x)->__field_mgr, &(x)->__field_mgr_pool, size, __FILE__, __LINE__, __PRETTY_FUNCTION__)
253 #define ast_string_field_free_memory(x) \
254 __ast_string_field_init(&(x)->__field_mgr, &(x)->__field_mgr_pool, -1, __FILE__, __LINE__, __PRETTY_FUNCTION__)
261 int needed,
const char *file,
int lineno,
const char *func);
275 #define ast_calloc_with_stringfields(n, type, size) \
276 __ast_calloc_with_stringfields(n, sizeof(type), offsetof(type, __field_mgr), offsetof(type, __field_mgr_pool), \
277 size, __FILE__, __LINE__, __PRETTY_FUNCTION__)
284 size_t field_mgr_pool_offset,
size_t pool_size,
const char *file,
285 int lineno,
const char *func);
309 #define AST_STRING_FIELD_ALLOCATION(x) *((ast_string_field_allocation *) (x - __alignof__(ast_string_field_allocation)))
318 #define ast_string_field_ptr_set(x, ptr, data) do { \
319 const char *__d__ = (data); \
320 size_t __dlen__ = (__d__) ? strlen(__d__) + 1 : 1; \
321 ast_string_field *__p__ = (ast_string_field *) (ptr); \
322 ast_string_field target = *__p__; \
323 if (__dlen__ == 1) { \
324 __ast_string_field_release_active((x)->__field_mgr_pool, *__p__); \
325 *__p__ = __ast_string_field_empty; \
326 } else if ((__dlen__ <= AST_STRING_FIELD_ALLOCATION(*__p__)) || \
327 (!__ast_string_field_ptr_grow(&(x)->__field_mgr, &(x)->__field_mgr_pool, __dlen__, __p__)) || \
328 (target = __ast_string_field_alloc_space(&(x)->__field_mgr, &(x)->__field_mgr_pool, __dlen__))) { \
329 if (target != *__p__) { \
330 __ast_string_field_release_active((x)->__field_mgr_pool, *__p__); \
333 memcpy(* (void **) __p__, __d__, __dlen__); \
344 #define ast_string_field_set(x, field, data) do { \
345 ast_string_field_ptr_set(x, &(x)->field, data); \
356 #define ast_string_field_ptr_build(x, ptr, fmt, args...) \
357 __ast_string_field_ptr_build(&(x)->__field_mgr, &(x)->__field_mgr_pool, (ast_string_field *) ptr, fmt, args)
367 #define ast_string_field_build(x, field, fmt, args...) \
368 __ast_string_field_ptr_build(&(x)->__field_mgr, &(x)->__field_mgr_pool, (ast_string_field *) &(x)->field, fmt, args)
379 #define ast_string_field_ptr_build_va(x, ptr, fmt, args1, args2) \
380 __ast_string_field_ptr_build_va(&(x)->__field_mgr, &(x)->__field_mgr_pool, (ast_string_field *) ptr, fmt, args1, args2)
391 #define ast_string_field_build_va(x, field, fmt, args1, args2) \
392 __ast_string_field_ptr_build_va(&(x)->__field_mgr, &(x)->__field_mgr_pool, (ast_string_field *) &(x)->field, fmt, args1, args2)
void __ast_string_field_ptr_build(struct ast_string_field_mgr *mgr, struct ast_string_field_pool **pool_head, ast_string_field *ptr, const char *format,...)
uint16_t ast_string_field_allocation
struct ast_string_field_pool * embedded_pool
int __ast_string_field_ptr_grow(struct ast_string_field_mgr *mgr, struct ast_string_field_pool **pool_head, size_t needed, const ast_string_field *ptr)
void __ast_string_field_ptr_build_va(struct ast_string_field_mgr *mgr, struct ast_string_field_pool **pool_head, ast_string_field *ptr, const char *format, va_list a1, va_list a2)
void *attribute_malloc __ast_calloc_with_stringfields(unsigned int num_structs, size_t struct_size, size_t field_mgr_offset, size_t field_mgr_pool_offset, size_t pool_size, const char *file, int lineno, const char *func)
const char * __ast_string_field_empty
const char * ast_string_field
Inlinable API function macro.
void __ast_string_field_release_active(struct ast_string_field_pool *pool_head, const ast_string_field ptr)
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 * prev
int __ast_string_field_init(struct ast_string_field_mgr *mgr, struct ast_string_field_pool **pool_head, int needed, const char *file, int lineno, const char *func)
static snd_pcm_format_t format
ast_string_field last_alloc