как правильно оформить новую функцию в астериске
Добрый день може кто-нибудь подскажет как правильно оформить функцию замены строк в астериске. Ниже предоставлю код который надо встроить в астериск. Подскажите пожалуйста где я допустил ошибку. Астериск видит эту функцию но падает изза нее.
Функция которую я написал чтобы встроить в астериск:
// str_replace.h
// str_replace.h
#include <string.h>
#include <stdlib.h>
/*
mainStr - main string
searchStr - search string
subStr - sub string
*/
char *str_replace(const char* mainStr, const char* searchStr, const char* subStr) {
const int search_len = strlen(searchStr);
const int sub_len = strlen(subStr);
const char *p, *begin;
char *r, *result;
int count = 0;
for (p = mainStr; p = strstr(p, searchStr); p += search_len) ++count;
r = result = (char*)malloc(strlen(mainStr) + (sub_len - search_len) * count + 1);
begin = mainStr;
for (p = mainStr; p = strstr(begin, searchStr); begin = p + search_len) {
strncpy(r, begin, p - begin);
r += p - begin;
strcpy(r, subStr);
r += sub_len;
}
strcpy(r, begin);
return result;
}
/*
Sample:
#include <stdio.h>
#include "str_replace.h"
int main()
{
char ar[] = "123sss45sssss";
char* t;
t = str_replace(ar1,"s","-");
printf(t);
return 0;
}
// Result: 123---45-----
*/
А теперь эта эе функция но встроенная в астериск.
Изза acf_strreplace астериск падает. Подскажите пожалуйста кто разбирается где ниже я допустил ошибку!!!
// func_string.c
...
int acf_strreplace(struct ast_channel *chan, char *cmd, char *parse, char *buffer, size_t buflen)
{
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(mainStr);
AST_APP_ARG(searchStr);
AST_APP_ARG(subStr);
);
AST_STANDARD_APP_ARGS(args, parse);
const int search_len = strlen(args.searchStr);
const int sub_len = strlen(args.subStr);
const char *p, *begin;
char *r, *result;
int count = 0;
for (p = args.mainStr; p = strstr(p, args.searchStr); p += search_len) ++count;
r = result = (char*)ast_malloc(strlen(args.mainStr) + (sub_len - search_len) * count + 1);
begin = args.mainStr;
for (p = args.mainStr; p = strstr(begin, args.searchStr); begin = p + search_len) {
strncpy(r, begin, p - begin);
r += p - begin;
strcpy(r, args.subStr);
r += sub_len;
}
strcpy(r, begin);
//ast_log(LOG_DEBUG, "%d was the lucky number in range [%d,%d]\n",response_int, min_int, max_int);
ast_log(LOG_DEBUG, "Hello Debugger!!!\n");
//r = "Hello";
//result = "Hello Debugger!!!";
snprintf(buffer, buflen, "%s", result);
ast_free(result);
return 0;
}
static struct ast_custom_function strreplace_function = {
.name = "STRREPLACE",
.synopsis = "Sub string",
.syntax = "STRREPLACE(mainStr|searchStr|subStr)",
.desc = "Sub string",
.read = acf_strreplace,
};
...
|