}
+#define resize(l) {\
+char *dp;\
+olen += (len + l + block);\
+cpos = c - data;\
+if ((dp = realloc(data, olen))) {\
+ data = dp;\
+ c = data + cpos;\
+ memset(c, 0, olen - cpos);\
+ }} \
+
SWITCH_DECLARE(char *) switch_channel_expand_variables(switch_channel_t *channel, char *in)
{
char *p, *c;
if (*p == '$') {
vtype = 1;
+ if (*(p+1) != '{') {
+ vtype = 2;
+ }
}
- if (*(p+1) != '{') {
- vtype = 2;
- }
-
+
if (vtype) {
char *s = p, *e, *vname, *vval = NULL;
size_t nlen;
+
s++;
+
if (vtype == 1 && *s == '{') {
br = 1;
s++;
}
if ((nlen = sub_val ? strlen(sub_val) : 0)) {
if (len + nlen >= olen) {
- char *dp;
- olen += (len + nlen + block);
- cpos = c - data;
- if ((dp = realloc(data, olen))) {
- data = dp;
- c = data + cpos;
- memset(c, 0, olen - cpos);
- }
+ resize(nlen);
}
len += nlen;
strcat(c, sub_val);
c += nlen;
-
}
switch_safe_free(func_val);
+ sub_val = NULL;
+ vname = NULL;
+ vtype = 0;
}
+ if (len + 1 >= olen) {
+ resize(1);
+ }
+
if (sp) {
*c++ = ' ';
sp = 0;