]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
[mod_commands] Fix and improve coalesece function 1843/head
authoragree <ahrongreenberg@gmail.com>
Thu, 27 Oct 2022 16:19:39 +0000 (12:19 -0400)
committeragree <ahrongreenberg@gmail.com>
Tue, 21 Mar 2023 16:23:19 +0000 (12:23 -0400)
* fixed memory leak
* added custom delimeter support

src/mod/applications/mod_commands/mod_commands.c

index 8e737a78a2bda20aff32424154fb25faa9dbc14f..87741b8e590d1c5e6e2c62a7fdce5f36b2f5d9c7 100644 (file)
@@ -5653,22 +5653,26 @@ SWITCH_STANDARD_API(alias_function)
 #define COALESCE_SYNTAX "[^^<delim>]<value1>,<value2>,..."
 SWITCH_STANDARD_API(coalesce_function)
 {
-       switch_status_t status = SWITCH_STATUS_FALSE;
-       char *data = (char *) cmd;
        char *mydata = NULL, *argv[256] = { 0 };
+       char *arg = (char *) cmd;
        int argc = -1;
+       char delim = ',';
+
+       if (!zstr(arg) && *arg == '^' && *(arg+1) == '^') {
+               arg += 2;
+               delim = *arg++;
+       }
 
-       if (data && *data && (mydata = strdup(data))) {
-               argc = switch_separate_string(mydata, ',', argv,
+       if (!zstr(arg) && (mydata = strdup(arg))) {
+               argc = switch_separate_string(mydata, delim, argv,
                                (sizeof(argv) / sizeof(argv[0])));
        }
 
        if (argc > 0) {
                int i;
                for (i = 0; i < argc; i++) {
-                       if (argv[i] && *argv[i]) {
+                       if (!zstr(argv[i])) {
                                stream->write_function(stream, argv[i]);
-                               status = SWITCH_STATUS_SUCCESS;
                                break;
                        }
                }
@@ -5676,7 +5680,9 @@ SWITCH_STANDARD_API(coalesce_function)
                stream->write_function(stream, "-USAGE: %s\n", COALESCE_SYNTAX);
        }
 
-       return status;
+       switch_safe_free(mydata);
+
+       return SWITCH_STATUS_SUCCESS;
 }
 
 #define SHOW_SYNTAX "codec|endpoint|application|api|dialplan|file|timer|calls [count]|channels [count|like <match string>]|calls|detailed_calls|bridged_calls|detailed_bridged_calls|aliases|complete|chat|management|modules|nat_map|say|interfaces|interface_types|tasks|limits|status"