aboutsummaryrefslogtreecommitdiffstats
path: root/main
diff options
context:
space:
mode:
Diffstat (limited to 'main')
-rw-r--r--main/utils.c30
1 files changed, 28 insertions, 2 deletions
diff --git a/main/utils.c b/main/utils.c
index 74ecfaf57..8906eff11 100644
--- a/main/utils.c
+++ b/main/utils.c
@@ -1223,6 +1223,7 @@ static int add_string_pool(struct ast_string_field_mgr *mgr, size_t size)
mgr->size = size;
mgr->space = size;
mgr->used = 0;
+ mgr->last_alloc = NULL;
return 0;
}
@@ -1259,12 +1260,36 @@ ast_string_field __ast_string_field_alloc_space(struct ast_string_field_mgr *mgr
result = mgr->pool->base + mgr->used;
mgr->used += needed;
mgr->space -= needed;
+ mgr->last_alloc = result;
return result;
}
+int __ast_string_field_index_grow(struct ast_string_field_mgr *mgr, size_t needed,
+ ast_string_field *fields, int index)
+{
+ int grow = needed - (strlen(fields[index]) + 1);
+
+ if (grow <= 0) {
+ return 0;
+ }
+
+ if (fields[index] != mgr->last_alloc) {
+ return 1;
+ }
+
+ if (mgr->space < grow) {
+ return 1;
+ }
+
+ mgr->space -= grow;
+ mgr->used += grow;
+
+ return 0;
+}
+
void __ast_string_field_index_build_va(struct ast_string_field_mgr *mgr,
- ast_string_field *fields, int num_fields,
- int index, const char *format, va_list ap1, va_list ap2)
+ ast_string_field *fields, int num_fields,
+ int index, const char *format, va_list ap1, va_list ap2)
{
size_t needed;
@@ -1285,6 +1310,7 @@ void __ast_string_field_index_build_va(struct ast_string_field_mgr *mgr,
}
fields[index] = mgr->pool->base + mgr->used;
+ mgr->last_alloc = fields[index];
mgr->used += needed;
mgr->space -= needed;
}