CUT function. More...
#include "asterisk.h"
#include "asterisk/file.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/module.h"
#include "asterisk/app.h"
Go to the source code of this file.
Data Structures | |
struct | sortable_keys |
Defines | |
#define | ERROR_NOARG (-1) |
#define | ERROR_NOMEM (-2) |
#define | ERROR_USAGE (-3) |
#define | MAXRESULT 1024 |
Functions | |
static void | __reg_module (void) |
static void | __unreg_module (void) |
static int | acf_cut_exec (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len) |
static int | acf_sort_exec (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len) |
static int | cut_internal (struct ast_channel *chan, char *data, char *buffer, size_t buflen) |
static int | load_module (void) |
static int | sort_internal (struct ast_channel *chan, char *data, char *buffer, size_t buflen) |
static int | sort_subroutine (const void *arg1, const void *arg2) |
static int | unload_module (void) |
Variables | |
static struct ast_module_info __MODULE_INFO_SECTION | __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Cut out information from a string" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, } |
struct ast_custom_function | acf_cut |
struct ast_custom_function | acf_sort |
static struct ast_module_info * | ast_module_info = &__mod_info |
CUT function.
Definition in file func_cut.c.
#define ERROR_NOARG (-1) |
Definition at line 99 of file func_cut.c.
Referenced by acf_cut_exec(), acf_sort_exec(), cut_internal(), and sort_internal().
#define ERROR_NOMEM (-2) |
Definition at line 100 of file func_cut.c.
Referenced by acf_cut_exec(), acf_sort_exec(), and cut_internal().
#define ERROR_USAGE (-3) |
Definition at line 101 of file func_cut.c.
Referenced by acf_cut_exec(), and cut_internal().
#define MAXRESULT 1024 |
Definition at line 81 of file func_cut.c.
Referenced by cut_internal().
static void __reg_module | ( | void | ) | [static] |
Definition at line 325 of file func_cut.c.
static void __unreg_module | ( | void | ) | [static] |
Definition at line 325 of file func_cut.c.
static int acf_cut_exec | ( | struct ast_channel * | chan, |
const char * | cmd, | ||
char * | data, | ||
char * | buf, | ||
size_t | len | ||
) | [static] |
Definition at line 271 of file func_cut.c.
References ast_log(), cut_internal(), ERROR_NOARG, ERROR_NOMEM, ERROR_USAGE, and LOG_ERROR.
{ int ret = -1; switch (cut_internal(chan, data, buf, len)) { case ERROR_NOARG: ast_log(LOG_ERROR, "Syntax: CUT(<varname>,<char-delim>,<range-spec>) - missing argument!\n"); break; case ERROR_NOMEM: ast_log(LOG_ERROR, "Out of memory\n"); break; case ERROR_USAGE: ast_log(LOG_ERROR, "Usage: CUT(<varname>,<char-delim>,<range-spec>)\n"); break; case 0: ret = 0; break; default: ast_log(LOG_ERROR, "Unknown internal error\n"); } return ret; }
static int acf_sort_exec | ( | struct ast_channel * | chan, |
const char * | cmd, | ||
char * | data, | ||
char * | buf, | ||
size_t | len | ||
) | [static] |
Definition at line 250 of file func_cut.c.
References ast_log(), ERROR_NOARG, ERROR_NOMEM, LOG_ERROR, and sort_internal().
{ int ret = -1; switch (sort_internal(chan, data, buf, len)) { case ERROR_NOARG: ast_log(LOG_ERROR, "SORT() requires an argument\n"); break; case ERROR_NOMEM: ast_log(LOG_ERROR, "Out of memory\n"); break; case 0: ret = 0; break; default: ast_log(LOG_ERROR, "Unknown internal error\n"); } return ret; }
static int cut_internal | ( | struct ast_channel * | chan, |
char * | data, | ||
char * | buffer, | ||
size_t | buflen | ||
) | [static] |
Definition at line 154 of file func_cut.c.
References AST_APP_ARG, ast_copy_string(), AST_DECLARE_APP_ARGS, ast_get_encoded_char(), ast_log(), AST_STANDARD_APP_ARGS, ast_strdupa, ERROR_NOARG, ERROR_NOMEM, ERROR_USAGE, LOG_WARNING, MAXRESULT, parse(), pbx_substitute_variables_helper(), and strsep().
Referenced by acf_cut_exec().
{ char *parse; size_t delim_consumed; AST_DECLARE_APP_ARGS(args, AST_APP_ARG(varname); AST_APP_ARG(delimiter); AST_APP_ARG(field); ); *buffer = '\0'; parse = ast_strdupa(data); AST_STANDARD_APP_ARGS(args, parse); /* Check and parse arguments */ if (args.argc < 3) { return ERROR_NOARG; } else { char d, ds[2] = ""; char *tmp = alloca(strlen(args.varname) + 4); char varvalue[MAXRESULT], *tmp2=varvalue; if (tmp) { snprintf(tmp, strlen(args.varname) + 4, "${%s}", args.varname); } else { return ERROR_NOMEM; } if (ast_get_encoded_char(args.delimiter, ds, &delim_consumed)) ast_copy_string(ds, "-", sizeof(ds)); /* String form of the delimiter, for use with strsep(3) */ d = *ds; pbx_substitute_variables_helper(chan, tmp, tmp2, MAXRESULT - 1); if (tmp2) { int curfieldnum = 1, firstfield = 1; while (tmp2 != NULL && args.field != NULL) { char *nextgroup = strsep(&(args.field), "&"); int num1 = 0, num2 = MAXRESULT; char trashchar; if (sscanf(nextgroup, "%30d-%30d", &num1, &num2) == 2) { /* range with both start and end */ } else if (sscanf(nextgroup, "-%30d", &num2) == 1) { /* range with end */ num1 = 0; } else if ((sscanf(nextgroup, "%30d%1c", &num1, &trashchar) == 2) && (trashchar == '-')) { /* range with start */ num2 = MAXRESULT; } else if (sscanf(nextgroup, "%30d", &num1) == 1) { /* single number */ num2 = num1; } else { return ERROR_USAGE; } /* Get to start, if any */ if (num1 > 0) { while (tmp2 != (char *)NULL + 1 && curfieldnum < num1) { tmp2 = strchr(tmp2, d) + 1; curfieldnum++; } } /* Most frequent problem is the expectation of reordering fields */ if ((num1 > 0) && (curfieldnum > num1)) ast_log(LOG_WARNING, "We're already past the field you wanted?\n"); /* Re-null tmp2 if we added 1 to NULL */ if (tmp2 == (char *)NULL + 1) tmp2 = NULL; /* Output fields until we either run out of fields or num2 is reached */ while (tmp2 != NULL && curfieldnum <= num2) { char *tmp3 = strsep(&tmp2, ds); int curlen = strlen(buffer); if (firstfield) { snprintf(buffer, buflen, "%s", tmp3); firstfield = 0; } else { snprintf(buffer + curlen, buflen - curlen, "%c%s", d, tmp3); } curfieldnum++; } } } } return 0; }
static int load_module | ( | void | ) | [static] |
Definition at line 315 of file func_cut.c.
References ast_custom_function_register.
{ int res = 0; res |= ast_custom_function_register(&acf_cut); res |= ast_custom_function_register(&acf_sort); return res; }
static int sort_internal | ( | struct ast_channel * | chan, |
char * | data, | ||
char * | buffer, | ||
size_t | buflen | ||
) | [static] |
Definition at line 103 of file func_cut.c.
References ast_strdupa, ERROR_NOARG, sortable_keys::key, sort_subroutine(), strsep(), and sortable_keys::value.
Referenced by acf_sort_exec().
{ char *strings, *ptrkey, *ptrvalue; int count=1, count2, element_count=0; struct sortable_keys *sortable_keys; *buffer = '\0'; if (!data) return ERROR_NOARG; strings = ast_strdupa(data); for (ptrkey = strings; *ptrkey; ptrkey++) { if (*ptrkey == ',') count++; } sortable_keys = alloca(count * sizeof(struct sortable_keys)); memset(sortable_keys, 0, count * sizeof(struct sortable_keys)); /* Parse each into a struct */ count2 = 0; while ((ptrkey = strsep(&strings, ","))) { ptrvalue = strchr(ptrkey, ':'); if (!ptrvalue) { count--; continue; } *ptrvalue++ = '\0'; sortable_keys[count2].key = ptrkey; sscanf(ptrvalue, "%30f", &sortable_keys[count2].value); count2++; } /* Sort the structs */ qsort(sortable_keys, count, sizeof(struct sortable_keys), sort_subroutine); for (count2 = 0; count2 < count; count2++) { int blen = strlen(buffer); if (element_count++) { strncat(buffer + blen, ",", buflen - blen - 1); blen++; } strncat(buffer + blen, sortable_keys[count2].key, buflen - blen - 1); } return 0; }
static int sort_subroutine | ( | const void * | arg1, |
const void * | arg2 | ||
) | [static] |
Definition at line 88 of file func_cut.c.
References sortable_keys::value.
Referenced by sort_internal().
{ const struct sortable_keys *one=arg1, *two=arg2; if (one->value < two->value) return -1; else if (one->value == two->value) return 0; else return 1; }
static int unload_module | ( | void | ) | [static] |
Definition at line 305 of file func_cut.c.
References ast_custom_function_unregister().
{ int res = 0; res |= ast_custom_function_unregister(&acf_cut); res |= ast_custom_function_unregister(&acf_sort); return res; }
struct ast_module_info __MODULE_INFO_SECTION __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Cut out information from a string" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, } [static] |
Definition at line 325 of file func_cut.c.
struct ast_custom_function acf_cut |
{ .name = "CUT", .read = acf_cut_exec, }
Definition at line 300 of file func_cut.c.
struct ast_custom_function acf_sort |
{ .name = "SORT", .read = acf_sort_exec, }
Definition at line 295 of file func_cut.c.
struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 325 of file func_cut.c.