diff options
author | rizzo <rizzo@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-11-28 14:07:09 +0000 |
---|---|---|
committer | rizzo <rizzo@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-11-28 14:07:09 +0000 |
commit | b24855a83315023c0493122d2130ca776d27decf (patch) | |
tree | 1641521d3383d73897fe9472ea7cbf1101f8070f /main/utils.c | |
parent | a522c1ce0f884efc647e74b86bd4fd6d9b6db1a8 (diff) |
some simplifications to
ast_dynamic_str_thread_build_va_couldnt_we_choose_a_shorter_name()
I am unsure whether the truncation of the string in case of a failed
attempt should be done unconditionally. See the XXX mark.
Russel, ideas ?
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@48084 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main/utils.c')
-rw-r--r-- | main/utils.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/main/utils.c b/main/utils.c index aa621704a..5d1855448 100644 --- a/main/utils.c +++ b/main/utils.c @@ -975,27 +975,29 @@ int ast_get_time_t(const char *src, time_t *dst, time_t _default, int *consumed) int ast_dynamic_str_thread_build_va(struct ast_dynamic_str **buf, size_t max_len, struct ast_threadstorage *ts, int append, const char *fmt, va_list ap) { - int res; + int res, need; int offset = (append && (*buf)->len) ? strlen((*buf)->str) : 0; res = vsnprintf((*buf)->str + offset, (*buf)->len - offset, fmt, ap); + need = res + offset + 1; /* Check to see if there was not enough space in the string buffer to prepare * the string. Also, if a maximum length is present, make sure the current * length is less than the maximum before increasing the size. */ - if ((res + offset + 1) > (*buf)->len && (max_len ? ((*buf)->len < max_len) : 1)) { + if (need > (*buf)->len && (max_len == 0 || (*buf)->len < max_len) ) { /* Set the new size of the string buffer to be the size needed * to hold the resulting string (res) plus one byte for the * terminating '\0'. If this size is greater than the max, set * the new length to be the maximum allowed. */ - if (max_len) - (*buf)->len = ((res + offset + 1) < max_len) ? (res + offset + 1) : max_len; - else - (*buf)->len = res + offset + 1; + if (max_len && max_len < need) + need = max_len; - if (!(*buf = ast_realloc(*buf, (*buf)->len + sizeof(*(*buf))))) + *buf = ast_realloc(*buf, need + sizeof(struct ast_dynamic_str)); + if (*buf == NULL) return AST_DYNSTR_BUILD_FAILED; + (*buf)->len = need; + /* Truncate the previous attempt. XXX this should be unconditional */ if (append) (*buf)->str[offset] = '\0'; |