Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include "asterisk.h"
00035
00036 ASTERISK_FILE_VERSION(__FILE__, "$Revision: 247337 $")
00037
00038 #include "asterisk/strings.h"
00039 #include "asterisk/pbx.h"
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 #if (defined(MALLOC_DEBUG) && !defined(STANDALONE))
00052 int __ast_debug_str_helper(struct ast_str **buf, ssize_t max_len,
00053 int append, const char *fmt, va_list ap, const char *file, int lineno, const char *function)
00054 #else
00055 int __ast_str_helper(struct ast_str **buf, ssize_t max_len,
00056 int append, const char *fmt, va_list ap)
00057 #endif
00058 {
00059 int res, need;
00060 int offset = (append && (*buf)->__AST_STR_LEN) ? (*buf)->__AST_STR_USED : 0;
00061 va_list aq;
00062
00063 do {
00064 if (max_len < 0) {
00065 max_len = (*buf)->__AST_STR_LEN;
00066 }
00067
00068
00069
00070
00071 va_copy(aq, ap);
00072 res = vsnprintf((*buf)->__AST_STR_STR + offset, (*buf)->__AST_STR_LEN - offset, fmt, aq);
00073
00074 need = res + offset + 1;
00075
00076
00077
00078
00079 if (need > (*buf)->__AST_STR_LEN && (max_len == 0 || (*buf)->__AST_STR_LEN < max_len) ) {
00080 if (max_len && max_len < need) {
00081 need = max_len;
00082 } else if (max_len == 0) {
00083 need += 16 + need / 4;
00084 }
00085 if (0) {
00086 ast_verbose("extend from %d to %d\n", (int)(*buf)->__AST_STR_LEN, need);
00087 }
00088 if (
00089 #if (defined(MALLOC_DEBUG) && !defined(STANDALONE))
00090 _ast_str_make_space(buf, need, file, lineno, function)
00091 #else
00092 ast_str_make_space(buf, need)
00093 #endif
00094 ) {
00095 ast_verbose("failed to extend from %d to %d\n", (int)(*buf)->__AST_STR_LEN, need);
00096 va_end(aq);
00097 return AST_DYNSTR_BUILD_FAILED;
00098 }
00099 (*buf)->__AST_STR_STR[offset] = '\0';
00100
00101
00102 va_end(aq);
00103 continue;
00104 }
00105 va_end(aq);
00106 break;
00107 } while (1);
00108
00109 (*buf)->__AST_STR_USED = (res + offset > (*buf)->__AST_STR_LEN) ? (*buf)->__AST_STR_LEN - 1 : res + offset;
00110
00111 return res;
00112 }
00113
00114 void ast_str_substitute_variables(struct ast_str **buf, size_t maxlen, struct ast_channel *chan, const char *template)
00115 {
00116 int first = 1;
00117 do {
00118 ast_str_make_space(buf, maxlen ? maxlen :
00119 (first ? strlen(template) * 2 : (*buf)->__AST_STR_LEN * 2));
00120 pbx_substitute_variables_helper_full(chan, NULL, template, (*buf)->__AST_STR_STR, (*buf)->__AST_STR_LEN - 1, &((*buf)->__AST_STR_USED));
00121 first = 0;
00122 } while (maxlen == 0 && (*buf)->__AST_STR_LEN - 5 < (*buf)->__AST_STR_USED);
00123 }
00124
00125 char *__ast_str_helper2(struct ast_str **buf, ssize_t maxlen, const char *src, size_t maxsrc, int append, int escapecommas)
00126 {
00127 int dynamic = 0;
00128 char *ptr = append ? &((*buf)->__AST_STR_STR[(*buf)->__AST_STR_USED]) : (*buf)->__AST_STR_STR;
00129
00130 if (maxlen < 1) {
00131 if (maxlen == 0) {
00132 dynamic = 1;
00133 }
00134 maxlen = (*buf)->__AST_STR_LEN;
00135 }
00136
00137 while (*src && maxsrc && maxlen && (!escapecommas || (maxlen - 1))) {
00138 if (escapecommas && (*src == '\\' || *src == ',')) {
00139 *ptr++ = '\\';
00140 maxlen--;
00141 (*buf)->__AST_STR_USED++;
00142 }
00143 *ptr++ = *src++;
00144 maxsrc--;
00145 maxlen--;
00146 (*buf)->__AST_STR_USED++;
00147
00148 if ((ptr >= (*buf)->__AST_STR_STR + (*buf)->__AST_STR_LEN - 3) ||
00149 (dynamic && (!maxlen || (escapecommas && !(maxlen - 1))))) {
00150 char *oldbase = (*buf)->__AST_STR_STR;
00151 size_t old = (*buf)->__AST_STR_LEN;
00152 if (ast_str_make_space(buf, (*buf)->__AST_STR_LEN * 2)) {
00153
00154 break;
00155 }
00156
00157 maxlen = old;
00158
00159 ptr += (*buf)->__AST_STR_STR - oldbase;
00160 }
00161 }
00162 if (__builtin_expect(!maxlen, 0)) {
00163 ptr--;
00164 }
00165 *ptr = '\0';
00166 return (*buf)->__AST_STR_STR;
00167 }
00168